THB2/bthome_phy6222/source/logger.c

222 lines
6.1 KiB
C

/*
* logger.c
*
* Created on: 29.01.2021
* Author: pvvx
*/
#include "config.h"
#if (DEV_SERVICES & SERVICE_HISTORY)
#include "flash.h"
#include "flash_eep.h"
#include "logger.h"
#include "sensors.h"
#include "cmd_parser.h"
#define RAM
#define MEMO_SEC_COUNT ((FLASH_ADDR_END_MEMO - FLASH_ADDR_START_MEMO) / FLASH_SECTOR_SIZE) // 76 sectors
#define MEMO_SEC_RECS ((FLASH_SECTOR_SIZE-_memo_head_size)/_memo_blk_size) // - sector: 409 records
//#define MEMO_REC_COUNT (MEMO_SEC_RECS*(MEMO_SEC_COUNT-1))// max (76-1)*409 = 30675 records
#define _flash_read(a,b,c) memcpy((void *)c, (void *)(FLASH_BASE_ADDR + (unsigned int)a), b) // _flash_read(rdaddr, len, pbuf);
#define _flash_erase_sector(addr) hal_flash_erase_sector(FLASH_BASE_ADDR + addr)
#define _flash_write_dword(addr, wd) flash_write_word(FLASH_BASE_ADDR + addr,wd)
#define _flash_write(a,l,b) hal_flash_write(FLASH_BASE_ADDR + a,(unsigned char *)b, l)
typedef struct _summ_data_t {
uint32_t battery_mv; // mV
int32_t temp; // x 0.01 C
uint32_t humi; // x 0.01 %
uint32_t count;
} summ_data_t;
RAM summ_data_t summ_data;
RAM memo_inf_t memo;
RAM memo_rd_t rd_memo;
static uint32_t test_next_memo_sec_addr(uint32_t faddr) {
uint32_t mfaddr = faddr;
if (mfaddr >= FLASH_ADDR_END_MEMO)
mfaddr = FLASH_ADDR_START_MEMO;
else if (mfaddr < FLASH_ADDR_START_MEMO)
mfaddr = FLASH_ADDR_END_MEMO - FLASH_SECTOR_SIZE;
return mfaddr;
}
static void memo_sec_init(uint32_t faddr) {
uint32_t mfaddr = faddr;
mfaddr &= ~(FLASH_SECTOR_SIZE-1);
_flash_erase_sector(mfaddr);
_flash_write_dword(mfaddr, MEMO_SEC_ID);
memo.faddr = mfaddr + _memo_head_size;
memo.cnt_cur_sec = 0;
}
static void memo_sec_close(uint32_t faddr) {
uint32_t mfaddr = faddr;
uint16_t flg = 0;
mfaddr &= ~(FLASH_SECTOR_SIZE-1);
_flash_write(mfaddr + _memo_head_size - 2, 2, &flg); // sizeof(flg), sizeof(flg), &flg);
memo_sec_init(test_next_memo_sec_addr(mfaddr + FLASH_SECTOR_SIZE));
}
#if 0
void memo_init_count(void) {
memo_head_t mhs;
uint32_t cnt, i = 0;
uint32_t faddr = memo.faddr & (~(FLASH_SECTOR_SIZE-1));
cnt = memo.faddr - faddr - _memo_head_size; // смещение в секторе
cnt /= _memo_blk_size;
do {
faddr = test_next_memo_sec_addr(faddr - FLASH_SECTOR_SIZE);
_flash_read(faddr, &mhs, _memo_head_size);
i++;
} while (mhs.id == MEMO_SEC_ID && mhs.flg == 0 && i < MEMO_SEC_COUNT);
cnt += i *MEMO_SEC_RECS;
memo.count = cnt;
}
#endif
static void restore_time(uint32_t time) {
if(time && clkt.utc_time_sec == 0) {
clkt.utc_time_sec = time;
clkt.utc_time_add = 1024;
clkt.utc_time_tik = clock_time_rtc();
}
}
void memo_init(void) {
memo_head_t mhs;
uint32_t tmp, fsec_end, time = 0;
uint32_t faddr = FLASH_ADDR_START_MEMO;
memo.cnt_cur_sec = 0;
while (faddr < FLASH_ADDR_END_MEMO) {
_flash_read(faddr, _memo_head_size, &mhs);
if (mhs.id != MEMO_SEC_ID) {
memo_sec_init(faddr);
restore_time(time);
return;
} else if (mhs.flg == 0xffff) {
fsec_end = faddr + FLASH_SECTOR_SIZE;
faddr += _memo_head_size;
while (faddr < fsec_end) {
_flash_read(faddr, sizeof(tmp), &tmp);
if (tmp == 0xffffffff) {
memo.faddr = faddr;
restore_time(time);
return;
}
if(time < tmp)
time = tmp;
memo.cnt_cur_sec++;
faddr += _memo_blk_size;
}
memo_sec_close(fsec_end - FLASH_SECTOR_SIZE);
restore_time(time);
return;
}
faddr += FLASH_SECTOR_SIZE;
}
memo_sec_init(FLASH_ADDR_START_MEMO);
restore_time(time);
return;
}
void clear_memo(void) {
uint32_t tmp;
uint32_t faddr = FLASH_ADDR_START_MEMO + FLASH_SECTOR_SIZE;
memo.cnt_cur_sec = 0;
while (faddr < FLASH_ADDR_END_MEMO) {
_flash_read(faddr, 4, &tmp); // sizeof(tmp), &tmp);
if (tmp == MEMO_SEC_ID)
_flash_erase_sector(faddr);
faddr += FLASH_SECTOR_SIZE;
}
memo_sec_init(FLASH_ADDR_START_MEMO);
return;
}
unsigned get_memo(uint32_t bnum, pmemo_blk_t p) {
memo_head_t mhs;
uint32_t faddr;
faddr = rd_memo.saved.faddr & (~(FLASH_SECTOR_SIZE-1));
if (bnum > rd_memo.saved.cnt_cur_sec) {
bnum -= rd_memo.saved.cnt_cur_sec;
faddr -= FLASH_SECTOR_SIZE;
if (faddr < FLASH_ADDR_START_MEMO)
faddr = FLASH_ADDR_END_MEMO - FLASH_SECTOR_SIZE;
while (bnum > MEMO_SEC_RECS) {
bnum -= MEMO_SEC_RECS;
faddr -= FLASH_SECTOR_SIZE;
if (faddr < FLASH_ADDR_START_MEMO)
faddr = FLASH_ADDR_END_MEMO - FLASH_SECTOR_SIZE;
}
bnum = MEMO_SEC_RECS - bnum;
_flash_read(faddr, _memo_head_size, &mhs);
if (mhs.id != MEMO_SEC_ID || mhs.flg != 0)
return 0;
} else {
bnum = rd_memo.saved.cnt_cur_sec - bnum;
}
faddr += _memo_head_size; // смещение в секторе
faddr += bnum * _memo_blk_size; // * size memo
_flash_read(faddr, _memo_blk_size, p);
return 1;
}
int send_memo_blk(uint8_t * send_buf) {
int olen = 0;
send_buf[0] = CMD_ID_LOGGER;
if (++rd_memo.cur > rd_memo.cnt || (!get_memo(rd_memo.cur, (pmemo_blk_t)&send_buf[3]))) {
send_buf[1] = 0;
send_buf[2] = 0;
olen = 3;
rd_memo.cnt = 0;
} else {
send_buf[1] = rd_memo.cur;
send_buf[2] = rd_memo.cur >> 8;
olen = 3 + _memo_blk_size;
}
return olen;
}
// if (cfg.averaging_measurements != 0) write_memo();
void write_memo(void) {
memo_blk_t mblk;
if (cfg.averaging_measurements == 1) {
mblk.temp = measured_data.temp;
mblk.humi = measured_data.humi;
mblk.vbat = measured_data.battery_mv;
} else {
summ_data.temp += measured_data.temp;
summ_data.humi += measured_data.humi;
summ_data.battery_mv += measured_data.battery_mv;
summ_data.count++;
if (cfg.averaging_measurements > summ_data.count)
return;
mblk.temp = (int16_t)(summ_data.temp/(int32_t)summ_data.count);
mblk.humi = (uint16_t)(summ_data.humi/summ_data.count);
mblk.vbat = (uint16_t)(summ_data.battery_mv/summ_data.count);
memset(&summ_data, 0, sizeof(summ_data));
}
mblk.time = clkt.utc_time_sec;
uint32_t faddr = memo.faddr;
if (!faddr) {
memo_init();
faddr = memo.faddr;
}
_flash_write(faddr, _memo_blk_size, &mblk);
faddr += _memo_blk_size;
faddr &= (~(FLASH_SECTOR_SIZE-1));
if (memo.cnt_cur_sec >= MEMO_SEC_RECS - 1 ||
(memo.faddr & (~(FLASH_SECTOR_SIZE-1))) != faddr) {
memo_sec_close(memo.faddr);
} else {
memo.cnt_cur_sec++;
memo.faddr += _memo_blk_size;
}
}
#endif // defined(DEV_SERVICES) && (DEV_SERVICES & SERVICE_HISTORY)