/*********************************************************************************
|
* 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 <guowenxue@gmail.com>
|
* 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; 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 );
|
}
|
}
|