261 lines
9.7 KiB
C
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 */
|