402 lines
17 KiB
C
402 lines
17 KiB
C
#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. 类型(1byte),B. 时间(A.1),C. 电压(A.7),D. 电流(A.25),
|
||
E. 有功功率(A.9),F. 功率因数(A.5),G. 表底值(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
|