Improved plugin WS data dashbord, added data age counter.

When data is read it saves datastamp and calculetes diference between actual time and data read time.
Until one minute it counts age in seconds.
After one minute it starts blink and counts age per minute.
Tested with auriol_hg0601a.c protocol.
This commit is contained in:
LY2NEO 2022-12-03 22:55:35 +02:00
parent 7945afd1d2
commit 21e5b66bf6
14 changed files with 138 additions and 3 deletions

View file

@ -144,6 +144,13 @@ static void ws_protocol_acurite_592txr_remote_controller(WSBlockGeneric* instanc
instance->temp = ((float)(temp_raw)-1000) / 10.0f;
instance->btn = WS_NO_BTN;
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_acurite_592txr_feed(void* context, bool level, uint32_t duration) {

View file

@ -123,6 +123,13 @@ static void ws_protocol_acurite_606tx_remote_controller(WSBlockGeneric* instance
}
instance->btn = WS_NO_BTN;
instance->humidity = WS_NO_HUMIDITY;
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_acurite_606tx_feed(void* context, bool level, uint32_t duration) {

View file

@ -123,6 +123,13 @@ static void ws_protocol_acurite_609txc_remote_controller(WSBlockGeneric* instanc
instance->temp = (temp_raw >> 4) * 0.1f;
instance->humidity = (instance->data >> 8) & 0xff;
instance->btn = WS_NO_BTN;
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_acurite_609txc_feed(void* context, bool level, uint32_t duration) {

View file

@ -160,6 +160,13 @@ static void ws_protocol_ambient_weather_remote_controller(WSBlockGeneric* instan
ERROR;
}
*/
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_ambient_weather_feed(void* context, bool level, uint32_t duration) {

View file

@ -1,3 +1,6 @@
#include <furi.h>
#include <furi_hal.h>
#include "auriol_hg0601a.h"
#define TAG "WSProtocolAuriol_TH"
@ -133,6 +136,13 @@ static void ws_protocol_auriol_th_remote_controller(WSBlockGeneric* instance) {
}
instance->humidity = (instance->data >> 1) & 0x7F;
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_auriol_th_feed(void* context, bool level, uint32_t duration) {

View file

@ -135,6 +135,12 @@ static void ws_protocol_gt_wt_02_remote_controller(WSBlockGeneric* instance) {
instance->temp = (float)((~(instance->data >> 13) & 0x07FF) + 1) / -10.0f;
}
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
instance->humidity = (instance->data >> 6) & 0x7F;
if(instance->humidity <= 10) // actually the sensors sends 10 below working range of 20%
instance->humidity = 0;

View file

@ -179,6 +179,13 @@ static void ws_protocol_gt_wt_03_remote_controller(WSBlockGeneric* instance) {
} else {
instance->temp = (float)((~(instance->data >> 9) & 0x07FF) + 1) / -10.0f;
}
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_gt_wt_03_feed(void* context, bool level, uint32_t duration) {

View file

@ -148,6 +148,13 @@ static void ws_protocol_infactory_remote_controller(WSBlockGeneric* instance) {
instance->humidity =
(((instance->data >> 8) & 0x0F) * 10) + ((instance->data >> 4) & 0x0F); // BCD, 'A0'=100%rH
instance->channel = instance->data & 0x03;
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_infactory_feed(void* context, bool level, uint32_t duration) {

View file

@ -123,6 +123,13 @@ static void ws_protocol_lacrosse_tx141thbv2_remote_controller(WSBlockGeneric* in
instance->channel = ((instance->data >> 29) & 0x03) + 1;
instance->temp = ((float)((instance->data >> 17) & 0x0FFF) - 500.0f) / 10.0f;
instance->humidity = (instance->data >> 9) & 0xFF;
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_lacrosse_tx141thbv2_feed(void* context, bool level, uint32_t duration) {

View file

@ -135,6 +135,13 @@ static void ws_protocol_nexus_th_remote_controller(WSBlockGeneric* instance) {
}
instance->humidity = instance->data & 0xFF;
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_nexus_th_feed(void* context, bool level, uint32_t duration) {

View file

@ -132,6 +132,13 @@ static void ws_protocol_thermopro_tx4_remote_controller(WSBlockGeneric* instance
}
instance->humidity = (instance->data >> 1) & 0xFF;
//DATE AGE set
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
instance->agedata = curr_ts;
}
void ws_protocol_decoder_thermopro_tx4_feed(void* context, bool level, uint32_t duration) {

View file

@ -99,6 +99,12 @@ bool ws_block_generic_serialize(
break;
}
temp_data = instance->agedata;
if(!flipper_format_write_uint32(flipper_format, "Old", &temp_data, 1)) {
FURI_LOG_E(TAG, "Unable to add agedata");
break;
}
temp_data = instance->channel;
if(!flipper_format_write_uint32(flipper_format, "Ch", &temp_data, 1)) {
FURI_LOG_E(TAG, "Unable to add Channel");
@ -168,11 +174,17 @@ bool ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipp
}
instance->humidity = (uint8_t)temp_data;
if(!flipper_format_read_uint32(flipper_format, "Ch", (uint32_t*)&temp_data, 1)) {
FURI_LOG_E(TAG, "Missing Channel");
if(!flipper_format_read_uint32(flipper_format, "Old", (uint32_t*)&temp_data, 1)) {
FURI_LOG_E(TAG, "Missing agedata");
break;
}
instance->channel = (uint8_t)temp_data;
instance->agedata = (uint32_t)temp_data;
if(!flipper_format_read_uint32(flipper_format, "Ch", (uint32_t*)&temp_data, 1)) {
FURI_LOG_E(TAG, "Missing Channel");
break;
}
instance->channel = (uint8_t)temp_data;
if(!flipper_format_read_uint32(flipper_format, "Btn", (uint32_t*)&temp_data, 1)) {
FURI_LOG_E(TAG, "Missing Btn");

View file

@ -29,6 +29,7 @@ struct WSBlockGeneric {
uint8_t data_count_bit;
uint8_t battery_low;
uint8_t humidity;
uint32_t agedata;
uint8_t channel;
uint8_t btn;
float temp;

View file

@ -1,3 +1,5 @@
#include <furi.h>
#include <furi_hal.h>
#include "weather_station_receiver.h"
#include "../weather_station_app_i.h"
#include "weather_station_icons.h"
@ -70,6 +72,47 @@ void ws_view_receiver_info_draw(Canvas* canvas, WSReceiverInfoModel* model) {
snprintf(buffer, sizeof(buffer), "Data: 0x%llX", model->generic->data);
canvas_draw_str(canvas, 5, 32, buffer);
//DATA AGE
if((int) model->generic->agedata > 0){
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
int diffold = (int) curr_ts - (int) model->generic->agedata;
if(diffold>60){
int tmp_sec = diffold;
int cnt_min = 1;
for(int i=1; tmp_sec>60; i++){
tmp_sec = tmp_sec - 60;
cnt_min = i;
}
if ( curr_ts % 2 == 0){
canvas_set_color(canvas, ColorBlack);
canvas_draw_rframe(canvas, 97, 23, 26, 11, 1);
canvas_set_color(canvas, ColorBlack);
canvas_draw_str_aligned(canvas, 109, 29, AlignCenter, AlignCenter, "OLD");
}else{
canvas_set_color(canvas, ColorBlack);
canvas_draw_rframe(canvas, 97, 23, 26, 11, 1);
canvas_draw_box(canvas, 97, 23, 26, 11);
canvas_set_color(canvas, ColorWhite);
snprintf(buffer, sizeof(buffer), "%dm", cnt_min);
canvas_draw_str_aligned(canvas, 109, 29, AlignCenter, AlignCenter, buffer);
}
}else{
canvas_set_color(canvas, ColorBlack);
canvas_draw_rframe(canvas, 97, 23, 26, 11, 1);
canvas_set_color(canvas, ColorBlack);
snprintf(buffer, sizeof(buffer), "%d", diffold);
canvas_draw_str_aligned(canvas, 109, 29, AlignCenter, AlignCenter, buffer);
}
}
//DATA AGE end
elements_bold_rounded_frame(canvas, 2, 37, 123, 25);
canvas_set_font(canvas, FontPrimary);