diff --git a/src/driver/drv_bl_shared.c b/src/driver/drv_bl_shared.c index 0c1489f8b..8f6387fe4 100644 --- a/src/driver/drv_bl_shared.c +++ b/src/driver/drv_bl_shared.c @@ -12,6 +12,9 @@ #include "../cJSON/cJSON.h" #include #include "drv_ntp.h" +#include "../hal/hal_flashVars.h" + +#define DAILY_STATS_LENGTH 8 int stat_updatesSkipped = 0; int stat_updatesSent = 0; @@ -45,8 +48,11 @@ int noChangeFrameEnergyCounter; float lastSentEnergyCounterValue = 0.0f; float changeSendThresholdEnergy = 0.1f; float lastSentEnergyCounterLastHour = 0.0f; -float dailyStats[8]; +float dailyStats[DAILY_STATS_LENGTH]; int actual_mday = -1; +float lastSavedEnergyCounterValue = 0.0f; +float changeSavedThresholdEnergy = 1.0f; +long ConsumptionSaveCounter = 0; // how much of value have to change in order to be send over MQTT again? int changeSendThresholds[OBK_NUM_MEASUREMENTS] = { @@ -75,7 +81,8 @@ void BL09XX_AppendInformationToHTTPIndexPage(http_request_t *request) } hprintf255(request,"

%s Voltage=%f, Current=%f, Power=%f",mode, lastReadings[OBK_VOLTAGE],lastReadings[OBK_CURRENT], lastReadings[OBK_POWER]); - hprintf255(request,", Total Consumption=%1.1f Wh (changes sent %i, skipped %i)

