/**************************************************************************** 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. ****************************************************************************/ #include "app_main_task.h" #include "app_common.h" /* log print enable: true or false */ static uint8_t g_printf_enbale = true; uint32_t app_get_random_num32(uint32_t min, uint32_t max) { uint32_t random = 0; uint32_t module = max + 1 - min; if (module == 0) { module = 0xffffffff; } random = os_rand(); return (uint32_t)((random % module) + min); } void app_set_freq_band(uint8_t band_id) { app_entity_t *app_entry = NULL; app_entry = iot_main_get_app_entry(); APP_PRINTF("[INF] %s Set band to id:%d", __FUNCTION__, band_id); iot_plc_set_freq_band(app_entry->app_hdl, IOT_PLC_API_REQ_ID_DEFAULT, band_id); return; } void app_set_scan_band_bitmap(uint8_t *band_bitmap) { app_entity_t *app_entry = NULL; app_entry = iot_main_get_app_entry(); APP_PRINT_BUF("[INF]Set scan band bitmap", band_bitmap, IOT_PLC_BAND_BITMAP_SIZE); iot_plc_set_scan_band_bitmap(app_entry->app_hdl, IOT_PLC_API_REQ_ID_DEFAULT, band_bitmap, IOT_PLC_BAND_BITMAP_SIZE); return; } uint8_t *app_get_cco_mac_addr(void) { app_entity_t *app_entry = NULL; app_entry = iot_main_get_app_entry(); return app_entry->dev.cco_addr; } uint8_t *app_get_mac_addr(void) { app_entity_t *app_entry = NULL; app_entry = iot_main_get_app_entry(); return app_entry->dev.mac_addr; } void app_set_mac_addr(uint8_t *mac) { iot_plc_cfg_set_req_t cfg; app_entity_t *app_entry = NULL; app_entry = iot_main_get_app_entry(); APP_PRINTF("[INF] Set Device MAC: "MAC_FMT, MAC_ARG(mac)); os_mem_set(&cfg, 0, sizeof(cfg)); cfg.addr_valid = 1; cfg.addr_type = IOT_PLC_MAC_ADDR_TYPE_MODULE; iot_mac_addr_cpy(cfg.addr, mac); cfg.reset = 1; iot_plc_set_cfg(app_entry->app_hdl, IOT_PLC_API_REQ_ID_DEFAULT, &cfg); } uint8_t app_get_log_enable(void) { return g_printf_enbale; } void app_set_log_enable(uint8_t flag) { g_printf_enbale = !!flag; } uint16_t app_timer_callback(timer_id_t tid, void *arg) { iot_task_msg_t *msg; app_msg_t *task_msg; app_entity_t *app_entry = NULL; app_entry = iot_main_get_app_entry(); msg = iot_task_alloc_msg_with_reserved(app_entry->msg_task.handle, 0); if (NULL == msg) { APP_PRINTF("[ERR] %s Alloc MSG Buffer Failed !!", __FUNCTION__); return ERR_FAIL; } task_msg = (app_msg_t *)msg; task_msg->msg.type = E_MAIN_MSG_FROM_TIMER; task_msg->msg.id = (app_timer_id_e)arg; task_msg->data = NULL; iot_task_queue_msg(app_entry->msg_task.handle, &task_msg->msg, APP_TASK_MSG_PRIO); return ERR_OK; } timer_id_t app_timer_start(app_timer_id_e id, uint32_t period, uint8_t type) { timer_id_t tm_id = 0; /* Create a timer */ tm_id = os_create_timer(IOT_APP_DL645_MID, type, (os_timer_func_t)app_timer_callback, (void *)id); if (0 == tm_id) { APP_PRINTF("[ERR] %s Create Timer Failed !!", __FUNCTION__); return tm_id; } /* Start the timer */ os_start_timer(tm_id, period); return tm_id; } uint32_t app_plc_tx(uint8_t *data, uint16_t data_length, uint8_t *dst_addr, uint16_t id, append_tx_info_t *tx_info) { iot_pkt_t *pkt; uint8_t *frame; uint16_t frame_length; app_custom_data *custom_data; append_tx_info_t def_tx_info = {0}; if (NULL == data || 0 == data_length) { APP_PRINTF("[ERR] %s Frame is NULL !!", __FUNCTION__); return ERR_FAIL; } if(!iot_mac_addr_valid(dst_addr)) { APP_PRINTF("[ERR] invalid dst addr, data[%d] dropped !!", data_length); return ERR_FAIL; } frame_length = data_length + sizeof(app_custom_data) + sizeof(append_tx_info_t); if (NULL == (pkt = iot_pkt_alloc(frame_length, IOT_APP_DEMO_MID))) { APP_PRINTF("[ERR] %s Packet Alloc Failed !!", __FUNCTION__); return ERR_FAIL; } frame = iot_pkt_put(pkt, frame_length); if (tx_info) { /* fill tx_info if trans not NULL, else use default 0 */ os_mem_cpy(frame, tx_info, sizeof(append_tx_info_t)); } else { os_mem_cpy(frame, &def_tx_info, sizeof(append_tx_info_t)); } frame += sizeof(append_tx_info_t); custom_data = (app_custom_data*)frame; custom_data->id = id; iot_mac_addr_cpy(custom_data->mac, dst_addr); iot_mac_addr_reverse(custom_data->mac); frame += sizeof(app_custom_data); os_mem_cpy(frame, data, data_length); APP_PRINT_BUF("[PLC_TX]", iot_pkt_data(pkt), iot_pkt_data_len(pkt)); APP_PRINTF("pkt id[%x] will be sent to "MAC_FMT, custom_data->id, MAC_ARG(custom_data->mac)); if (ERR_OK != iot_main_task_msg_post(E_MAIN_MSG_FROM_MAINTASK, E_MAIN_MSG_ID_645PKT_TO_PLC, (void*)pkt)) { APP_PRINTF("[ERR] %s Post MSG Failed !!", __FUNCTION__); iot_pkt_free(pkt); return ERR_FAIL; } return ERR_OK; }