Files
kunlun/export/inc/sg_lib/proto_mwc.h
2024-09-28 14:24:04 +08:00

261 lines
9.7 KiB
C

/****************************************************************************
Copyright(c) 2019 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 PROTO_MWC_H
#define PROTO_MWC_H
#include "os_types_api.h"
#include "iot_utils_api.h"
#ifdef __cplusplus
extern "C" {
#endif
/* pack for the structures in the whole file */
#pragma pack(push) /* save the pack status */
#pragma pack(1) /* 1 byte align */
/* PHR frame normal sequence number definition */
#define PROTO_MWC_PHR_PROTO_VER (0x01)
/* PSDU frame control field definition */
#define PROTO_MWC_PSDU_CTRL_FIELD (0xCD47)
/* PSDU frame PanID definition */
#define PROTO_MWC_PSDU_PANID_DEFAULT (0xFFFF)
/* PSDU frame config work mode definition */
#define PROTO_MWC_PSDU_WORK_MODE_INVALID (0)
#define PROTO_MWC_PSDU_WORK_MODE_VALID (1)
/* PSDU frame config work time definition */
#define PROTO_MWC_PSDU_WORK_TIME_DEFAULT (0xFFFFFF)
/* default channel */
#define PROTO_MWC_PSDU_CHANNEL_DEFAULT (0)
/* min work channel */
#define PROTO_MWC_PSDU_CHANNEL_MIN (1)
/* max work channel */
#define PROTO_MWC_PSDU_CHANNEL_MAX (32)
/* MWC mac address length */
#define PROTO_MWC_PSDU_ADDR_LEN (7)
/* DAU mac address length */
#define PROTO_MWC_ADDR_LEN (6)
/* PSDU frame cmd identifier char definition */
#define PROTO_MWC_PSDU_CMD_CLCT_RAW (0x40)
#define PROTO_MWC_PSDU_CMD_LP_METER_ACK (0x41)
#define PROTO_MWC_PSDU_CMD_FORWARD_TIME (0x42)
#define PROTO_MWC_PSDU_CMD_FORWARD_DETECT (0x43)
#define PROTO_MWC_PSDU_CMD_CONFIG_LP_METER (0x44)
#define PROTO_MWC_PSDU_CMD_CONFIG_ACK (0x45)
/* raw read meter frame len except 188 proto data len */
#define PROTO_MWC_RAW_MR_FRAME_LEN (sizeof(proto_mwc_phy_phr_t) + \
sizeof(proto_mwc_psdu_header_t) + \
sizeof(proto_mwc_psdu_clct_raw_t) + \
sizeof(proto_mwc_phy_phr_tail_t))
/* config low power meter frame len include phr psdu and crc */
#define PROTO_MWC_CFG_LP_METER_LEN (sizeof(proto_mwc_phy_phr_t) + \
sizeof(proto_mwc_psdu_header_t) + \
sizeof(proto_mwc_psdu_cfg_lp_meter_t) + \
sizeof(proto_mwc_phy_phr_tail_t))
/* the cmd type is PROTO_MWC_PSDU_CMD_CONFIG_ACK */
typedef struct _proto_mwc_psdu_cfg_ack {
/* lp meter network channel id, see PROTO_MWC_PSDU_CHANNEL_DEFAULT */
uint8_t channel_id;
/* low power meter software version */
uint8_t sw_version;
/* reserved */
uint32_t reserved;
} proto_mwc_psdu_cfg_ack_t;
/* config low power meter real time format */
typedef struct _proto_mwc_real_time {
/* second, BCD format */
uint8_t sec;
/* min, BCD format */
uint8_t min;
/* hour, BCD format */
uint8_t hour;
/* week, BCD format */
uint8_t week;
/* day, BCD format */
uint8_t day;
/* month, BCD format */
uint8_t month;
/* year, BCD format */
uint8_t year;
} proto_mwc_real_time_t;
/* the cmd type is PROTO_MWC_PSDU_CMD_CONFIG_LP_METER */
typedef struct _proto_mwc_psdu_cfg_lp_meter {
/* lp meter network channel group, see PROTO_MWC_PSDU_CHANNEL_DEFAULT */
uint8_t channel_group;
/* the DAU addr is lp meter father node addr, little-endian */
uint8_t dau_mac[PROTO_MWC_ADDR_LEN];
/* PanID */
uint16_t panid;
/* slot time */
uint16_t slot_time;
/* real time */
proto_mwc_real_time_t real_time;
/* work mode, 0 - work time invalid, 1 - work time valid */
uint32_t work_mode :8,
/* set working time, 3 byte to 24 bit.
* each bit corresponding to one hour work mode, bit0 is 0 clock.
* 0 - sleep mode, 1 - work mode.
*/
work_time :24;
} proto_mwc_psdu_cfg_lp_meter_t;
/* the cmd type is PROTO_MWC_PSDU_CMD_FORWARD_DETECT */
typedef struct _proto_mwc_psdu_forward_detect {
/* bcast sequence number */
uint8_t bcast_sn;
/* DAU forward bcast scale */
uint16_t fwd_bcast_scale;
/* first received the DAU current slot time */
uint16_t cur_slot;
/* low power meter forward network scale */
uint16_t fwd_nw_scale;
/* low power meter current slot time */
uint16_t lp_meter_cur_slot_time;
} proto_mwc_psdu_forward_detect_t;
/* the cmd type is PROTO_MWC_PSDU_CMD_FORWARD_TIME */
typedef struct _proto_mwc_psdu_forward_time {
/* bcast sequence number */
uint8_t bcast_sn;
/* DAU forward bcast scale */
uint16_t fwd_bcast_scale;
/* current slot time */
uint16_t cur_slot;
/* low power meter forward network scale */
uint16_t fwd_nw_scale;
} proto_mwc_psdu_forward_time_t;
/* the cmd type is PROTO_MWC_PSDU_CMD_LP_METER_ACK */
typedef struct _proto_mwc_psdu_lp_meter_ack {
/* data len */
uint8_t data_len;
/* 188 protocol data */
uint8_t data[0];
} proto_mwc_psdu_lp_meter_ack_t;
/* the cmd type is PROTO_MWC_PSDU_CMD_CLCT_RAW */
typedef struct _proto_mwc_psdu_clct_raw {
/* baud rate */
uint8_t baud_rate;
/* timeout, unit is 1ms */
uint8_t timeout;
/* data len */
uint8_t data_len;
/* 188 protocol data */
uint8_t data[0];
} proto_mwc_psdu_clct_raw_t;
typedef struct _proto_mwc_psdu_data {
/* psdu cmd identifier, see PROTO_MWC_PSDU_CMD_XXX */
uint8_t cmd_type;
/* command data */
uint8_t data[0];
} proto_mwc_psdu_data_t;
typedef struct _proto_mwc_psdu_header {
/* control field, see PROTO_MWC_PSDU_CTRL_FIELD */
uint16_t control;
/* frame sn */
uint8_t sn;
/* PanID, see PROTO_MWC_PSDU_PANID_DEFAULT */
uint16_t panid;
/* destination mac address, little-endian */
uint8_t dest_addr[PROTO_MWC_PSDU_ADDR_LEN];
/* source mac address, little-endian */
uint8_t source_addr[PROTO_MWC_PSDU_ADDR_LEN];
/* payload */
proto_mwc_psdu_data_t payload;
} proto_mwc_psdu_header_t;
/* PHR in mwc physical layer transport protocol */
typedef struct _proto_mwc_phy_phr {
/* data_len includes PSDU len and PHR len except data_len */
uint8_t data_len;
/* channel index, see PROTO_MWC_PSDU_CHANNEL_XXX */
uint8_t channel_idx;
/* protocol version id, BCD format, see PROTO_MWC_PHR_PROTO_VER */
uint8_t proto_ver;
/* xor check sum three bytes in front */
uint8_t phr_cs;
/* PSDU data */
uint8_t data[0];
} proto_mwc_phy_phr_t;
/* PHR tail is behind PSDU */
typedef struct _proto_mwc_phy_phr_tail {
/* CRC-ITU(CRC16-CCITT) check */
uint16_t crc;
} proto_mwc_phy_phr_tail_t;
#pragma pack(pop) /* restore the pack status */
/**
* @brief: handle raw read low power meter cmd.
* @param mr_data: mwc proto data head.
* @param data: raw data of the 188 proto data.
* @param data_len: raw data len of the 188 proto data.
* @param plc_nid: hplc net snid.
* @param lp_meter_mac: lp meter mac, little-Endian,
* length is PROTO_MWC_PSDU_ADDR_LEN.
* @param dau_mac: iic access address, little-Endian,
* length is PROTO_MWC_ADDR_LEN.
* @return ERR_OK - success, ERR_FAIL - data_len invalid.
*/
uint32_t proto_mwc_handle_raw_mr_lp_meter(uint8_t *mr_data, uint8_t *data,
uint16_t data_len, uint32_t plc_nid, uint8_t *lp_meter_mac,
uint8_t *dau_mac);
/**
* @brief: handle config low power meter cmd.
* @param cfg_data: mwc proto data head.
* @param plc_nid: hplc net snid.
* @param panid: unique network id.
* @param slot_id: low power meter module slot time id.
* @param lp_meter_mac: lp meter mac, little-Endian,
* length is PROTO_MWC_PSDU_ADDR_LEN.
* @param dau_mac: iic access address, little-Endian,
* length is PROTO_MWC_ADDR_LEN.
*/
void proto_mwc_handle_cfg_lp_meter(uint8_t *cfg_data, uint32_t plc_nid,
uint16_t panid, uint16_t slot_id, uint8_t *lp_meter_mac, uint8_t *dau_mac);
/*
* @brief: get psdu_data pointer and length check.
* @param len: data len.
* @return: psdu data pointer, NULL - get psdu data fail.
*/
proto_mwc_psdu_data_t *proto_mwc_get_psdu_data(uint8_t *cfg_ack_data,
uint32_t len);
#ifdef __cplusplus
}
#endif
#endif /* PROTO_MWC_H */