diff --git a/Core/Inc/yunhorn_sts_prd_conf.h b/Core/Inc/yunhorn_sts_prd_conf.h index a46efdd..cbb6c7e 100644 --- a/Core/Inc/yunhorn_sts_prd_conf.h +++ b/Core/Inc/yunhorn_sts_prd_conf.h @@ -256,9 +256,9 @@ -#define MajorVer 23U -#define MinorVer 12U -#define SubMinorVer 13U +#define MajorVer 24U +#define MinorVer 01U +#define SubMinorVer 10U #define FirmwareVersion 3U #define YUNHORN_STS_MAX_NVM_CFG_SIZE 64U #define YUNHORN_STS_AC_CODE_SIZE 20U diff --git a/Core/Inc/yunhorn_sts_sensors.h b/Core/Inc/yunhorn_sts_sensors.h index 34cce29..e06b2f7 100644 --- a/Core/Inc/yunhorn_sts_sensors.h +++ b/Core/Inc/yunhorn_sts_sensors.h @@ -244,8 +244,10 @@ typedef struct #if defined(YUNHORN_STS_M1A_ENABLED) typedef struct { + uint8_t thermalDetectTag; /* 0x01 water detect, 0x02 human detect */ uint16_t waterSpillCount; /* count of water spillage */ uint16_t humanSpotCount; /* count of human body spot */ + uint8_t detectedEvent; /* detected Event, 1: true, 0:false */ float averageTemp; /* 0-120 C */ float maxTemp; /* 0-120 C */ float minTemp; /* 0-120 C */ diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index 46de03d..6f45510 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -881,30 +881,33 @@ static void SendTxData(void) // AppData.Buffer[i++] = (uint8_t)(r0_data.battery_mV)&0xff; //#13 #endif #ifdef STS_TMG - AppData.Buffer[i++] = (uint8_t)(14)&0xff; //#length of following bytes + AppData.Buffer[i++] = (uint8_t)(17)&0xff; //#length of following bytes APP_LOG(TS_OFF, VLEVEL_L, "\r\n------------- SPOT_CNT =%d \r\n", (m1a_data.spot_cnt)); - AppData.Buffer[i++] = (uint8_t)(m1a_data.spot_cnt)&0xff; //#01 - AppData.Buffer[i++] = (uint8_t)(m1a_data.spillage_level)&0xff; //#02 + AppData.Buffer[i++] = (uint8_t)(m1a_data.thermalDetectTag)&0xff; //#01 + AppData.Buffer[i++] = (uint8_t)(m1a_data.detectedEvent)&0xff; //#02 + AppData.Buffer[i++] = (uint8_t)(m1a_data.spot_cnt)&0xff; //#03 + AppData.Buffer[i++] = (uint8_t)(m1a_data.spillage_level)&0xff; //#04 + AppData.Buffer[i++] = (uint8_t)(m1a_data.humanSpot_level)&0xff; //#05 - AppData.Buffer[i++] = (uint8_t)(m1a_data.order[0])&0xff; //#03 non zero value is valid - AppData.Buffer[i++] = (uint8_t)(m1a_data.order[1])&0xff; //#04 - AppData.Buffer[i++] = (uint8_t)(m1a_data.order[2])&0xff; //#05 - AppData.Buffer[i++] = (uint8_t)(m1a_data.order[3])&0xff; //#06 + AppData.Buffer[i++] = (uint8_t)(m1a_data.order[0])&0xff; //#06 non zero value is valid + AppData.Buffer[i++] = (uint8_t)(m1a_data.order[1])&0xff; //#07 + AppData.Buffer[i++] = (uint8_t)(m1a_data.order[2])&0xff; //#08 + AppData.Buffer[i++] = (uint8_t)(m1a_data.order[3])&0xff; //#09 - AppData.Buffer[i++] = (uint8_t)((int)m1a_data.minTemp)&0xff; //#7 - AppData.Buffer[i++] = (uint8_t)(((int)(m1a_data.minTemp*100))%100)&0xff; //#8 + AppData.Buffer[i++] = (uint8_t)((int)m1a_data.minTemp)&0xff; //#10 + AppData.Buffer[i++] = (uint8_t)(((int)(m1a_data.minTemp*100))%100)&0xff; //#11 - AppData.Buffer[i++] = (uint8_t)((int)m1a_data.averageTemp)&0xff; //#9 - AppData.Buffer[i++] = (uint8_t)(((int)(m1a_data.averageTemp*100))%100)&0xff; //#10 + AppData.Buffer[i++] = (uint8_t)((int)m1a_data.averageTemp)&0xff; //#12 + AppData.Buffer[i++] = (uint8_t)(((int)(m1a_data.averageTemp*100))%100)&0xff; //#13 - AppData.Buffer[i++] = (uint8_t)((int)m1a_data.maxTemp)&0xff; //#11 - AppData.Buffer[i++] = (uint8_t)(((int)(m1a_data.maxTemp*100))%100)&0xff; //#12 + AppData.Buffer[i++] = (uint8_t)((int)m1a_data.maxTemp)&0xff; //#14 + AppData.Buffer[i++] = (uint8_t)(((int)(m1a_data.maxTemp*100))%100)&0xff; //#15 - AppData.Buffer[i++] = (uint8_t)((int)m1a_data.centerTemp)&0xff; //#13 - AppData.Buffer[i++] = (uint8_t)(((int)(m1a_data.centerTemp*100))%100)&0xff; //#14 + AppData.Buffer[i++] = (uint8_t)((int)m1a_data.centerTemp)&0xff; //#16 + AppData.Buffer[i++] = (uint8_t)(((int)(m1a_data.centerTemp*100))%100)&0xff; //#17 #endif diff --git a/mlx90640/mlx90640_lcd_display.c b/mlx90640/mlx90640_lcd_display.c index 6b8ac06..6bb0dbc 100644 --- a/mlx90640/mlx90640_lcd_display.c +++ b/mlx90640/mlx90640_lcd_display.c @@ -198,7 +198,7 @@ static void sortFocusAreas(void) { float temp1=0.0; - if (maxTemp > humanTempThreshold) + if ((maxTemp > humanTempThreshold)&&(thermalDetectTag==WATER_DETECT)) { blackOutTag =1; } else @@ -242,9 +242,11 @@ static void sortFocusAreas(void) void STS_M1A_SENSOR_Read(STS_M1A_SensorDataTypeDef *m1a_data) { + m1a_data->thermalDetectTag = thermalDetectTag; m1a_data->waterSpillCount = blackOutTag==0?waterSpillCount:0; m1a_data->humanSpotCount = humanSpotCount; + m1a_data->humanSpot_level = (uint8_t)((m1a_data->humanSpotCount)*99/768.0); m1a_data->spillage_level = (uint8_t)((m1a_data->waterSpillCount)*99/768.0); //((ROW-2)*(COL-2))); // (24-4) * (32 -4) minus edge dots m1a_data->averageTemp = averageTemp; @@ -257,6 +259,9 @@ void STS_M1A_SENSOR_Read(STS_M1A_SensorDataTypeDef *m1a_data) spot_cnt = max(v_water_cnt, h_water_cnt); m1a_data->spot_cnt = blackOutTag ==0? spot_cnt:0; //max(v_water_cnt, h_water_cnt); + // TODO XXXX for fall detection logic + m1a_data->detectedEvent = (m1a_data->spot_cnt>0)? 1:0; //fall detection or water spillage detection result + uint8_t i=0; if ((spot_cnt != 0) && (blackOutTag == 0)) { bubbleSort((void *)upMask, 80, (void *)order); @@ -276,20 +281,34 @@ void STS_M1A_SENSOR_Read(STS_M1A_SensorDataTypeDef *m1a_data) memcpy((void *)m1a_data->order, (const void *)order, sizeof(order)); memset(tempBuffer,0x0,sizeof(tempBuffer)); - - sprintf(tempBuffer,(char *)"\r\n## Blackout=%u ######\n##Read Sensor Spot CNT=%4d (areas), \r\n Env_Temp =%2.2f C \r\n## V_cnt=%2d (lane) H_cnt=%2d (lane)\r\n## Spillage Level =%u %% \r\n## averageTempInner=%02.2f C averageTemp=%02.2f C, centerTemp=%2.2f C MinTemp=%2.2f C maxTemp=%2.2f C \r\n", - (uint8_t)blackOutTag, (uint16_t)(m1a_data->waterSpillCount), (float)env_temperature, (int)v_water_cnt, (int)h_water_cnt, (uint8_t)(m1a_data->spillage_level), (float)averageTempInner, (float)averageTemp, (float)centerTemp, (float)minTemp, (float)maxTemp); - APP_LOG(TS_OFF, VLEVEL_H,(char *)tempBuffer); - sprintf(tempBuffer,(char *)"\r\n######## Gap_Average= %2.2f C Gap_Inner =%2.2f C\r\n",(float)(averageTemp - minTemp),(float)(averageTempInner - minTemp)); - APP_LOG(TS_OFF, VLEVEL_H,(char *)tempBuffer); - - if ((m1a_data->spot_cnt !=0 ) && (blackOutTag == 0)) + if (thermalDetectTag == WATER_DETECT) { - for (uint8_t i=0; i< 4; i++) { - memset(tempBuffer,0x0,sizeof(tempBuffer)); - sprintf(tempBuffer, (char *) " Top {%2u} : order =%2u X=%2u : Y=%2u \r\n", (uint8_t)i, (int)(order[i]), - (int)(order[i]%(10)), (int)(order[i]/10)); - APP_LOG(TS_OFF, VLEVEL_H,(char *)tempBuffer); + sprintf(tempBuffer,(char *)"\r\n## Blackout=%u ######\n##Read Sensor Spot CNT=%4d (areas), \r\n Env_Temp =%2.2f C \r\n## V_cnt=%2d (lane) H_cnt=%2d (lane)\r\n## Spillage Level =%u %% \r\n## averageTempInner=%02.2f C averageTemp=%02.2f C, centerTemp=%2.2f C MinTemp=%2.2f C maxTemp=%2.2f C \r\n", + (uint8_t)blackOutTag, (uint16_t)(m1a_data->waterSpillCount), (float)env_temperature, (int)v_water_cnt, (int)h_water_cnt, (uint8_t)(m1a_data->spillage_level), (float)averageTempInner, (float)averageTemp, (float)centerTemp, (float)minTemp, (float)maxTemp); + + } else if (thermalDetectTag == HUMAN_DETECT) + { + sprintf(tempBuffer,(char *)"\r\n######Read Sensor Spot CNT=%4d (areas), \r\n Env_Temp =%2.2f C \r\n## V_cnt=%2d (lane) H_cnt=%2d (lane)\r\n## Spillage Level =%u %% \r\n## averageTempInner=%02.2f C averageTemp=%02.2f C, centerTemp=%2.2f C MinTemp=%2.2f C maxTemp=%2.2f C \r\n", + (uint16_t)(m1a_data->humanSpotCount), (float)env_temperature, (int)v_water_cnt, (int)h_water_cnt, (uint8_t)(m1a_data->humanSpot_level), (float)averageTempInner, (float)averageTemp, (float)centerTemp, (float)minTemp, (float)maxTemp); + + } + + APP_LOG(TS_OFF, VLEVEL_H,(char *)tempBuffer); + + sprintf(tempBuffer,(char *)"\r\n######## Gap_Average= %2.2f C Gap_Inner =%2.2f C\r\n ##### Thermal Detect Tag =%s \r\n Human Body Threshold=%2.2f C WaterThreshold=%2.2f C\r\n",(float)(averageTemp - minTemp),(float)(averageTempInner - minTemp), ((thermalDetectTag == WATER_DETECT)? "Water Detect":"Human Detect"), (float)humanTempThreshold, (float)(waterTempThreshold/10)); + APP_LOG(TS_OFF, VLEVEL_H,(char *)tempBuffer); + + if ((m1a_data->spot_cnt !=0 )) + { + if ((blackOutTag == 0) || (thermalDetectTag == HUMAN_DETECT)) + { + for (uint8_t i=0; i< 4; i++) + { + memset(tempBuffer,0x0,sizeof(tempBuffer)); + sprintf(tempBuffer, (char *) " Top {%2u} : order =%2u X=%2u : Y=%2u \r\n", (uint8_t)i, (int)(order[i]), + (int)(order[i]%(10)), (int)(order[i]/10)); + APP_LOG(TS_OFF, VLEVEL_H,(char *)tempBuffer); + } } } @@ -324,9 +343,12 @@ void mlx90640_display_process(void) spot_cnt /= DetectCycleCount ; //max(v_water_cnt, h_water_cnt); - if (blackOutTag == 0) + if ((blackOutTag == 0)&& (thermalDetectTag == WATER_DETECT)) { APP_LOG(TS_OFF, VLEVEL_H, "Water Spill Detected Level = %u of 768 \r\n", (uint16_t)waterSpillCount); + } + else if (thermalDetectTag == HUMAN_DETECT) + { APP_LOG(TS_OFF, VLEVEL_H, "Human Spot Detected Level = %u of 768 \r\n", (uint16_t)humanSpotCount); } }