#include "bsp_ml307r.h" #include "at_chat.h" #include "at_port.h" #include "bsp_uart.h" #include "log.h" #include "stdio.h" #include "CONFIG.h" #undef LOG_ENABLE #define LOG_ENABLE 1 #define ML307_PERIODIC_EVT (0x0001 << 0) static tmosTaskID ml307_task_id = INVALID_TASK_ID; at_obj_t *ml307r_obj; void At_Debug(const char *fmt, ...) { va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); } void Ml307_Delay_Ms(uint16_t ms) { DelayMs(ms); } void Ml307_Delay_us(uint16_t us) { DelayUs(us); } static const at_adapter_t at_adapter = { .write = BSP_Uart1_Send_Data, .read = BSP_Uart1_Receive_Data, .debug = At_Debug, .recv_bufsize = 256, .urc_bufsize = 512 }; //模块准备就绪 static int URC_Module_Ready_Cb(at_urc_info_t *info) { logDebug("module ready complete\r\n"); return 0; } /** * @brief urc订阅表 */ static const urc_item_t urc_table[] = { {.prefix = "+CPIN: READY", .endmark = '\n', .handler = URC_Module_Ready_Cb},//模块准备就绪 }; static void Ml307_Power_On(void) { #define ML307_POWER_ON_TIME 3 GPIOB_SetBits(ML307_PWR_PIN); Ml307_Delay_Ms(ML307_POWER_ON_TIME * 1000); GPIOB_ResetBits(ML307_PWR_PIN); } static void Ml307_Power_Off(void) { #define M307_POWER_OFF_TIME 4 GPIOB_SetBits(ML307_PWR_PIN); Ml307_Delay_Ms(M307_POWER_OFF_TIME * 1000); GPIOB_ResetBits(ML307_PWR_PIN); Ml307_Delay_Ms(100); } int Ml307r_Gpio_Init(void) { GPIOB_SetBits(ENABLE_3_8_V); GPIOB_ModeCfg(ENABLE_3_8_V, GPIO_ModeOut_PP_5mA); GPIOB_ResetBits(ML307_RST_PIN); GPIOB_ModeCfg(ML307_RST_PIN, GPIO_ModeOut_PP_5mA); GPIOB_ModeCfg(USIM_DECT_PIN, GPIO_ModeIN_Floating); GPIOB_ModeCfg(ML307_PWR_PIN, GPIO_ModeOut_PP_5mA); return 0; } static int Module_Read_State(at_env_t *e) { switch (e->state) { case 0: e->obj->adap->debug("Check if the Module is ready\r\n"); e->println(e, "AT"); e->reset_timer(e); e->state++; break; case 1: if (e->contains(e, "OK")) { e->recvclr(e); e->finish(e, AT_RESP_OK); e->obj->adap->debug("Module is ready\r\n"); } if (e->is_timeout(e, 5000)) { e->state--; if (++e->i > 3) { e->obj->adap->debug("Module error\r\n"); e->finish(e, AT_RESP_ERROR); } } break; } return 0; } static void Module_Get_Imei_Cb(at_response_t *r) { char imei[16] = {0}; if (r->code == AT_RESP_OK) { if (sscanf(r->prefix, "+GSN:%s", imei) == 1) { r->obj->adap->debug("imei: %s\r\n", r->prefix); } } else { r->obj->adap->debug("'AT+GSN=1' command response failed!\r\n"); } } /* * @brief 获取IMEI数据 * @return */ static void Module_Get_Imei(void) { at_attr_t attr; at_attr_deinit(&attr); attr.prefix = "+GSN:"; attr.cb = Module_Get_Imei_Cb; at_send_singlline(ml307r_obj, &attr, "AT+GSN=1"); } static void BSP_Read_Module(void) { at_do_work(ml307r_obj, NULL, Module_Read_State); // 重启后生效 } static void Module_Get_Imsi_Cb(at_response_t *r) { char imsi[60] = {0}; if (r->code == AT_RESP_OK) { if (sscanf(r->prefix, "%s\r\n", imsi) == 1) { r->obj->adap->debug("imsi:%s\r\n", imsi); } } else { r->obj->adap->debug("'AT+CIMI' command response failed!\r\n"); } } /* * @brief 获取IMSI数据 * @return */ static void Module_Get_Imsi(void) { at_attr_t attr; at_attr_deinit(&attr); attr.prefix = "46"; attr.suffix = "\r\n"; attr.cb = Module_Get_Imsi_Cb; at_send_singlline(ml307r_obj, &attr, "AT+CIMI"); } static void Module_Get_Iccid_Cb(at_response_t *r) { char iccid[21] = {0}; if (r->code == AT_RESP_OK) { if (sscanf(r->prefix, "+MCCID: %s\r\n", iccid) == 1) { r->obj->adap->debug("iccid: %s\r\n", iccid); } } else { r->obj->adap->debug("'AT+QCCID' command response failed!\r\n"); } } /* * @brief 获取ICCID数据 * @return */ static void Module_Get_Iccid(void) { at_attr_t attr; at_attr_deinit(&attr); attr.prefix = "+MCCID:"; attr.cb = Module_Get_Iccid_Cb; at_send_singlline(ml307r_obj, &attr, "AT+MCCID"); } void Ml307r_Loop(void) { at_obj_process(ml307r_obj); } __HIGH_CODE __attribute__((noinline)) uint16_t Ml307r_Handle(uint8_t task_id, uint16_t events) { if (events & ML307_PERIODIC_EVT) { Ml307r_Loop(); tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(5)); return (events ^ ML307_PERIODIC_EVT); } return 0; } void BSP_Ml307r_Init(void) { Ml307r_Gpio_Init(); Ml307_Power_On(); BSP_UART1_Init(); ml307r_obj = at_obj_create(&at_adapter);//Create AT communication object at_obj_set_urc(ml307r_obj, urc_table, sizeof(urc_table) / sizeof(urc_table[0])); ml307_task_id = TMOS_ProcessEventRegister(Ml307r_Handle); tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT); BSP_Read_Module(); Module_Get_Imei(); Module_Get_Imsi(); Module_Get_Iccid(); }