MeterLogger
config.c
Go to the documentation of this file.
1 #include <stddef.h>
2 #include <esp8266.h>
3 
4 #include "mqtt.h"
5 #include "config.h"
6 #include "user_config.h"
7 #include "debug.h"
8 #include "utils.h"
9 #include "tinyprintf.h"
10 #include "driver/ext_spi_flash.h"
11 
14 
15 #define EXT_CFG_LOCATION 0x0
16 
17 #ifdef EXT_SPI_RAM_IS_NAND
18 #define EXT_SPI_RAM_SEC_SIZE 0x1000 // 4 kB block size for FLASH RAM
19 #else
20 #define EXT_SPI_RAM_SEC_SIZE 0x200 // we only need 512 bytes for config when FeRAM is used
21 #endif
22 
23 #define SAVE_DEFER_TIME 2000
26 
29 #ifdef IMPULSE
30  uint32_t impulse_meter_count_temp;
31 #endif // IMPULSE
32 
33 #if defined(IMPULSE) && !defined(DEBUG_NO_METER) // use internal flash if built with DEBUG_NO_METER=1
34  do {
35  // try to save until sys_cfg.impulse_meter_count does not change
36  impulse_meter_count_temp = sys_cfg.impulse_meter_count;
37 
38  // calculate checksum on sys_cfg struct without ccit_crc16
39  sys_cfg.ccit_crc16 = ccit_crc16(0xffff, (uint8_t *)&sys_cfg, offsetof(syscfg_t, ccit_crc16) - offsetof(syscfg_t, cfg_holder));
41  (uint32 *)&saveFlag, sizeof(SAVE_FLAG));
42 
43  if (saveFlag.flag == 0) {
44 #ifdef EXT_SPI_RAM_IS_NAND
46 #endif // EXT_SPI_RAM_IS_NAND
48  (uint32 *)&sys_cfg, sizeof(syscfg_t));
49  saveFlag.flag = 1;
50 #ifdef EXT_SPI_RAM_IS_NAND
52 #endif // EXT_SPI_RAM_IS_NAND
54  (uint32 *)&saveFlag, sizeof(SAVE_FLAG));
55  } else {
56 #ifdef EXT_SPI_RAM_IS_NAND
58 #endif // EXT_SPI_RAM_IS_NAND
60  (uint32 *)&sys_cfg, sizeof(syscfg_t));
61  saveFlag.flag = 0;
62 #ifdef EXT_SPI_RAM_IS_NAND
64 #endif // EXT_SPI_RAM_IS_NAND
66  (uint32 *)&saveFlag, sizeof(SAVE_FLAG));
67  }
68  } while (sys_cfg.impulse_meter_count != impulse_meter_count_temp);
69 #else
70  // calculate checksum on sys_cfg struct without ccit_crc16
71  sys_cfg.ccit_crc16 = ccit_crc16(0xffff, (uint8_t *)&sys_cfg, offsetof(syscfg_t, ccit_crc16) - offsetof(syscfg_t, cfg_holder));
73 #endif // IMPULSE
74 }
75 
78  // DEBUG: we suppose nothing else is touching sys_cfg while saving otherwise checksum becomes wrong
79  INFO("\r\nload ...\r\n");
80 #if defined(IMPULSE) && !defined(DEBUG_NO_METER) // use internal flash if built with DEBUG_NO_METER=1
82  (uint32 *)&saveFlag, sizeof(SAVE_FLAG));
83  if (saveFlag.flag == 0) {
85  (uint32 *)&sys_cfg, sizeof(syscfg_t));
86  } else {
88  (uint32 *)&sys_cfg, sizeof(syscfg_t));
89  }
90 #else
91  system_param_load(CFG_LOCATION, 0, &sys_cfg, sizeof(syscfg_t));
92 #endif // IMPULSE
93 
94  // if checksum fails...
95  if (sys_cfg.ccit_crc16 != ccit_crc16(0xffff, (uint8_t *)&sys_cfg, offsetof(syscfg_t, ccit_crc16) - offsetof(syscfg_t, cfg_holder))) {
96 #ifdef DEBUG
97  os_printf("config crc error, default conf loaded\n");
98 #endif // DEBUG
99  // if first time config load default conf
100  os_memset(&sys_cfg, 0x00, sizeof(syscfg_t));
101 
102  tfp_snprintf(sys_cfg.sta_ssid, 64, "%s", STA_SSID);
103  tfp_snprintf(sys_cfg.sta_pwd, 64, "%s", STA_PASS);
104  sys_cfg.sta_type = STA_TYPE;
105 #ifdef AP
106  sys_cfg.ap_enabled = true;
107 #else
108  sys_cfg.ap_enabled = false;
109 #endif
110  tfp_snprintf(sys_cfg.device_id, 16, MQTT_CLIENT_ID, system_get_chip_id());
111  tfp_snprintf(sys_cfg.mqtt_host, 64, "%s", MQTT_HOST);
112  sys_cfg.mqtt_port = MQTT_PORT;
113  tfp_snprintf(sys_cfg.mqtt_user, 32, "%s", MQTT_USER);
114  tfp_snprintf(sys_cfg.mqtt_pass, 32, "%s", MQTT_PASS);
115 
116  sys_cfg.security = DEFAULT_SECURITY; //default non ssl
117 
118  memcpy(sys_cfg.key, key, sizeof(key));
119 
120  sys_cfg.mqtt_keepalive = MQTT_KEEPALIVE;
121 #ifdef IMPULSE
122  tfp_snprintf(sys_cfg.impulse_meter_serial, METER_SERIAL_LEN, DEFAULT_METER_SERIAL);
123  tfp_snprintf(sys_cfg.impulse_meter_energy, 2, "0");
124  tfp_snprintf(sys_cfg.impulses_per_kwh, 4, "100");
125  sys_cfg.impulse_meter_count = 0;
126 #else
127  sys_cfg.ac_thermo_state = 0;
128  sys_cfg.offline_close_at = 0;
129  memset(&sys_cfg.cron_jobs, 0, sizeof(cron_job_t));
130 #endif // IMPULSE
131 
132  INFO(" default configuration\r\n");
133 
134  cfg_save();
135  }
136  else {
137 #ifdef DEBUG
138  os_printf("config crc ok\n");
139 #endif // DEBUG
140  }
141 }
142 
148 }
149 
151 void config_save_timer_func(void *arg) {
153  // reschedule
157  }
158  else {
159  // stop timer
162 
163  cfg_save();
164  }
165 }
static os_timer_t config_save_timer
Definition: config.c:24
#define MQTT_PORT
Definition: user_config.h:30
#define os_timer_t
Definition: os_type.h:34
ICACHE_FLASH_ATTR bool ext_spi_flash_read(uint32_t src_addr, uint32_t *dst_addr, uint32_t size)
Definition: ext_spi_flash.c:47
#define DEFAULT_SECURITY
Definition: user_config.h:39
#define os_timer_disarm
Definition: osapi.h:51
#define memset(x, a, b)
Definition: platform.h:21
#define MQTT_USER
Definition: user_config.h:35
bool system_param_save_with_protect(uint16 start_sec, void *param, uint16 len)
#define MQTT_CLIENT_ID
Definition: user_config.h:34
#define NULL
Definition: def.h:47
void ICACHE_FLASH_ATTR cfg_save()
Definition: config.c:28
#define ICACHE_FLASH_ATTR
Definition: c_types.h:99
#define STA_TYPE
Definition: user_config.h:67
#define os_timer_func_t
Definition: os_type.h:35
#define os_printf
Definition: osapi.h:62
#define os_timer_setfn
Definition: osapi.h:52
#define CFG_LOCATION
Definition: user_config.h:7
void ICACHE_FLASH_ATTR cfg_save_defered()
Definition: config.c:144
#define EXT_SPI_RAM_SEC_SIZE
Definition: config.c:20
#define DEFAULT_METER_SERIAL
Definition: user_config.h:21
#define os_memset
Definition: osapi.h:38
ICACHE_FLASH_ATTR uint16_t ccit_crc16(uint16_t crc16, uint8_t *data_p, unsigned int length)
Definition: utils.c:47
char config_save_timer_running
Definition: config.c:25
SAVE_FLAG saveFlag
Definition: config.c:13
#define EXT_CFG_LOCATION
Definition: config.c:15
#define METER_SERIAL_LEN
Definition: config.h:39
#define STA_SSID
Definition: user_config.h:65
ICACHE_FLASH_ATTR bool ext_spi_flash_write(uint32_t dst_addr, uint32_t *src_addr, uint32_t size)
Definition: ext_spi_flash.c:78
ICACHE_FLASH_ATTR void config_save_timer_func(void *arg)
Definition: config.c:151
unsigned int uint32
Definition: c_types.h:54
ICACHE_FLASH_ATTR bool ext_spi_flash_erase_sector(uint16_t sec)
Definition: ext_spi_flash.c:34
static const char key[]
Definition: config.h:42
#define MQTT_HOST
Definition: user_config.h:28
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
Definition: tinyprintf.c:480
#define os_timer_arm(a, b, c)
Definition: osapi.h:50
uint16_t ccit_crc16
Definition: config.h:70
uint32 system_get_chip_id(void)
#define memcpy(x, a, b)
Definition: platform.h:22
#define MQTT_KEEPALIVE
Definition: user_config.h:32
void ICACHE_FLASH_ATTR cfg_load()
Definition: config.c:77
#define SAVE_DEFER_TIME
Definition: config.c:23
#define INFO(...)
Definition: debug.h:17
#define MQTT_PASS
Definition: user_config.h:36
#define STA_PASS
Definition: user_config.h:66
syscfg_t sys_cfg
Definition: config.c:12
bool system_param_load(uint16 start_sec, uint16 offset, void *param, uint16 len)