mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-11-26 22:40:25 +00:00
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:
parent
7945afd1d2
commit
21e5b66bf6
14 changed files with 138 additions and 3 deletions
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue