IoT_SCV_CH584M/bsp/src/bsp_ml307r.c

267 lines
5.2 KiB
C

#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();
}