",energyCounter, stat_updatesSent, stat_updatesSkipped); + hprintf255(request,", Total Consumption=%1.1f Wh (changes sent %i, skipped %i, saved %li)",energyCounter, stat_updatesSent, stat_updatesSkipped, + ConsumptionSaveCounter); if (energyCounterStatsEnable == true) { @@ -109,7 +116,7 @@ void BL09XX_AppendInformationToHTTPIndexPage(http_request_t *request) if(NTP_IsTimeSynced() == true) { hprintf255(request, "Today: %1.1f Wh DailyStats: [", dailyStats[0]); - for(i = 1; i < 8; i++) + for(i = 1; i < DAILY_STATS_LENGTH; i++) { if (i==1) hprintf255(request, "%1.1f", dailyStats[i]); @@ -130,6 +137,22 @@ void BL09XX_AppendInformationToHTTPIndexPage(http_request_t *request) /********************************************************************************************************************/ } +void BL09XX_SaveEmeteringStatistics() +{ + ENERGY_METERING_DATA data; + + memset(&data, 0, sizeof(ENERGY_METERING_DATA)); + + data.TotalConsumption = energyCounter; + data.TodayConsumpion = dailyStats[0]; + data.YesterdayConsumption = dailyStats[1]; + data.actual_mday = actual_mday; + ConsumptionSaveCounter++; + data.save_counter = ConsumptionSaveCounter; + + HAL_SetEnergyMeterStatus(&data); +} + int BL09XX_ResetEnergyCounter(const void *context, const char *cmd, const char *args, int cmdFlags) { float value; @@ -151,11 +174,16 @@ int BL09XX_ResetEnergyCounter(const void *context, const char *cmd, const char * energyCounterMinutesStamp = xTaskGetTickCount(); energyCounterMinutesIndex = 0; } + for(i = 1; i < DAILY_STATS_LENGTH; i++) + { + dailyStats[i] = 0.0; + } } else { value = atof(args); energyCounter = value; energyCounterStamp = xTaskGetTickCount(); } + BL09XX_SaveEmeteringStatistics(); return 0; } @@ -275,7 +303,8 @@ void BL_ProcessUpdate(float voltage, float current, float power) energyCounter += energy; energyCounterStamp = xTaskGetTickCount(); - + HAL_FlashVars_SaveTotalConsumption(energyCounter); + if(NTP_IsTimeSynced() == true) { g_time = (time_t)NTP_GetCurrentTime(); @@ -295,6 +324,7 @@ void BL_ProcessUpdate(float voltage, float current, float power) actual_mday = ltm->tm_mday; MQTT_PublishMain_StringFloat(counter_mqttNames[3], dailyStats[1]); stat_updatesSent++; + BL09XX_SaveEmeteringStatistics(); } } @@ -328,7 +358,7 @@ void BL_ProcessUpdate(float voltage, float current, float power) cJSON_AddItemToObject(root, "consumption_samples", stats); } stats = cJSON_CreateArray(); - for(i = 0; i < 8; i++) + for(i = 0; i < DAILY_STATS_LENGTH; i++) { cJSON_AddItemToArray(stats, cJSON_CreateNumber(dailyStats[i])); } @@ -412,11 +442,17 @@ void BL_ProcessUpdate(float voltage, float current, float power) noChangeFrameEnergyCounter++; stat_updatesSkipped++; } + if ((energyCounter - lastSavedEnergyCounterValue) >= changeSavedThresholdEnergy) + { + lastSavedEnergyCounterValue = energyCounter; + BL09XX_SaveEmeteringStatistics(); + } } void BL_Shared_Init() { int i; + ENERGY_METERING_DATA data; for(i = 0; i < OBK_NUM_MEASUREMENTS; i++) { @@ -443,11 +479,21 @@ void BL_Shared_Init() energyCounterMinutesIndex = 0; } - for(i = 0; i < 8; i++) + for(i = 0; i < DAILY_STATS_LENGTH; i++) { dailyStats[i] = 0; } + HAL_GetEnergyMeterStatus(&data); + energyCounter = data.TotalConsumption; + dailyStats[0] = data.TodayConsumpion; + dailyStats[1] = data.YesterdayConsumption; + actual_mday = data.actual_mday; + lastSavedEnergyCounterValue = energyCounter; + ConsumptionSaveCounter = data.save_counter; + + //int HAL_SetEnergyMeterStatus(ENERGY_METERING_DATA *data); + CMD_RegisterCommand("EnergyCntReset", "", BL09XX_ResetEnergyCounter, "Reset Energy Counter", NULL); CMD_RegisterCommand("SetupEnergyStats", "", BL09XX_SetupEnergyStatistic, "Setup Energy Statistic Parameters: [enable<0|1>] [sample_time<10..900>] [sample_count<10..180>]", NULL); } @@ -479,6 +525,8 @@ float DRV_GetReading(int type) return hourly_sum; case OBK_CONSUMPTION_YESTERDAY: return dailyStats[1]; + case OBK_CONSUMPTION_TODAY: + return dailyStats[0]; default: break; } diff --git a/src/driver/drv_public.h b/src/driver/drv_public.h index 9362aeab3..f6ffa9246 100644 --- a/src/driver/drv_public.h +++ b/src/driver/drv_public.h @@ -1,4 +1,5 @@ - +#ifndef __DRV_PUBLIC_H__ +#define __DRV_PUBLIC_H__ #include "../httpserver/new_http.h" @@ -14,6 +15,7 @@ enum { OBK_CONSUMPTION_LAST_HOUR, OBK_CONSUMPTION_STATS, OBK_CONSUMPTION_YESTERDAY, + OBK_CONSUMPTION_TODAY, OBK_NUM_EMUNS_MAX }; @@ -44,3 +46,7 @@ void DRV_DGR_OnLedEnableAllChange(int iVal); // OBK_POWER etc float DRV_GetReading(int type); bool DRV_IsMeasuringPower(); +void BL09XX_SaveEmeteringStatistics(); + +#endif /* __DRV_PUBLIC_H__ */ + diff --git a/src/hal/bk7231/hal_flashVars_bk7231.c b/src/hal/bk7231/hal_flashVars_bk7231.c index b2a7fe8c1..4bceefcba 100644 --- a/src/hal/bk7231/hal_flashVars_bk7231.c +++ b/src/hal/bk7231/hal_flashVars_bk7231.c @@ -26,15 +26,17 @@ typedef struct flash_vars_structure { - // offset 0 + // offset 0 unsigned short boot_count; // number of times the device has booted unsigned short boot_success_count; // if a device boots completely (>30s), will equal boot_success_count - // offset 4 + // offset 4 short savedValues[MAX_RETAIN_CHANNELS]; // offset 28 + ENERGY_METERING_DATA emetering; + // offset 60 unsigned char rgb[3]; unsigned char len; // length of the whole structure (i.e. 2+2+1 = 5) MUST NOT BE 255 - // size 32 + // size 64 } FLASH_VARS_STRUCTURE; extern FLASH_VARS_STRUCTURE flash_vars; @@ -641,5 +643,38 @@ int HAL_FlashVars_GetChannelValue(int ch){ return flash_vars.savedValues[ch]; } +int HAL_GetEnergyMeterStatus(ENERGY_METERING_DATA *data) +{ +#ifndef DISABLE_FLASH_VARS_VARS + if (data != NULL) + { + memcpy(data, &flash_vars.emetering, sizeof(ENERGY_METERING_DATA)); + } +#endif + return 0; +} + +int HAL_SetEnergyMeterStatus(ENERGY_METERING_DATA *data) +{ +#ifndef DISABLE_FLASH_VARS_VARS + FLASH_VARS_STRUCTURE tmp; + // mark that we have completed a boot. + if (data != NULL) + { + memcpy(&flash_vars.emetering, data, sizeof(ENERGY_METERING_DATA)); + flash_vars_write(); + flash_vars_read(&tmp); + } +#endif + return 0; +} + +void HAL_FlashVars_SaveTotalConsumption(float total_consumption) +{ +#ifndef DISABLE_FLASH_VARS_VARS + flash_vars.emetering.TotalConsumption = total_consumption; +#endif +} #endif + diff --git a/src/hal/bl602/hal_flashVars_bl602.c b/src/hal/bl602/hal_flashVars_bl602.c index ae9cfea54..405d0acf3 100644 --- a/src/hal/bl602/hal_flashVars_bl602.c +++ b/src/hal/bl602/hal_flashVars_bl602.c @@ -105,6 +105,20 @@ int HAL_FlashVars_GetChannelValue(int ch) { return g_bootCounts.channelStates[ch]; } +int HAL_GetEnergyMeterStatus(ENERGY_METERING_DATA *data) +{ + return 0; +} + +int HAL_SetEnergyMeterStatus(ENERGY_METERING_DATA *data) +{ + return 0; +} + +void HAL_FlashVars_SaveTotalConsumption(float total_consumption) +{ +} + #endif // PLATFORM_BL602 diff --git a/src/hal/hal_flashVars.h b/src/hal/hal_flashVars.h index 52c451afe..5d50ce684 100644 --- a/src/hal/hal_flashVars.h +++ b/src/hal/hal_flashVars.h @@ -1,3 +1,5 @@ +#ifndef __HALK_FLASH_VARS_H__ +#define __HALK_FLASH_VARS_H__ //#define DISABLE_FLASH_VARS_VARS #include "../new_common.h" @@ -5,6 +7,16 @@ #define BOOT_COMPLETE_SECONDS 30 #define MAX_RETAIN_CHANNELS 12 +/* Fixed size 32 bytes */ +typedef struct ENERGY_METERING_DATA { + float TotalConsumption; + float TodayConsumpion; + float YesterdayConsumption; + long save_counter; + unsigned char reseved[15]; + unsigned char actual_mday; +} ENERGY_METERING_DATA; + // call at startup void HAL_FlashVars_IncreaseBootCount(); // call once started (>30s?) @@ -16,4 +28,9 @@ void HAL_FlashVars_SaveChannel(int index, int value); void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b); void HAL_FlashVars_ReadLED(byte *mode, short *brightness, short *temperature, byte *rgb); int HAL_FlashVars_GetChannelValue(int ch); +int HAL_GetEnergyMeterStatus(ENERGY_METERING_DATA *data); +int HAL_SetEnergyMeterStatus(ENERGY_METERING_DATA *data); +void HAL_FlashVars_SaveTotalConsumption(float total_consumption); + +#endif /* __HALK_FLASH_VARS_H__ */ diff --git a/src/hal/w800/hal_flashVars_w800.c b/src/hal/w800/hal_flashVars_w800.c index 11c50dfb7..bc9b2faae 100644 --- a/src/hal/w800/hal_flashVars_w800.c +++ b/src/hal/w800/hal_flashVars_w800.c @@ -32,5 +32,18 @@ void HAL_FlashVars_ReadLED(byte *mode, short *brightness, short *temperature, by } +int HAL_GetEnergyMeterStatus(ENERGY_METERING_DATA *data) +{ + return 0; +} + +int HAL_SetEnergyMeterStatus(ENERGY_METERING_DATA *data) +{ + return 0; +} + +void HAL_FlashVars_SaveTotalConsumption(float total_consumption) +{ +} #endif diff --git a/src/hal/xr809/hal_flashVars_xr809.c b/src/hal/xr809/hal_flashVars_xr809.c index 9918141e4..4f2b45a23 100644 --- a/src/hal/xr809/hal_flashVars_xr809.c +++ b/src/hal/xr809/hal_flashVars_xr809.c @@ -28,8 +28,19 @@ void HAL_FlashVars_ReadLED(byte *mode, short *brightness, short *temperature, by } +int HAL_GetEnergyMeterStatus(ENERGY_METERING_DATA *data) +{ + return 0; +} +int HAL_SetEnergyMeterStatus(ENERGY_METERING_DATA *data) +{ + return 0; +} +void HAL_FlashVars_SaveTotalConsumption(float total_consumption) +{ +} #endif // PLATFORM_XR809 diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 9c1a60add..e57770f49 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -582,6 +582,11 @@ int http_fn_index(http_request_t* request) { hprintf255(request, ""); } + if (ota_progress()>=0) + { + hprintf255(request, "
OTA In Progress. Status: %06lXh
", ota_progress()); + } + // for normal page loads, show the rest of the HTML if (!http_getArg(request->url, "state", tmpA, sizeof(tmpA))) { poststr(request, ""); // end div#state diff --git a/src/ota/ota.c b/src/ota/ota.c index 1be7a7103..ee78e374a 100644 --- a/src/ota/ota.c +++ b/src/ota/ota.c @@ -7,10 +7,12 @@ //#include "flash.h" #include "../logging/logging.h" #include "../httpclient/http_client.h" +#include "../driver/drv_public.h" static unsigned char *sector = (void *)0; int sectorlen = 0; unsigned int addr = 0xff000; +int ota_status = -1; #define SECTOR_SIZE 0x1000 static void store_sector(unsigned int addr, unsigned char *data); extern void flash_protection_op(UINT8 mode,PROTECT_TYPE type); @@ -97,6 +99,7 @@ static void store_sector(unsigned int addr, unsigned char *data){ flash_ctrl(CMD_FLASH_ERASE_SECTOR, &addr); flash_ctrl(CMD_FLASH_WRITE_ENABLE, (void *)0); flash_write((char *)data , SECTOR_SIZE, addr); + ota_status += SECTOR_SIZE; } @@ -135,7 +138,10 @@ int myhttpclientcallback(httprequest_t* request){ CFG_IncrementOTACount(); // make sure it's saved before reboot CFG_Save_IfThereArePendingChanges(); - + if (DRV_IsMeasuringPower()) + { + BL09XX_SaveEmeteringStatistics(); + } rtos_delay_milliseconds(1000); bk_reboot(); break; @@ -197,5 +203,11 @@ void otarequest(const char *urlin){ request->method = HTTPCLIENT_GET; request->timeout = 10000; HTTPClient_Async_SendGeneric(request); + ota_status = 0; } +int ota_progress() +{ + return ota_status; +} + diff --git a/src/ota/ota.h b/src/ota/ota.h index a3f25507e..8508f4f4f 100644 --- a/src/ota/ota.h +++ b/src/ota/ota.h @@ -1,4 +1,5 @@ - +#ifndef __OTA_H__ +#define __OTA_H__ // NOTE: this offset was taken from BkDriverFlash.c // search for BK_PARTITION_OTA @@ -22,3 +23,8 @@ void add_otadata(unsigned char *data, int len); void close_ota(); void otarequest(const char *urlin); + +int ota_progress(); + +#endif /* __OTA_H__ */ + diff --git a/src/user_main.c b/src/user_main.c index 05493eb83..936eca09e 100644 --- a/src/user_main.c +++ b/src/user_main.c @@ -393,6 +393,10 @@ void Main_OnEverySecond() if (!g_reset){ // ensure any config changes are saved before reboot. CFG_Save_IfThereArePendingChanges(); + if (DRV_IsMeasuringPower()) + { + BL09XX_SaveEmeteringStatistics(); + } ADDLOGF_INFO("Going to call HAL_RebootModule\r\n"); HAL_RebootModule(); } else {