From 47579e3790b1ee5a1ad2ce35ea6028cd9ddf6ea0 Mon Sep 17 00:00:00 2001
From: GuoWenxue <“guowenxue@gmail.com”>
Date: Fri, 29 Apr 2022 09:23:27 +0800
Subject: [PATCH] update client_main.c to use packet_segmented_pack

---
 mqttd/hal/hal.c |  131 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 125 insertions(+), 6 deletions(-)

diff --git a/mqttd/hal/hal.c b/mqttd/hal/hal.c
index 88decad..527d6f9 100644
--- a/mqttd/hal/hal.c
+++ b/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 );
+    }
+}
+
+

--
Gitblit v1.9.1