149 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************************
 | |
| 
 | |
| Copyright(c) 2024 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | |
| 
 | |
| This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | |
| be copied by any method or incorporated into another program without
 | |
| the express written consent of Aerospace C.Power. This Information or any portion
 | |
| thereof remains the property of Aerospace C.Power. The Information contained herein
 | |
| is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | |
| liability for its use in any way and conveys no license or title under
 | |
| any patent or copyright and makes no representation or warranty that this
 | |
| Information is free from patent or copyright infringement.
 | |
| 
 | |
| ****************************************************************************/
 | |
| #ifndef IOT_SUNSOLAR_REC_H
 | |
| #define IOT_SUNSOLAR_REC_H
 | |
| 
 | |
| /* os shim includes */
 | |
| #include "os_types_api.h"
 | |
| 
 | |
| /* iot common header files */
 | |
| #include "iot_pkt_api.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /* max pv number of this module. */
 | |
| #define LOCAL_PV_MAX_REC                                    (2)
 | |
| 
 | |
| /* every 1 minute freeze curve data unit:minutes */
 | |
| #define IOT_SOLR_REC_CHECK_CRUVE_FROZEN_TIME                (1)
 | |
| 
 | |
| /* record frozen data count, one day, every minute */
 | |
| #define IOT_SOLR_REC_FROZEN_DATA_CNT                        (24 * 60)
 | |
| 
 | |
| #pragma pack(push)  /* save the pack status */
 | |
| #pragma pack(1)     /* 1 byte align */
 | |
| 
 | |
| /* frozen data block */
 | |
| typedef struct _iot_sunsolar_rec_frozen_block {
 | |
|     /* frozen voltage uint:0.1v */
 | |
|     uint16_t            volt[LOCAL_PV_MAX_REC];
 | |
|     /* current unit:1mA */
 | |
|     uint16_t            current;
 | |
|     /* temperature 0.1c */
 | |
|     int16_t             temp;
 | |
|     /* rsd state */
 | |
|     struct {
 | |
|         /* config rsd status, 0xA:open, 0x5:close. */
 | |
|         uint8_t         last_cmd     :4,
 | |
|         /* real rsd status, 0xA:open, 0x5:close. */
 | |
|                         real_status  :4;
 | |
|     } rsd_state[LOCAL_PV_MAX_REC];
 | |
|     /* rsd voltage uint:0.1v */
 | |
|     uint16_t            rsd_volt[LOCAL_PV_MAX_REC];
 | |
|     /* snr */
 | |
|     int8_t              snr;
 | |
|     /* rssi */
 | |
|     uint8_t             rssi;
 | |
|     /* period power out: 0.01Wh */
 | |
|     uint32_t            period_energy[LOCAL_PV_MAX_REC];
 | |
|     /* history total power out: 1Wh */
 | |
|     uint32_t            total_energy[LOCAL_PV_MAX_REC];
 | |
|     /* reboot count */
 | |
|     uint16_t            reboot_cnt;
 | |
|     /* online status */
 | |
|     uint8_t             plclink_state;
 | |
| } iot_sunsolar_rec_frozen_block_t;
 | |
| 
 | |
| /* froezen recording description */
 | |
| typedef struct {
 | |
|     /* content of frozen recording */
 | |
|     iot_sunsolar_rec_frozen_block_t rec;
 | |
|      /* flag to mark if frozen recording is valid */
 | |
|     uint8_t valid;
 | |
| } iot_sunsolar_rec_frozen_desc_t;
 | |
| 
 | |
| /* record head */
 | |
| typedef struct _iot_sunsolar_rec_head {
 | |
|     /* crc16 from rec_seq to data */
 | |
|     uint16_t            crc;
 | |
|     /* record sequence n umber */
 | |
|     uint32_t            rec_seq;
 | |
|     /* time stamp */
 | |
|     uint32_t            ts;
 | |
|     /* block data */
 | |
|     uint8_t             data[0];
 | |
| } iot_sunsolar_rec_head_t;
 | |
| 
 | |
| #pragma pack(pop)
 | |
| 
 | |
| /* record region descriptor */
 | |
| typedef struct iot_sunsolar_rec_region_desc {
 | |
|     /* record entry size, contains record headers */
 | |
|     uint32_t            entry_size;
 | |
|     /* region start position */
 | |
|     uint32_t            start;
 | |
|     /* max count of entrys current region can save */
 | |
|     uint16_t            max_cnt;
 | |
|     /* recording depth */
 | |
|     uint32_t            rec_depth;
 | |
|     /* record serial number will assigned */
 | |
|     uint32_t            seq;
 | |
|     /* index of the latest record increased one */
 | |
|     uint32_t            new_idx;
 | |
|     /* index of the oldest record */
 | |
|     uint32_t            oldest_idx;
 | |
|     /* timestamp of the latest record */
 | |
|     uint32_t            last_rec_ts;
 | |
| } iot_sunsolar_rec_region_desc_t;
 | |
| 
 | |
| /**
 | |
|  * @brief iot_sunsolar_frozen_data_rec() -  record frozen data
 | |
|  * @param tm: rtc time
 | |
|  */
 | |
| void iot_sunsolar_frozen_data_rec(iot_time_tm_t *tm);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_sunsolar_frozen_rec_read() - reading frozen record.
 | |
|  * @param ts: specify the start time,  and return the time of the first point of
 | |
|  *            successful lookup
 | |
|  * @param inteval: time interval, unit is second.
 | |
|  * @param n: specifies the number of points to be read, returns the number of
 | |
|  *           points actually read.
 | |
|  * @param pkt: the pointer of pkt containing read result.
 | |
|  * @retval: ERR_OK - successfully, otherwise - error code
 | |
|  */
 | |
| uint32_t iot_sunsolar_frozen_rec_read(uint32_t *ts, uint32_t inteval,
 | |
|     uint8_t *n, iot_pkt_t **pkt);
 | |
| 
 | |
| /**
 | |
|  * @brief    iot_sunsolar_rec_init() - init sunsolar record specific operation.
 | |
|  * @return:  0    -   for success case
 | |
|  * @return:  otherwise   -   error number
 | |
|  */
 | |
| uint32_t iot_sunsolar_rec_init();
 | |
| 
 | |
| /**
 | |
|  * @brief iot_sunsolar_rec_deinit() - deinit sunsolar record specific operation.
 | |
|  */
 | |
| void iot_sunsolar_rec_deinit();
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* IOT_SUNSOLAR_REC_H */
 |