Files
kunlun/app/smart_meter/inc/iot_dm_flash.h
2024-09-28 14:24:04 +08:00

402 lines
17 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef IOT_DEV_MGMT_FLASH_DATA_H
#define IOT_DEV_MGMT_FLASH_DATA_H
/*
----------------------------------------------------------------------
客户数据类型取值值范围:
A.1 : 秒级时间占6Bytes
A.5 : -799.9~799.9占2Bytes
A.7 : 0~999占2Bytes
A.9 : -39.9999~39.9999 or -399.999~399.999占3Bytes
A.11: 0~999999.99占4Bytes
A.25:-799.999~799.999占3Bytes。
----------------------------------------------------------------------
FLASH必须数据有1. 阈值2.表底值; 3. 事件;
4.负荷记录15分钟曲线每15分钟采集一次负荷数据
详细数据:
1. 阈值
A. 待机电流A.25工作电流A.25额定功率A.9
2. 表底值
A. 表底值A.11
3. 事件C~F项使用单相/三相)
A. 类型1byteB. 时间A.1C. 电压A.7D. 电流A.25
E. 有功功率A.9F. 功率因数A.5G. 表底值A.11
4. 负荷记录同第3项中的B~G项
其中1、2项数只有一个数据记录可按实际占用字节数对其分配空间大小。
第3项是在每个事件发生时记录当前负荷数据有N个数据记录此部分数据量较大。
第4项是每15分钟记录一次的负荷数据有N个数据记录此部分数据量较大。
所以对于FLASH存储的数据只需要对第3项与第4项的数据进行空间优化。对比两者
数据,发现只需要优化负荷记录数据即可。
----------------------------------------------------------------------
负荷数据:
数据量 字节数 对齐字节数
时间 : F FF FF 2.5 4
电压 : FF FF 2 2
电流 : F FF FF 2.5 4
功率 : F FF FF 2.5 4
因数 : FF FF 2 2
表底 : F FF FF FF 3.5 4
总计 : 16(ROUNDUP(15)) 20
由以上统计负荷数据若仅按照字节数紧凑排列每条记录占用16字节若按照对齐
方式排列则需要20字节2者相差25%的数据量。按照3相半年每天2事件的频率来算
数据量相差206KB左右。若需要省空间后期可以优化。
----------------------------------------------------------------------
FLASH LAYOUT:
--- -------------------------------
* | flash header | Descript for flash.
* |---------------------------|
* | event ctrl blk desc | Descript for event control block.
* |---------------------------|
* | load ctrl blk desc | Descript for load control block.
* |---------------------------|
* | event rec blk desc | Descript for event record block.
* |---------------------------|
* | load rec blk desc | Descript for load record block.
* |---------------------------|
* | prv event ctrl blk desc | Descript for private event control block.
* |---------------------------|
* | prv event rec blk desc | Descript for private event record block.
* |---------------------------|
* | ... | Reserved space.
* |---------------------------|
* | event day item | Control block for event day item.
* |---------------------------|
* | load day item | Control block for load day item.
* |---------------------------|
* | event record | Record block for event.
* |---------------------------|
* | load record | Record block for load.
* |---------------------------|
* | prv event day item | Control block for private event day item.
* |---------------------------|
* | prv event record | Record block for private event.
* |---------------------------|
* | ... | Reserved space.
* |---------------------------|
* | undefined prv blk | Some other private block.
* --- |---------------------------|
*/
/* ******************** common ******************* */
/* Length of chip manufacturer name. */
#define IOT_DM_MANUFACTURER_NAME_LEN 17
/* Flash / sector / page size. */
#define IOT_DM_SIZE_nB(n) (n)
#define IOT_DM_SIZE_nKB(n) (1024 * (n))
#define IOT_DM_SIZE_nMB(n) (1024 * 1024 * (n))
/* Description of a flash block. */
typedef struct _iot_dm_flash_block_descriptor_t {
uint32_t start; /* Start of block, offset from base of flash chip. */
uint32_t size; /* Size in bytes. */
}iot_dm_flash_block_desc_t;
/* Description of a flash block used. */
typedef struct _iot_dm_flash_block_usage_descriptor_t {
uint32_t start; /* Start of block, offset from base of flash chip. */
uint32_t size; /* Size in bytes. */
uint32_t used_size; /* Used size in bytes. */
}iot_dm_flash_block_usage_desc_t;
/* Information of this flash chip. */
typedef struct _iot_dm_flash_chip_information_t {
/* Manufacturer name */
uint8_t manufacturer[IOT_DM_MANUFACTURER_NAME_LEN];
/* Manufacturer ID. */
uint8_t m_id;
/* Device ID */
uint16_t d_id;
/* Size of flash. */
uint32_t chip_size;
/* Erase sector size. */
uint32_t sec_size;
/* Read / write page size. */
uint32_t page_size;
}iot_dm_flash_chip_t;
/* Type of blocks in flash chip. */
typedef enum _iot_dm_flash_block_type_e {
/*
This block holds information about every block, like offset from flash base,
and block size, also some variable which with value changed hardly.
If this block damaged, only this block will be erased and restored with
default values. See iot_dm_flash_t.
*/
DM_FLASH_BLOCK_HEADER, /* Block of chip header. */
/*
This block holds the value of some variables that changed easily. Considering
about times for erasing/writing flash are limited, a new variable will not
be written on the fixed position on chip but a new offset next to the old
position. When the last position was written, the first position will be written
for next new variable. Every time system boots up, flash module will search
the newest variables on the flash.
If this block damaged, all records (data of event / load) will be lost,
because there are some variables designed to tell the information about every
control-block. See iot_dm_vari_t.
*/
DM_FLASH_BLOCK_VARIABLE, /* Variable block, for data easy to change. */
/*
Those following blocks is named control-block which hold the information
for a day with timestamp and position of first record on record-block.
Item on those blocks is written in cycle like block of DM_FLASH_BLOCK_VARIABLE.
if this block damaged, related type of day-information and records will be lost.
*/
DM_FLASH_BLOCK_LOAD_CTRL, /* Control block of load. */
DM_FLASH_BLOCK_EVENT_CTRL, /* Control block of event. */
DM_FLASH_BLOCK_PRIV_EVENT_CTRL, /* Control block of private event. */
/*
Those following blocks is named record-block which hold all records.
Item on those blocks is written in cycle like block of DM_FLASH_BLOCK_VARIABLE.
if this block damaged, related type of records will be lost.
*/
DM_FLASH_BLOCK_LOAD_REC, /* Record block of load. */
DM_FLASH_BLOCK_EVENT_REC, /* Record block of event. */
DM_FLASH_BLOCK_PRIV_EVENT_REC, /* Record block of private event. */
/*
Not used.
*/
DM_FLASH_BLOCK_PRV_DATA, /* Private data used. */
DM_FLASH_BLOCK_MAX
}iot_dm_flash_block_type_e;
/* ******************** event ******************* */
/* Item of each event. In event record block. */
typedef struct _iot_dm_flash_event_record_item_t {
uint32_t etype:4; /* event type */
uint32_t state:8; /* state type */
uint32_t seconds:20; /* seconds from 00:00:00 of that day. */
uint16_t v; /* voltage, 0.1V */
int16_t f; /* power factor, 0.1% */
int32_t i; /* electrical current, mA */
uint32_t p; /* active power, 0.1mW(1mA * 0.1V) */
uint32_t w; /* work, 1mKW*h(1A * 1V * 1h) */
}iot_dm_event_record_t;
/* Summury of event for each day.In event control block. */
typedef struct _iot_em_flash_event_day_item_t {
/* First item index from event record block. */
uint32_t index; /* keep first item of struct to check valid */
/* Timestamp of this day. */
uint32_t timestamp;
}iot_dm_event_day_t;
/* ******************** load-record ******************* */
/* Item of each load data. In load record block. */
typedef struct _iot_dm_flash_load_record_item_t {
uint32_t reserved:12; /* reserved bits */
uint32_t seconds:20; /* seconds from 00:00:00 of that day. */
uint16_t v; /* voltage, 0.1V */
int16_t f; /* power factor, 0.1% */
int32_t i; /* electrical current, mA */
uint32_t p; /* active power, 0.1mW(1mA * 0.1V) */
uint32_t w; /* work, 1mKw*h(1A * 1V * 1h) */
}iot_dm_load_record_t;
/* Summury of load data for each day.In load data control block. */
typedef struct _iot_dm_flash_load_day_item_t {
/* First item index from load record block. */
uint32_t index; /* keep first item of struct to check valid */
/* Timestamp of this day. */
uint32_t timestamp;
}iot_dm_load_day_t;
/* ******************** meter block data ********************** */
/* Threshold data. */
typedef struct _iot_dm_flash_threshold_t {
uint32_t i_standby; /* Current threshold for standby.*/
uint32_t i_work; /* Current threshold for working.*/
uint32_t p_trap; /* Power threshold for runing in trap.*/
}iot_dm_threshold_t;
/* Data of meter. In header block. */
typedef struct _iot_dm_flash_meter_data_t {
iot_dm_threshold_t threshold; /* Threshold for triggering event. */
}iot_dm_meter_t;
/* Type of threshold, reference to iot_dm_threshold_t. */
typedef enum _iot_dm_flash_threshold_e {
DM_FLASH_THRESHOLD_CURRENT_STANDBY,
DM_FLASH_THRESHOLD_CURRENT_WORKING,
DM_FLASH_THRESHOLD_POWER_TRAPPING,
DM_FLASH_THRESHOLD_TIME_TRAPPING_WARN
}iot_dm_flash_threshold_e;
/* ********************* Variable block ******************* */
typedef struct _iot_dm_block_information_t {
volatile uint16_t item_rec_idx; /* The index of last item written on record block. */
volatile uint16_t item_ctrl_idx; /* The index of last item written on contrl block. */
volatile uint32_t item_timestamp; /* The time last item written on contrl block. */
}iot_dm_block_info_t;
/* roll write in variable block. size = 28B, 146 item per sector. */
typedef struct _iot_dm_flash_vari_data_t {
iot_dm_block_info_t load; /* for load control and load record block. */
iot_dm_block_info_t event; /* for event control and load record block. */
iot_dm_block_info_t priv_event; /* for private event control and load record block. */
uint32_t meter_base; /* Work of meter. WH(1A * 1V * 1h). */
}iot_dm_vari_t;
/* ******************** Flash header ********************** */
#define IOT_DM_FLASH_HEADER_MAGIC 0xD5C6B7A8
/* Top of flash. In header block */
typedef struct _iot_dm_flash_t {
/* Magic number, 0xD5C6B7A8.*/
uint32_t magic;
/* Data of meter. */
iot_dm_meter_t meter;
/* block information. */
iot_dm_flash_block_desc_t block[DM_FLASH_BLOCK_MAX];
}iot_dm_flash_t;
/* ******************** Flash export API ********************** */
/**
* @brief iot_dm_flash_init_module() - Initialize the extern flash module.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_init_module(void);
/**
* @brief iot_dm_flash_get_chipinfo() - Get information of flash chip.
* @param info: buffer to store information.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_get_chipinfo(iot_dm_flash_chip_t *info);
/**
* @brief iot_dm_flash_get_chipstatus() - Get block information of flash chip.
* @param block: Type of block, reference to iot_dm_flash_block_type_e.
* if block = DM_FLASH_BLOCK_MAX, will return information of all blocks.
* @param block_info: buffer to store information.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_get_blockinfo(uint32_t block, iot_dm_flash_block_usage_desc_t block_info[]);
/**
* @brief iot_dm_flash_write_event() - Store an event record in flash.
* @param timestamp: Unix timestamp, start from 1970-01-01 00:00:00.
* @param record: An event record to store.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_write_event(uint32_t timestamp, iot_dm_event_record_t *record);
/**
* @brief iot_dm_flash_write_load() - Store an load record in flash.
* @param timestamp: Unix timestamp, start from 1970-01-01 00:00:00.
* @param record: A load record to store.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_write_load(uint32_t timestamp, iot_dm_load_record_t *record);
/**
* @brief iot_dm_flash_write_threshold() - Store an threshold in flash.
* @param threshold: Value of threshold.
* Unit : 1MA for current, 1W for power, 1S for time.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_write_threshold(iot_dm_threshold_t *threshold);
/**
* @brief iot_dm_flash_write_meter_base() - Store the meter base in flash.
* @param base_value: Base value to store. Unit : 1WH (1A * 1V * 1H)
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_write_meter_base(uint32_t base_value);
/**
* @brief iot_dm_flash_read_event_num_of_day() - Get event record number on given day.
* @param timestamp: Time of a day, Unix timestamp, start from 1970-01-01 00:00:00.
* @param num: Buffer to store the number.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_read_event_num_of_day(uint32_t timestamp, uint32_t *num);
/**
* @brief iot_dm_flash_read_load_num_of_day() - Get load record number on given day.
* @param timestamp: Time of a day, Unix timestamp, start from 1970-01-01 00:00:00.
* @param num: Buffer to store the number.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_read_load_num_of_day(uint32_t timestamp, uint32_t *num);
/**
* @brief iot_dm_flash_read_event() - Get event record(s) from flash.
* @param timestamp: From when, Unix timestamp, start from 1970-01-01 00:00:00.
* @param start_idx: Start index of event record item, start from 0 to end_idx.
* @param end_idx: End index of event record item, start from start_idx to max.
* @param record: Event record buffer.
* @param valid_count: Event record returned in this buffer.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_read_event(uint32_t timestamp, uint32_t start_idx,
uint32_t end_idx, iot_dm_event_record_t *record, uint32_t *valid_count);
/**
* @brief iot_dm_flash_read_load() - read count of load records just behind the time
* that timestamp tells. cause all records are on the same day,
* *valid_count may be little than count.
* @param timestamp: From when, Unix timestamp, start from 1970-01-01 00:00:00.
* @param count: count of records that requests.
* @param record: load record buffer.
* @param valid_count: Event record returned in this buffer.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_read_load(uint32_t timestamp, uint32_t count,
iot_dm_load_record_t *record, uint32_t *valid_count);
/**
* @brief iot_dm_flash_read_threshold() - Get an threshold from flash.
* @param threshold: Buffer for threshold.
* Unit : 1MA for current, 1W for power, 1S for time.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_read_threshold(iot_dm_threshold_t *threshold);
/**
* @brief iot_dm_flash_read_meter_base() - Get the meter base from flash.
* @param base_value: Buffer for base value. Unit : 1WH (1A * 1V * 1H)
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_read_meter_base(uint32_t *base_value);
/**
* @brief iot_dm_flash_read_last_powerdown_timestamp() - Get last poweroff time.
* @param timestamp: Buffer for timestamp returned.
* @return ERR_FAIL -- Operation failed.
* @return ERR_OK -- Operation Successful.
*/
uint32_t iot_dm_flash_read_last_record_timestamp(uint32_t *timestamp);
#endif