configuration
This commit is contained in:
		| @@ -5,7 +5,10 @@ | |||||||
| #include <spi.h> | #include <spi.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define CONFIG_MAGIC 0xdead0000 | ||||||
|  |  | ||||||
| typedef struct __attribute__((__packed__)) s_configBlock { | typedef struct __attribute__((__packed__)) s_configBlock { | ||||||
|  |     uint32_t configMagic; | ||||||
|     char deviceName[16]; |     char deviceName[16]; | ||||||
|     uint8_t macAddress[6]; |     uint8_t macAddress[6]; | ||||||
|     int32_t frontendThreshold; |     int32_t frontendThreshold; | ||||||
| @@ -15,7 +18,7 @@ typedef struct __attribute__((__packed__)) s_configBlock { | |||||||
|     char statusTopic[64]; |     char statusTopic[64]; | ||||||
|     char mbusDataTopic[64]; |     char mbusDataTopic[64]; | ||||||
|     char syslogServerName[64]; |     char syslogServerName[64]; | ||||||
|     uint8_t filler[3]; |     uint8_t filler[2]; | ||||||
| } t_configBlock; | } t_configBlock; | ||||||
|  |  | ||||||
| void configInit(); | void configInit(); | ||||||
|   | |||||||
| @@ -2,9 +2,10 @@ | |||||||
|  |  | ||||||
| #include <config.h> | #include <config.h> | ||||||
| #include <eeprom.h> | #include <eeprom.h> | ||||||
|  | #include <logger.h> | ||||||
|  |  | ||||||
| t_configBlock defaultConfigBlock = { | t_configBlock defaultConfigBlock = { | ||||||
|  |     .configMagic = CONFIG_MAGIC, | ||||||
|     .deviceName = "MBGW3", |     .deviceName = "MBGW3", | ||||||
|     .macAddress = { 0x00, 0xA0, 0x57, 0x05, 0x3E, 0x0D }, |     .macAddress = { 0x00, 0xA0, 0x57, 0x05, 0x3E, 0x0D }, | ||||||
|     .frontendThreshold = 240, |     .frontendThreshold = 240, | ||||||
| @@ -14,7 +15,7 @@ t_configBlock defaultConfigBlock = { | |||||||
|     .statusTopic = "IoT/MBGW3/Status", |     .statusTopic = "IoT/MBGW3/Status", | ||||||
|     .mbusDataTopic = "IoT/MBGW3/Measurement", |     .mbusDataTopic = "IoT/MBGW3/Measurement", | ||||||
|     .syslogServerName = "syslogserver", |     .syslogServerName = "syslogserver", | ||||||
|     .filler = { 0, 0, 0 } |     .filler = { 0, 0 } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -28,5 +29,10 @@ t_configBlock* getConfig() { | |||||||
|  |  | ||||||
|  |  | ||||||
| void configInit() { | void configInit() { | ||||||
|  |     coloredMsg(LOG_BLUE, false, "cfg ci Reading configuration block from eeprom"); | ||||||
|     eepromReadConfigBlock(0, &mainConfigBlock); |     eepromReadConfigBlock(0, &mainConfigBlock); | ||||||
|  |  | ||||||
|  |     if (mainConfigBlock.configMagic != CONFIG_MAGIC) { | ||||||
|  |         coloredMsg(LOG_BLUE, false, "cfg ci Invalid configuration block read from eeprom"); | ||||||
|  |     } | ||||||
| } | } | ||||||
| @@ -7,6 +7,8 @@ | |||||||
| #include <PontCoopScheduler.h> | #include <PontCoopScheduler.h> | ||||||
| #include <utils.h> | #include <utils.h> | ||||||
|  |  | ||||||
|  | #include <assert.h> | ||||||
|  |  | ||||||
| #define HIGH GPIO_PIN_SET | #define HIGH GPIO_PIN_SET | ||||||
| #define LOW GPIO_PIN_RESET | #define LOW GPIO_PIN_RESET | ||||||
|  |  | ||||||
| @@ -48,7 +50,7 @@ static t_deviceStatsBlock deviceStats; | |||||||
| static const uint8_t NUM_OF_BLOCKS = 2; | static const uint8_t NUM_OF_BLOCKS = 2; | ||||||
| static const uint16_t BLOCK_ADDR[] = { 64, 4128 }; | static const uint16_t BLOCK_ADDR[] = { 64, 4128 }; | ||||||
|  |  | ||||||
| static const uint8_t EEPROM_WRITE_BLOCK_SIZE = 32; | #define EEPROM_WRITE_BLOCK_SIZE 32 | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef union { | typedef union { | ||||||
| @@ -128,14 +130,20 @@ static void eepromHourlyUpdateDeviceStats(void *handle) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void eepromReadConfigBlock(uint8_t blockNum, t_configBlock *destConfigBlock) { | void eepromReadConfigBlock(uint8_t blockNum, t_configBlock *destConfigBlock) { | ||||||
|   uint8_t configBlockSizeMod = sizeof(*destConfigBlock) % EEPROM_WRITE_BLOCK_SIZE; |   static_assert((sizeof(*destConfigBlock) % EEPROM_WRITE_BLOCK_SIZE == 0), "config block has illegal size, must be dividable by 32"); | ||||||
|   if (configBlockSizeMod != 0) { |  | ||||||
|     coloredMsg(LOG_RED, false, "eeRCB, config block size must be dividable by 32"); |   for (uint8_t i = 0; i < (sizeof(*destConfigBlock) / EEPROM_WRITE_BLOCK_SIZE); i++) { | ||||||
|     coloredMsg(LOG_RED, false, "eeRCB, current size is %d", sizeof(*destConfigBlock)); |     eepromRead(BLOCK_ADDR[blockNum] + (i * EEPROM_WRITE_BLOCK_SIZE), (uint8_t*) (destConfigBlock + (i * EEPROM_WRITE_BLOCK_SIZE)), EEPROM_WRITE_BLOCK_SIZE); | ||||||
|     coloredMsg(LOG_RED, false, "eeRCB, append %d filler octets", configBlockSizeMod); |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void eepromWriteConfigBlock(uint8_t blockNum, t_configBlock *destConfigBlock) { | ||||||
|  |   for (uint8_t i = 0; i < (sizeof(*destConfigBlock) / EEPROM_WRITE_BLOCK_SIZE); i++) { | ||||||
|  |     eepromWrite(BLOCK_ADDR[blockNum] + (i * EEPROM_WRITE_BLOCK_SIZE), (uint8_t*) (destConfigBlock + (i * EEPROM_WRITE_BLOCK_SIZE)), EEPROM_WRITE_BLOCK_SIZE); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| // active waiting, use only during initialization! | // active waiting, use only during initialization! | ||||||
| static void eepromActiveDelay(uint8_t delay_ms) { | static void eepromActiveDelay(uint8_t delay_ms) { | ||||||
|   activeDelay(delay_ms); |   activeDelay(delay_ms); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user