add: faster broadcast on status change
This commit is contained in:
parent
eca6f7f704
commit
f49c760e97
2 changed files with 70 additions and 59 deletions
|
@ -1,7 +1,6 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <syslog.h>
|
||||
|
||||
#include <mongoose.h>
|
||||
|
@ -142,16 +141,10 @@ main(int argc, const char** argv)
|
|||
|
||||
/******************** START MAIN LOOP ********************/
|
||||
|
||||
time_t timer = time(NULL);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
mg_mgr_poll(&mgr, 200);
|
||||
if(time(NULL) - timer >= 10)
|
||||
{
|
||||
status_broadcast(&mgr);
|
||||
timer = time(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
terminate(0);
|
||||
|
|
120
src/status.c
120
src/status.c
|
@ -1,3 +1,5 @@
|
|||
#include <time.h>
|
||||
|
||||
#include <cJSON.h>
|
||||
|
||||
#include <cache.h>
|
||||
|
@ -8,56 +10,7 @@ relay_t **global_relay_status_list;
|
|||
char *relay_status_list_json_str;
|
||||
size_t relay_status_list_json_str_len;
|
||||
|
||||
void
|
||||
status_init()
|
||||
{
|
||||
global_relay_status_list = relay_get_all();
|
||||
relay_status_list_json_str = NULL;
|
||||
relay_status_list_json_str_len = 0;
|
||||
}
|
||||
|
||||
void
|
||||
status_reload_entry(int relay_id)
|
||||
{
|
||||
LOGGER_DEBUG("reloading relay status\n");
|
||||
relay_t **relays = global_relay_status_list;
|
||||
for(int i = 0; relays[i] != NULL; ++i)
|
||||
{
|
||||
if(relays[i]->id != relay_id)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
int is_on_backup = relays[i]->is_on;
|
||||
relay_t *updated_relay = relay_get_by_id(relay_id);
|
||||
relay_free(relays[i]);
|
||||
relays[i] = updated_relay;
|
||||
relays[i]->is_on = is_on_backup;
|
||||
relay_status_list_json_str = NULL;
|
||||
relay_status_list_json_str_len = 0;
|
||||
|
||||
cache_invalidate_relay(relay_id);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
status_update_entry(int relay_id, int is_on)
|
||||
{
|
||||
LOGGER_DEBUG("updating relay status ([%d] = %d)\n", relay_id, is_on);
|
||||
relay_t **relays = global_relay_status_list;
|
||||
for(int i = 0; relays[i] != NULL; ++i)
|
||||
{
|
||||
if(relays[i]->id != relay_id)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
relays[i]->is_on = is_on;
|
||||
relay_status_list_json_str = NULL;
|
||||
relay_status_list_json_str_len = 0;
|
||||
|
||||
cache_invalidate_relay(relay_id);
|
||||
}
|
||||
}
|
||||
time_t timer;
|
||||
|
||||
static int
|
||||
is_websocket(const struct mg_connection *nc)
|
||||
|
@ -65,6 +18,14 @@ is_websocket(const struct mg_connection *nc)
|
|||
return nc->flags & MG_F_IS_WEBSOCKET;
|
||||
}
|
||||
|
||||
static void
|
||||
invalidate_json_str_cache()
|
||||
{
|
||||
relay_status_list_json_str = NULL;
|
||||
relay_status_list_json_str_len = 0;
|
||||
timer = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
validate_json_str_cache()
|
||||
{
|
||||
|
@ -83,13 +44,70 @@ validate_json_str_cache()
|
|||
|
||||
cJSON_Delete(json);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
status_init()
|
||||
{
|
||||
global_relay_status_list = relay_get_all();
|
||||
|
||||
invalidate_json_str_cache();
|
||||
timer = time(NULL);
|
||||
}
|
||||
|
||||
void
|
||||
status_reload_entry(int relay_id)
|
||||
{
|
||||
LOGGER_DEBUG("reloading relay status\n");
|
||||
relay_t **relays = global_relay_status_list;
|
||||
for(int i = 0; relays[i] != NULL; ++i)
|
||||
{
|
||||
if(relays[i]->id != relay_id)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
int is_on_backup = relays[i]->is_on;
|
||||
relay_t *updated_relay = relay_get_by_id(relay_id);
|
||||
relay_free(relays[i]);
|
||||
relays[i] = updated_relay;
|
||||
relays[i]->is_on = is_on_backup;
|
||||
|
||||
invalidate_json_str_cache();
|
||||
|
||||
cache_invalidate_relay(relay_id);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
status_update_entry(int relay_id, int is_on)
|
||||
{
|
||||
LOGGER_DEBUG("updating relay status ([%d] = %d)\n", relay_id, is_on);
|
||||
relay_t **relays = global_relay_status_list;
|
||||
for(int i = 0; relays[i] != NULL; ++i)
|
||||
{
|
||||
if(relays[i]->id != relay_id)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
relays[i]->is_on = is_on;
|
||||
|
||||
invalidate_json_str_cache();
|
||||
|
||||
cache_invalidate_relay(relay_id);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
status_broadcast(struct mg_mgr *mgr)
|
||||
{
|
||||
if(timer && (timer - time(NULL) < 10))
|
||||
{
|
||||
return;
|
||||
}
|
||||
timer = time(NULL);
|
||||
|
||||
struct mg_connection *c;
|
||||
validate_json_str_cache();
|
||||
|
||||
|
|
Loading…
Reference in a new issue