Guo Wenxue
2022-09-22 732d1963ed83abf4e5f1b06ec451a6943421d716
mqttd/hal/hal.c
@@ -13,16 +13,135 @@
#include "hal.h"
int hal_init(void)
                              /* 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)
{
    init_led();
    if( sht2x_init() < 0 )
    if( !hwconf->enable )
    {
        log_err("Initialise SHT20 failure\n");
        return -2;
        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; i++)
   {
        if(led_pin[i])
            pinMode(led_pin[i], OUTPUT );
   }
}
int turn_led(int which, int cmd)
{
   if( which<0 || which>=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 );
    }
}