/********************************************************************************* * Copyright: (C) 2019 LingYun IoT System Studio * All rights reserved. * * Filename: hal.c * Description: This file is HAL(Hardware Abstract Layer) initial functions * * Version: 1.0.0(2019年06月24日) * Author: Guo Wenxue * ChangeLog: 1, Release initial version on "2019年06月24日 23时46分47秒" * ********************************************************************************/ #include "hal.h" /* LED_R LED_G LED_B */ static int led_pin[LED_MAX] = { 0,0,0 }; static int relay_pin = 0; static int beep_pin = 0; static int infrared_pin = 0; void init_relay(int pin); void init_led(int redpin, int greenpin, int bluepin); void init_beep(int pin); int hal_init(hwconf_t *hwconf) { if( !hwconf->enable ) { log_err("All hardware modules are disabled, skip initialise HAL.\n"); return 0; } wiringPiSetup(); if( hwconf->leds ) init_led(hwconf->red_pin, hwconf->green_pin, hwconf->blue_pin); if( hwconf->relay_pin ) init_relay(hwconf->relay_pin); if( hwconf->beep_pin ) init_beep(hwconf->beep_pin); if( hwconf->infrared_pin ) init_infrared(hwconf->infrared_pin); if( hwconf->sht2x && sht2x_init() < 0 ) { log_err("Initialise SHT20 T&H sensor failure\n"); return -1; } if( hwconf->lux && tsl2561_init() < 0 ) { log_err("Initialise TSL2561 Lux sensor failure\n"); return -1; } return 0; } void init_led(int redpin, int greenpin, int bluepin) { int i; led_pin[LED_R]=redpin; led_pin[LED_G]=greenpin; led_pin[LED_B]=bluepin; for(i=0; i=LED_MAX ) return -1; if( OFF == cmd ) { if(led_pin[which]) digitalWrite (led_pin[which], LOW); } else { if(led_pin[which]) digitalWrite (led_pin[which], HIGH); } return 0; } void init_relay(int pin) { relay_pin = pin; pinMode(relay_pin, OUTPUT); } void init_beep(int pin) { beep_pin = pin; /* TBD */ //pinMode(relay_pin, OUTPUT); } void turn_beep(int times) { /* TBD */ } /* wiringPi IRQ handler use a thread and can not pass argument, so we don't use interrupt */ void init_infrared(int pin) { infrared_pin = pin; pinMode(pin, INPUT); } /* jitter_time: cancel jitter interval time * Return value: 1(HIGH): Sombody detected 0(LOW): Nobody detected */ int infrared_detect(int jitter_time) { if( digitalRead(infrared_pin) ) { msleep(jitter_time); } return digitalRead(infrared_pin); } void turn_relay(int cmd) { if( OFF == cmd ) { digitalWrite ( relay_pin, LOW ); } else { digitalWrite ( relay_pin, HIGH ); } }