inwudriver-weibo/app/mrs/sta/mrs_sta_startup.c

105 lines
3.3 KiB
C

/*
* Copyright (c) CompanyNameMagicTag 2019-2020. All rights reserved.
* Description: MRS STA startup handle.
*/
#include "mrs_sta_startup.h"
#include "mrs_sta_srv.h"
#include "mrs_sta_plc.h"
#include "mrs_sta_simu_meter.h"
#include "mrs_sta_io.h"
#include "mrs_common_tools.h"
#include "mrs_proto_645.h"
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
td_u8 g_startup_detect_retry = 0;
td_u8 g_startup_mr_frame[] = { 0x68, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x68, 0x13, 0x00, 0xdf, 0x16 };
/* processing for recieving reply */
td_void mrs_sta_startup_rx(EXT_CONST mrs_mr_queue_item *item, td_pbyte data, td_u16 data_len);
td_void mrs_sta_startup_detect(td_void)
{
mrs_sta_srv_ctx *sta = mrs_sta_get_srv_ctx();
mrs_mr_queue_item *item = TD_NULL;
if (mrs_sta_get_status() != MRS_STA_STATUS_INIT) {
return;
}
if (mrs_simu_meter_flag() == TD_TRUE) {
return;
}
item = (mrs_mr_queue_item *)mrs_queue_top(&sta->mr_queue.mr_queue);
if ((item != TD_NULL) && (item->id == MRS_STA_ITEM_ID_DETECT)) {
mrs_sta_try_dequeue(&sta->mr_queue);
}
/* request for meter address */
item = mrs_malloc(sizeof(mrs_mr_queue_item) + sizeof(g_startup_mr_frame));
if (item == TD_NULL) {
return;
}
(td_void) memset_s(item, sizeof(mrs_mr_queue_item) + sizeof(g_startup_mr_frame),
0, sizeof(mrs_mr_queue_item) + sizeof(g_startup_mr_frame));
item->id = MRS_STA_ITEM_ID_DETECT;
item->data_len = sizeof(g_startup_mr_frame);
item->timeout = MRS_STARTUP_DETECT_TIMEOUT;
item->rx_handle = mrs_sta_startup_rx;
if (memcpy_s(item->data, item->data_len, g_startup_mr_frame, sizeof(g_startup_mr_frame)) != EOK) {
mrs_free(item);
return;
}
if (mrs_sta_try_enqueue(&sta->mr_queue, item) != TD_TRUE) {
mrs_free(item);
return;
}
mrs_sta_queue_notify();
mrs_timer_start(MRS_TIMER_ID_STA_INIT, MRS_STARTUP_DETECT_INTERVAL, EXT_TIMER_TYPE_ONCE);
}
td_void mrs_sta_startup_rx(EXT_CONST mrs_mr_queue_item *item, td_pbyte data, td_u16 data_len)
{
mrs_proto_645_frame_inf frame;
mrs_sta_srv_ctx *sta = mrs_sta_get_srv_ctx();
ext_unref_param(item);
(td_void) memset_s(&frame, sizeof(frame), 0, sizeof(frame));
if (mrs_proto_645_decode_frame(data, data_len, &frame) != EXT_ERR_SUCCESS) {
return;
}
if (((frame.ctrl & 0x1f) != 0x13) || (frame.data_len != MRS_METER_ADDR_LEN)) {
return;
}
mrs_timer_stop(MRS_TIMER_ID_STA_INIT);
mrs_sta_set_status(MRS_STA_STATUS_MR);
mrs_sta_led_offline();
if (memcpy_s(sta->meter, sizeof(sta->meter), frame.data, frame.data_len) != EOK) {
return;
}
mrs_proto_645_data_decode(sta->meter, sizeof(sta->meter));
sta->protocol = METER_PROTO_645_2007;
sta->baudrate = MRS_STA_DEFAULT_BAUDRATE;
mrs_printf("Set meter addr: %02X%02X%02X%02X%02X%02X\n",
sta->meter[5], sta->meter[4], /* index 5&4 */
sta->meter[3], sta->meter[2], /* index 3&2 */
sta->meter[1], sta->meter[0]); /* index 1&0 */
/* set address */
mrs_convert_meter_to_mac(sta->meter, sizeof(sta->meter), sta->mac, sizeof(sta->mac));
mrs_sta_set_mac_addr(sta->mac);
}
#endif /* defined(PRODUCT_CFG_PRODUCT_TYPE_STA) */