Implement handling for Power LED and big LED

This commit is contained in:
Joe Tretter
2023-11-01 11:57:02 -05:00
parent 57d362a1fe
commit 008cd645cc

View File

@@ -3,14 +3,20 @@
#include <WiFi.h> #include <WiFi.h>
// GPIOs // GPIOs
#define GPIO_EMERGENCY_LED 5 #define GPIO_EMERGENCY_LED_SMALL 5
#define GPIO_EMERGENCY_LED_RED 13
#define GPIO_EMERGENCY_LED_GREEN 12
#define GPIO_EMERGENCY_LED_BLUE 14
#define GPIO_POWER_LED 18
#define GPIO_SYNC_LED 19 #define GPIO_SYNC_LED 19
#define GPIO_REQUESTED_STATE_LED 2 #define GPIO_REQUESTED_STATE_LED 2
#define GPIO_EMERGENCY_BUTTON 16 #define GPIO_EMERGENCY_BUTTON 16
// Software Parameters // Software Parameters
#define LOOP_DELAY 1 #define LOOP_DELAY 1
#define PING_TIMEOUT_NUM_LOOPS 2 #define PING_TIMEOUT_NUM_LOOPS 3
#define EMERGENCY_BUTTON_SCAN_RATE_SECONDS 1 #define EMERGENCY_BUTTON_SCAN_RATE_SECONDS 1
String macList[2] = {"24:6F:28:B1:EE:74", "24:6F:28:B2:40:8C"}; String macList[2] = {"24:6F:28:B1:EE:74", "24:6F:28:B2:40:8C"};
@@ -19,8 +25,9 @@ uint8_t macRemoteIntArr[6];
esp_now_peer_info_t peerInfo={}; esp_now_peer_info_t peerInfo={};
int64_t lastPingUptimeInSeconds; int64_t lastPingUptimeInSeconds;
volatile int64_t lastButtonPushUptimeInSeconds; volatile int64_t lastButtonPushUptimeInSeconds;
boolean isReceiverEmergencyLedOn; volatile boolean isReceiverEmergencyLedOn;
volatile boolean isSenderEmergency; volatile boolean isSenderEmergency;
TaskHandle_t BigLEDTask;
typedef struct struct_info { typedef struct struct_info {
boolean isEmergency; boolean isEmergency;
@@ -29,7 +36,6 @@ typedef struct struct_info {
} struct_info; } struct_info;
struct_info myData; struct_info myData;
int64_t getUptimeInSeconds(){ int64_t getUptimeInSeconds(){
return esp_timer_get_time()/1000000; return esp_timer_get_time()/1000000;
} }
@@ -53,10 +59,10 @@ void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
} }
if(myData.isEmergency) { if(myData.isEmergency) {
digitalWrite(GPIO_EMERGENCY_LED,HIGH); digitalWrite(GPIO_EMERGENCY_LED_SMALL,HIGH);
isReceiverEmergencyLedOn=true; isReceiverEmergencyLedOn=true;
} else { } else {
digitalWrite(GPIO_EMERGENCY_LED,LOW); digitalWrite(GPIO_EMERGENCY_LED_SMALL,LOW);
isReceiverEmergencyLedOn=false; isReceiverEmergencyLedOn=false;
} }
} }
@@ -71,6 +77,7 @@ void OnButtonPushed(){
} }
} }
// Convert single hex char to integer
int char2int(char input) int char2int(char input)
{ {
if(input >= '0' && input <= '9') if(input >= '0' && input <= '9')
@@ -93,9 +100,79 @@ void hex2bin(const char* src, uint8_t* target)
} }
} }
// the big LED should flash when we are in emergency state.
void BigLEDTaskCode(void * parameter){
// Test the channels of the big LED
digitalWrite(GPIO_EMERGENCY_LED_GREEN,LOW);
digitalWrite(GPIO_EMERGENCY_LED_BLUE,LOW);
digitalWrite(GPIO_EMERGENCY_LED_RED,HIGH);
sleep(1);
digitalWrite(GPIO_EMERGENCY_LED_RED,LOW);
digitalWrite(GPIO_EMERGENCY_LED_GREEN,HIGH);
sleep(1);
digitalWrite(GPIO_EMERGENCY_LED_GREEN,LOW);
digitalWrite(GPIO_EMERGENCY_LED_BLUE,HIGH);
sleep(1);
digitalWrite(GPIO_EMERGENCY_LED_BLUE,LOW);
// Blink in emergecy mode.
for(;;){
if (isReceiverEmergencyLedOn){
digitalWrite(GPIO_EMERGENCY_LED_BLUE,HIGH);
delay(100);
digitalWrite(GPIO_EMERGENCY_LED_BLUE,LOW);
delay(250);
digitalWrite(GPIO_EMERGENCY_LED_RED,HIGH);
delay(100);
digitalWrite(GPIO_EMERGENCY_LED_RED,LOW);
delay(500);
}
}
}
void setPowerLEDBrightness(int brightnessValue){
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
ledcSetup(ledChannel, freq, resolution);
ledcAttachPin(GPIO_POWER_LED, ledChannel);
ledcWrite(ledChannel, brightnessValue);
}
void setup(){ void setup(){
// GPIO Setup
pinMode(GPIO_POWER_LED,OUTPUT);
pinMode(GPIO_EMERGENCY_LED_RED,OUTPUT);
pinMode(GPIO_EMERGENCY_LED_GREEN,OUTPUT);
pinMode(GPIO_EMERGENCY_LED_BLUE,OUTPUT);
pinMode(GPIO_EMERGENCY_LED_SMALL, OUTPUT);
pinMode(GPIO_REQUESTED_STATE_LED, OUTPUT);
pinMode(GPIO_SYNC_LED,OUTPUT);
pinMode(GPIO_EMERGENCY_BUTTON,INPUT_PULLDOWN);
// Initialize state
digitalWrite(GPIO_POWER_LED,HIGH); //Power LED ON
digitalWrite(GPIO_REQUESTED_STATE_LED,LOW);
digitalWrite(GPIO_EMERGENCY_LED_SMALL,LOW);
digitalWrite(GPIO_SYNC_LED,LOW);
myData.isPing=1;
myData.macOfSender="";
isReceiverEmergencyLedOn=false;
myData.isEmergency=false;
isSenderEmergency=false;
lastButtonPushUptimeInSeconds=getUptimeInSeconds();
// The button triggers an interrupt, attach callback function
attachInterrupt(GPIO_EMERGENCY_BUTTON, OnButtonPushed, RISING);
sleep(LOOP_DELAY); // give the serial monitor a moment to connect. sleep(LOOP_DELAY); // give the serial monitor a moment to connect.
Serial.begin(115200); Serial.begin(115200);
WiFi.mode(WIFI_MODE_STA); WiFi.mode(WIFI_MODE_STA);
macLocal=WiFi.macAddress(); macLocal=WiFi.macAddress();
macRemote=macList[macList[0]==macLocal?1:0]; macRemote=macList[macList[0]==macLocal?1:0];
@@ -116,18 +193,7 @@ void setup(){
macRemoteNoColon.replace(":",""); macRemoteNoColon.replace(":","");
char macRemoteNoColonCharArr[13]; char macRemoteNoColonCharArr[13];
macRemoteNoColon.toCharArray(macRemoteNoColonCharArr,sizeof(macRemoteNoColonCharArr)); macRemoteNoColon.toCharArray(macRemoteNoColonCharArr,sizeof(macRemoteNoColonCharArr));
for (int i=0;i<12;i++){
Serial.print( macRemoteNoColonCharArr[i]);
Serial.print(".");
}
Serial.println("<--- HEX CA");
hex2bin(macRemoteNoColonCharArr,macRemoteIntArr); hex2bin(macRemoteNoColonCharArr,macRemoteIntArr);
for (int i=0;i<6;i++){
Serial.printf( "%d|%X - ",macRemoteIntArr[i],macRemoteIntArr[i]);
}
Serial.println("<--- DEC REM");
memcpy(peerInfo.peer_addr, macRemoteIntArr, 6); memcpy(peerInfo.peer_addr, macRemoteIntArr, 6);
peerInfo.channel = 0; peerInfo.channel = 0;
peerInfo.encrypt = false; peerInfo.encrypt = false;
@@ -142,23 +208,8 @@ void setup(){
// Register for a callback function that will be called when data is received // Register for a callback function that will be called when data is received
esp_now_register_recv_cb(OnDataRecv); esp_now_register_recv_cb(OnDataRecv);
pinMode(GPIO_EMERGENCY_LED, OUTPUT); // The BIG LED blinking is running in it's own task
pinMode(GPIO_REQUESTED_STATE_LED, OUTPUT); xTaskCreatePinnedToCore(BigLEDTaskCode,"BigLEDHandler",10000,NULL,0,&BigLEDTask,0);
digitalWrite(GPIO_REQUESTED_STATE_LED,LOW);
digitalWrite(GPIO_EMERGENCY_LED,LOW);
pinMode(GPIO_SYNC_LED,OUTPUT);
digitalWrite(GPIO_SYNC_LED,LOW);
pinMode(GPIO_EMERGENCY_BUTTON,INPUT_PULLDOWN);
attachInterrupt(GPIO_EMERGENCY_BUTTON, OnButtonPushed, RISING);
myData.isPing=1;
myData.macOfSender="";
isReceiverEmergencyLedOn=false;
myData.isEmergency=false;
isSenderEmergency=false;
lastButtonPushUptimeInSeconds=getUptimeInSeconds();
} }
void loop(){ void loop(){
@@ -184,12 +235,16 @@ void loop(){
Serial.println(myData.isEmergency?"EMERGENGY ON":"EMERGENCY OFF"); Serial.println(myData.isEmergency?"EMERGENGY ON":"EMERGENCY OFF");
Serial.println((isSenderEmergency==1)?"SEN EMERG ON":"SEN EMERG OFF"); Serial.println((isSenderEmergency==1)?"SEN EMERG ON":"SEN EMERG OFF");
digitalWrite(GPIO_SYNC_LED,LOW); // Control the SYNC-LED, if we didn't receive a ping for too long, the LED is switched off
if ((getUptimeInSeconds()-lastPingUptimeInSeconds) < (LOOP_DELAY*PING_TIMEOUT_NUM_LOOPS)) { if ((getUptimeInSeconds()-lastPingUptimeInSeconds) < (LOOP_DELAY*PING_TIMEOUT_NUM_LOOPS)) {
delay(3);
digitalWrite(GPIO_SYNC_LED,HIGH); digitalWrite(GPIO_SYNC_LED,HIGH);
} else {
digitalWrite(GPIO_SYNC_LED,LOW);
} }
// To indicate the device hasn't crashed we vary the brightess of the power LED
setPowerLEDBrightness((getUptimeInSeconds()%5*20)+50);
switch (result) { switch (result) {
case ESP_OK: case ESP_OK:
Serial.println("[" +macLocal+ "] Sent with success"); Serial.println("[" +macLocal+ "] Sent with success");