diff --git a/src/driver/drv_bl0937.c b/src/driver/drv_bl0937.c index 9bcdfa5ec..ca0bc2343 100644 --- a/src/driver/drv_bl0937.c +++ b/src/driver/drv_bl0937.c @@ -38,6 +38,7 @@ float BL0937_CREF = 0.0118577075f; volatile uint32_t g_vc_pulses = 0; volatile uint32_t g_p_pulses = 0; +static portTickType pulseStamp; void HlwCf1Interrupt(unsigned char pinNum) { // Service Voltage and Current g_vc_pulses++; @@ -175,12 +176,20 @@ void BL0937_Init() CMD_RegisterCommand("PREF","",BL0937_PowerRef, "Sets the calibration multiplier", NULL); CMD_RegisterCommand("VREF","",BL0937_VoltageRef, "Sets the calibration multiplier", NULL); CMD_RegisterCommand("IREF","",BL0937_CurrentRef, "Sets the calibration multiplier", NULL); + + g_vc_pulses = 0; + g_p_pulses = 0; + pulseStamp = xTaskGetTickCount(); } -void BL0937_RunFrame() { + +void BL0937_RunFrame() +{ float final_v; float final_c; float final_p; + portTickType ticksElapsed; + ticksElapsed = (xTaskGetTickCount() - pulseStamp); if(g_sel) { res_v = g_vc_pulses; @@ -195,11 +204,20 @@ void BL0937_RunFrame() { res_p = g_p_pulses; g_p_pulses = 0; + pulseStamp = xTaskGetTickCount(); //addLogAdv(LOG_INFO, LOG_FEATURE_ENERGYMETER,"Voltage pulses %i, current %i, power %i\n", res_v, res_c, res_p); final_v = res_v * BL0937_VREF; - final_c = res_c * BL0937_CREF; - final_p = res_p * BL0937_PREF; + final_v *= (float)ticksElapsed; + final_v /= (1000.0f / (float)portTICK_PERIOD_MS); + + final_c = res_c * BL0937_CREF; + final_c *= (float)ticksElapsed; + final_c /= (1000.0f / (float)portTICK_PERIOD_MS); + + final_p = res_p * BL0937_PREF; + final_p *= (float)ticksElapsed; + final_p /= (1000.0f / (float)portTICK_PERIOD_MS); #if 0 { char dbg[128]; diff --git a/src/driver/drv_bl_shared.c b/src/driver/drv_bl_shared.c index db68719d6..36dfeed7b 100644 --- a/src/driver/drv_bl_shared.c +++ b/src/driver/drv_bl_shared.c @@ -10,6 +10,8 @@ #include "drv_uart.h" #include "../httpserver/new_http.h" #include "../cJSON/cJSON.h" +#include +#include "drv_ntp.h" int stat_updatesSkipped = 0; int stat_updatesSent = 0; @@ -43,6 +45,8 @@ int noChangeFrameEnergyCounter; float lastSentEnergyCounterValue = 0.0f; float changeSendThresholdEnergy = 0.1f; float lastSentEnergyCounterLastHour = 0.0f; +float dailyStats[8]; +int actual_mday = -1; // how much of value have to change in order to be send over MQTT again? int changeSendThresholds[OBK_NUM_MEASUREMENTS] = { @@ -99,6 +103,22 @@ void BL09XX_AppendInformationToHTTPIndexPage(http_request_t *request) hprintf255(request, "
History Index: %ld
JSON Stats: %s ", energyCounterMinutesIndex, (energyCounterStatsJSONEnable == true) ? "enabled" : "disabled"); } + + if(NTP_IsTimeSynced() == true) + { + sprintf(tmp, "Today: %1.1f Wh DailyStats: [", dailyStats[0]); + for(i = 1; i < 8; i++) + { + if (i==1) + sprintf(number, "%1.1f", dailyStats[i]); + else + sprintf(number, ",%1.1f", dailyStats[i]); + strcat(tmp, number); + } + strcat(tmp, "]"); + } + strcat(tmp, ""); + hprintf128(request, tmp); } else { hprintf255(request,"
Periodic Statistics disabled. Use startup command SetupEnergyStats to enable function.
"); } @@ -233,6 +253,8 @@ void BL_ProcessUpdate(float voltage, float current, float power) cJSON* stats; char *msg; portTickType interval; + time_t g_time; + struct tm *ltm; // those are final values, like 230V lastReadings[OBK_POWER] = power; @@ -249,6 +271,26 @@ void BL_ProcessUpdate(float voltage, float current, float power) energyCounter += energy; energyCounterStamp = xTaskGetTickCount(); + if(NTP_IsTimeSynced() == true) + { + g_time = (time_t)NTP_GetCurrentTime(); + ltm = localtime(&g_time); + if (actual_mday == -1) + { + actual_mday = ltm->tm_mday; + } + if (actual_mday != ltm->tm_mday) + { + for(i = 7; i > 0; i--) + { + dailyStats[i] = dailyStats[i - 1]; + } + dailyStats[0] = 0.0; + actual_mday = ltm->tm_mday; + } + } + dailyStats[0] += energy; + if (energyCounterStatsEnable == true) { interval = energyCounterSampleInterval; @@ -382,6 +424,11 @@ void BL_Shared_Init() energyCounterMinutesIndex = 0; } + for(i = 0; i < 8; i++) + { + dailyStats[i] = 0; + } + 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); } diff --git a/src/driver/drv_main.c b/src/driver/drv_main.c index a63c79846..20785c806 100644 --- a/src/driver/drv_main.c +++ b/src/driver/drv_main.c @@ -58,7 +58,7 @@ typedef struct driver_s { // startDriver BL0937 static driver_t g_drivers[] = { { "TuyaMCU", TuyaMCU_Init, TuyaMCU_RunFrame, NULL, NULL, NULL, NULL, false }, - { "NTP", NTP_Init, NTP_OnEverySecond, NULL, NULL, NULL, NULL, false }, + { "NTP", NTP_Init, NTP_OnEverySecond, NTP_AppendInformationToHTTPIndexPage, NULL, NULL, NULL, false }, { "I2C", DRV_I2C_Init, DRV_I2C_EverySecond, NULL, NULL, NULL, NULL, false }, //These 4 measure power diff --git a/src/driver/drv_ntp.c b/src/driver/drv_ntp.c index f0942b3c4..dc5fb925a 100644 --- a/src/driver/drv_ntp.c +++ b/src/driver/drv_ntp.c @@ -2,14 +2,17 @@ // Based on my previous work here: // https://www.elektroda.pl/rtvforum/topic3712112.html +#include + #include "../new_common.h" #include "../new_cfg.h" // Commands register, execution API and cmd tokenizer #include "../cmnds/cmd_public.h" - - +#include "../httpserver/new_http.h" #include "../logging/logging.h" +#include "drv_ntp.h" + #define LOG_FEATURE LOG_FEATURE_NTP typedef struct @@ -55,6 +58,7 @@ static int adrLen; static int g_ntp_delay = 5; // current time static unsigned int g_time; +static bool g_synced; // time offset (time zone?) static int g_timeOffsetHours; @@ -95,6 +99,7 @@ void NTP_Init() { CMD_RegisterCommand("ntp_info", "", NTP_Info, "Display NTP related settings", NULL); addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "NTP driver initialized with server=%s, offset=%d\n", CFG_GetNTPServer(), g_timeOffsetHours); + g_synced = false; } unsigned int NTP_GetCurrentTime() { @@ -112,7 +117,7 @@ void NTP_Shutdown() { } g_ntp_socket = 0; // can attempt in next 10 seconds - g_ntp_delay = 10; + g_ntp_delay = 60; } void NTP_SendRequest(bool bBlocking) { byte *ptr; @@ -182,6 +187,7 @@ void NTP_CheckForReceive() { unsigned int secsSince1900; ntp_packet packet = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ptr = (byte*)&packet; + struct tm *ltm; // Receive the server's response: i = sizeof(packet); @@ -201,11 +207,15 @@ void NTP_CheckForReceive() { // combine the four bytes (two words) into a long integer // this is NTP time (seconds since Jan 1 1900): secsSince1900 = highWord << 16 | lowWord; - addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Seconds since Jan 1 1900 = %u",secsSince1900); + addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Seconds since Jan 1 1900 = %u\n",secsSince1900); g_time = secsSince1900 - NTP_OFFSET; g_time += g_timeOffsetHours; - addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Unix time = %u",g_time); + addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Unix time : %u\n",g_time); + ltm = localtime(&g_time); + addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Local Time : %04d/%02d/%02d %02d:%02d:%02d\n", + ltm->tm_year+1900, ltm->tm_mon+1, ltm->tm_mday, ltm->tm_hour, ltm->tm_min, ltm->tm_sec); + g_synced = true; #if 0 //ptm = localtime (&g_time); ptm = gmtime(&g_time); @@ -255,3 +265,24 @@ void NTP_OnEverySecond() { } } } + +void NTP_AppendInformationToHTTPIndexPage(http_request_t* request) +{ + char tmp[128]; + struct tm *ltm; + + ltm = localtime(&g_time); + + if (g_synced == true) + sprintf(tmp, "
NTP: Local Time: %04d/%02d/%02d %02d:%02d:%02d
", + ltm->tm_year+1900, ltm->tm_mon+1, ltm->tm_mday, ltm->tm_hour, ltm->tm_min, ltm->tm_sec); + else + sprintf(tmp, "
NTP: Syncing...."); + hprintf128(request,tmp); +} + +bool NTP_IsTimeSynced() +{ + return g_synced; +} + diff --git a/src/driver/drv_ntp.h b/src/driver/drv_ntp.h index 71090aa65..f7147b85c 100644 --- a/src/driver/drv_ntp.h +++ b/src/driver/drv_ntp.h @@ -1,6 +1,14 @@ +#ifndef __DRV_NTP_H__ +#define __DRV_NTP_H__ +#include "../httpserver/new_http.h" void NTP_Init(); void NTP_OnEverySecond(); // returns number of seconds passed after 1900 unsigned int NTP_GetCurrentTime(); +void NTP_AppendInformationToHTTPIndexPage(http_request_t* request); +bool NTP_IsTimeSynced(); + +#endif /* __DRV_NTP_H__ */ + diff --git a/src/hal/bk7231/hal_wifi_bk7231.c b/src/hal/bk7231/hal_wifi_bk7231.c index 5cb08c39a..5065ee35b 100644 --- a/src/hal/bk7231/hal_wifi_bk7231.c +++ b/src/hal/bk7231/hal_wifi_bk7231.c @@ -240,6 +240,10 @@ void HAL_ConnectToWiFi(const char* oob_ssid, const char* connect_key) bk_wlan_start(&network_cfg); } +void HAL_DisconnectFromWifi() +{ + bk_wlan_stop(STATION); +} int HAL_SetupWiFiOpenAccessPoint(const char* ssid) { diff --git a/src/hal/bl602/hal_wifi_bl602.c b/src/hal/bl602/hal_wifi_bl602.c index 686ee6a51..36631caed 100644 --- a/src/hal/bl602/hal_wifi_bl602.c +++ b/src/hal/bl602/hal_wifi_bl602.c @@ -30,6 +30,12 @@ void HAL_ConnectToWiFi(const char *ssid, const char *psk) g_bAccessPointMode = 0; } + +void HAL_DisconnectFromWifi() +{ + +} + int HAL_SetupWiFiOpenAccessPoint(const char *ssid) { uint8_t hidden_ssid = 0; diff --git a/src/hal/hal_wifi.h b/src/hal/hal_wifi.h index a3ca25444..0a0c71366 100644 --- a/src/hal/hal_wifi.h +++ b/src/hal/hal_wifi.h @@ -13,6 +13,7 @@ enum HALWifiStatus { int HAL_SetupWiFiOpenAccessPoint(const char* ssid); void HAL_ConnectToWiFi(const char* oob_ssid, const char* connect_key); +void HAL_DisconnectFromWifi(); void HAL_WiFi_SetupStatusCallback(void (*cb)(int code)); // This must return correct IP for both SOFT_AP and STATION modes, // because, for example, javascript control panel requires it diff --git a/src/hal/w800/hal_wifi_w800.c b/src/hal/w800/hal_wifi_w800.c index 80d22eeb7..ef1fd3b6a 100644 --- a/src/hal/w800/hal_wifi_w800.c +++ b/src/hal/w800/hal_wifi_w800.c @@ -188,6 +188,12 @@ void HAL_ConnectToWiFi(const char* oob_ssid, const char* connect_key) connect_wifi_demo(oob_ssid, connect_key); } +void HAL_DisconnectFromWifi() +{ + +} + + /*1)Add sta add callback function 2)Add sta list monitor task*/ static tls_os_timer_t* sta_monitor_tim = NULL; diff --git a/src/hal/xr809/hal_wifi_xr809.c b/src/hal/xr809/hal_wifi_xr809.c index 313e85742..79d877380 100644 --- a/src/hal/xr809/hal_wifi_xr809.c +++ b/src/hal/xr809/hal_wifi_xr809.c @@ -40,6 +40,12 @@ void HAL_ConnectToWiFi(const char *ssid, const char *psk) //OS_Sleep(60); printf("ok set wifii\n\r"); } + +void HAL_DisconnectFromWifi() +{ + +} + int HAL_SetupWiFiOpenAccessPoint(const char *ssid) { char ap_psk[8] = { 0 }; @@ -146,4 +152,4 @@ const char *HAL_GetMACStr(char *macstr) { return macstr; } -#endif // PLATFORM_XR809 \ No newline at end of file +#endif // PLATFORM_XR809 diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index bc18ced4b..79b9d01a2 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -543,7 +543,11 @@ int http_fn_index(http_request_t* request) { hprintf255(request, "
Ping watchdog - %i lost, %i ok!
", PingWatchDog_GetTotalLost(), PingWatchDog_GetTotalReceived()); - hprintf255(request, "
MQTT State: %s RES: %d(%s)
", (Main_HasMQTTConnected() == 1) ? "connected" : "disconnected", + if (Main_HasWiFiConnected()) + { + hprintf128(request, "
Wifi RSSI: %i
", HAL_GetWifiStrength()); + } + hprintf128(request, "
MQTT State: %s RES: %d(%s)
", (Main_HasMQTTConnected() == 1) ? "connected" : "disconnected", MQTT_GetConnectResult(), get_error_name(MQTT_GetConnectResult())); hprintf255(request, "MQTT ErrMsg: %s
", (MQTT_GetStatusMessage() != NULL) ? MQTT_GetStatusMessage() : ""); hprintf255(request, "MQTT Stats:CONN: %d PUB: %d RECV: %d ERR: %d
", MQTT_GetConnectEvents(), diff --git a/src/new_ping.c b/src/new_ping.c index 9fb23a8d7..c472f4dcc 100644 --- a/src/new_ping.c +++ b/src/new_ping.c @@ -57,7 +57,7 @@ static struct raw_pcb *ping_pcb; static unsigned int ping_lost = 0; static unsigned int ping_received = 0; static int bReceivedLastOneSend = -1; -//static int g_delayBetweenPings_MS = 1000; +//static int g_delayBetweenPings_MS = 1000 / portTICK_PERIOD_MS; static void ping_prepare_echo( struct icmp_echo_hdr *iecho, u16_t len) { @@ -101,6 +101,7 @@ static void ping_send(struct raw_pcb *raw, const ip_addr_t *addr) if(bReceivedLastOneSend == 0) { //addLogAdv(LOG_INFO,LOG_FEATURE_MAIN,"Ping lost: (total lost %i, recv %i)\r\n",ping_lost,ping_received); ping_lost++; + } bReceivedLastOneSend = 0; @@ -166,8 +167,8 @@ int PingWatchDog_GetTotalLost() { int PingWatchDog_GetTotalReceived() { return ping_received; } -void Main_SetupPingWatchDog(const char *target/*, int delayBetweenPings_Seconds*/) { - +void Main_SetupPingWatchDog(const char *target/*, int delayBetweenPings_Seconds*/) +{ // none sent yet. bReceivedLastOneSend = -1; //g_delayBetweenPings_MS = delayBetweenPings_Seconds * 1000; @@ -183,3 +184,4 @@ void Main_SetupPingWatchDog(const char *target/*, int delayBetweenPings_Seconds* // void sys_timeout (u32_t msecs, sys_timeout_handler handler, void *arg) sys_timeout(PING_DELAY, ping_timeout, ping_pcb); } + diff --git a/src/user_main.c b/src/user_main.c index a9600131d..c378f088c 100644 --- a/src/user_main.c +++ b/src/user_main.c @@ -223,9 +223,10 @@ void Main_OnEverySecond() if(g_timeSinceLastPingReply != -1 && g_secondsElapsed > 60) { g_timeSinceLastPingReply++; - if(g_timeSinceLastPingReply == CFG_GetPingDisconnectedSecondsToRestart()) + if(g_timeSinceLastPingReply >= CFG_GetPingDisconnectedSecondsToRestart()) { ADDLOGF_INFO("[Ping watchdog] No ping replies within %i seconds. Will try to reconnect.\n",g_timeSinceLastPingReply); + HAL_DisconnectFromWifi(); g_bHasWiFiConnected = 0; g_connectToWiFi = 10; } @@ -321,7 +322,7 @@ void Main_OnEverySecond() if(0==g_startPingWatchDogAfter) { const char *pingTargetServer; - ///int pingInterval; + //int pingInterval; int restartAfterNoPingsSeconds; g_bPingWatchDogStarted = 1; @@ -330,14 +331,13 @@ void Main_OnEverySecond() //pingInterval = CFG_GetPingIntervalSeconds(); restartAfterNoPingsSeconds = CFG_GetPingDisconnectedSecondsToRestart(); - if(*pingTargetServer /* && pingInterval > 0*/ && restartAfterNoPingsSeconds > 0) + if((pingTargetServer != NULL) && (strlen(pingTargetServer)>0) && + /*(pingInterval > 0) && */ (restartAfterNoPingsSeconds > 0)) { // mark as enabled g_timeSinceLastPingReply = 0; //Main_SetupPingWatchDog(pingTargetServer,pingInterval); - Main_SetupPingWatchDog(pingTargetServer - /*,1*/ - ); + Main_SetupPingWatchDog(pingTargetServer); } else { // mark as disabled g_timeSinceLastPingReply = -1;