2024-12-11 16:21:57 +08:00
|
|
|
|
#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"
|
2025-04-09 17:15:54 +08:00
|
|
|
|
#include "SLEEP.h"
|
2025-04-15 16:39:47 +08:00
|
|
|
|
#include "bsp_iwdg.h"
|
2024-12-11 16:21:57 +08:00
|
|
|
|
|
|
|
|
|
#undef LOG_ENABLE
|
|
|
|
|
#define LOG_ENABLE 1
|
|
|
|
|
|
|
|
|
|
#define ML307_PERIODIC_EVT (0x0001 << 0)
|
2025-04-09 17:15:54 +08:00
|
|
|
|
#define ML307_TIMEOUT_EVT (0x0001 << 1)
|
2025-04-15 16:39:47 +08:00
|
|
|
|
#define ML307_POWER_ON_EVT (0x0001 << 2)
|
|
|
|
|
#define ML307_POWER_OFF_EVT (0x0001 << 3)
|
|
|
|
|
|
|
|
|
|
// <20><>Դ״̬
|
|
|
|
|
typedef enum {
|
|
|
|
|
POWER_STATE_INIT,
|
|
|
|
|
POWER_STATE_ON_START,
|
|
|
|
|
POWER_STATE_ON_COMPLETE,
|
|
|
|
|
POWER_STATE_OFF_START,
|
|
|
|
|
POWER_STATE_OFF_COMPLETE
|
|
|
|
|
} ml307_power_state_t;
|
|
|
|
|
|
|
|
|
|
static ml307_power_state_t ml307_power_state = POWER_STATE_INIT;
|
2024-12-11 16:21:57 +08:00
|
|
|
|
static tmosTaskID ml307_task_id = INVALID_TASK_ID;
|
2025-04-09 17:15:54 +08:00
|
|
|
|
static tmosTaskID ml307_timeout_task_id = INVALID_TASK_ID;
|
2025-04-15 16:39:47 +08:00
|
|
|
|
static tmosTaskID ml307_power_task_id = INVALID_TASK_ID;
|
2024-12-11 16:21:57 +08:00
|
|
|
|
|
|
|
|
|
at_obj_t *ml307r_obj;
|
2025-03-20 11:26:08 +08:00
|
|
|
|
uint8_t databuf[5] = {0x01,0xaa,0x12,0xde,0x39};
|
2024-12-11 16:21:57 +08:00
|
|
|
|
|
|
|
|
|
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,
|
2025-04-15 16:39:47 +08:00
|
|
|
|
.recv_bufsize = 256,
|
2024-12-11 16:21:57 +08:00
|
|
|
|
.urc_bufsize = 512
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//ģ<><C4A3><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
static int URC_Module_Ready_Cb(at_urc_info_t *info)
|
|
|
|
|
{
|
|
|
|
|
logDebug("module ready complete\r\n");
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief urc<EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static const urc_item_t urc_table[] =
|
|
|
|
|
{
|
|
|
|
|
{.prefix = "+CPIN: READY", .endmark = '\n', .handler = URC_Module_Ready_Cb},//ģ<><C4A3><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
};
|
|
|
|
|
|
2025-04-15 16:39:47 +08:00
|
|
|
|
// 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);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
static uint16_t Ml307_Power_Handle(uint8_t task_id, uint16_t events)
|
2024-12-11 16:21:57 +08:00
|
|
|
|
{
|
2025-04-15 16:39:47 +08:00
|
|
|
|
if (events & ML307_POWER_ON_EVT)
|
|
|
|
|
{
|
|
|
|
|
switch(ml307_power_state)
|
|
|
|
|
{
|
|
|
|
|
case POWER_STATE_INIT:
|
|
|
|
|
// <20><>ʼ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
logDebug("ML307 power on start\n");
|
|
|
|
|
GPIOB_SetBits(ML307_PWR_PIN);
|
|
|
|
|
ml307_power_state = POWER_STATE_ON_START;
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|
|
|
|
#define ML307_POWER_ON_TIME 5
|
|
|
|
|
tmos_start_task(ml307_power_task_id, ML307_POWER_ON_EVT, MS1_TO_SYSTEM_TIME(ML307_POWER_ON_TIME * 1000));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case POWER_STATE_ON_START:
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
logDebug("ML307 power on complete\n");
|
|
|
|
|
GPIOB_ResetBits(ML307_PWR_PIN);
|
|
|
|
|
ml307_power_state = POWER_STATE_INIT;
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (ml307r_obj != NULL) {
|
|
|
|
|
BSP_ML307_SetActive();
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT);
|
|
|
|
|
|
|
|
|
|
// ִ<>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
logDebug("BSP_Read_Module\n");
|
|
|
|
|
BSP_Read_Module();
|
|
|
|
|
logDebug("simcom_init\n");
|
|
|
|
|
simcom_init();
|
|
|
|
|
BSP_ML307_SetActive();
|
|
|
|
|
logDebug("BSP_Module_Connect_CtWing\n");
|
|
|
|
|
BSP_Module_Connect_CtWing();
|
|
|
|
|
logDebug("BSP_ML307_SendMessage\n");
|
|
|
|
|
BSP_ML307_SetActive();
|
|
|
|
|
BSP_ML307_SendMessage();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return (events ^ ML307_POWER_ON_EVT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (events & ML307_POWER_OFF_EVT)
|
|
|
|
|
{
|
|
|
|
|
switch(ml307_power_state)
|
|
|
|
|
{
|
|
|
|
|
case POWER_STATE_INIT:
|
|
|
|
|
// <20><>ʼ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
logDebug("ML307 power off start\n");
|
|
|
|
|
GPIOB_SetBits(ML307_PWR_PIN);
|
|
|
|
|
ml307_power_state = POWER_STATE_OFF_START;
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|
|
|
|
#define M307_POWER_OFF_TIME 6
|
|
|
|
|
tmos_start_task(ml307_power_task_id, ML307_POWER_OFF_EVT, MS1_TO_SYSTEM_TIME(M307_POWER_OFF_TIME * 1000));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case POWER_STATE_OFF_START:
|
|
|
|
|
// <20><><EFBFBD>ɶϵ<C9B6><CFB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
logDebug("ML307 power off step 1\n");
|
|
|
|
|
GPIOB_ResetBits(ML307_PWR_PIN);
|
|
|
|
|
ml307_power_state = POWER_STATE_OFF_COMPLETE;
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|
|
|
|
tmos_start_task(ml307_power_task_id, ML307_POWER_OFF_EVT, MS1_TO_SYSTEM_TIME(100));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case POWER_STATE_OFF_COMPLETE:
|
|
|
|
|
// <20>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
|
|
|
|
|
logDebug("ML307 power off complete\n");
|
|
|
|
|
ml307_power_state = POWER_STATE_INIT;
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>˯<EFBFBD><CBAF>״̬
|
|
|
|
|
// BSP_RequestSleep();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return (events ^ ML307_POWER_OFF_EVT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
static void Ml307_Power_Task_Init(void)
|
|
|
|
|
{
|
|
|
|
|
if (ml307_power_task_id == INVALID_TASK_ID)
|
|
|
|
|
{
|
|
|
|
|
ml307_power_task_id = TMOS_ProcessEventRegister(Ml307_Power_Handle);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-12-11 16:21:57 +08:00
|
|
|
|
|
2025-04-15 16:39:47 +08:00
|
|
|
|
// <20>µķ<C2B5><C4B7><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>Դ<EFBFBD><D4B4><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD>
|
|
|
|
|
static void Ml307_Power_On_NonBlocking(void)
|
|
|
|
|
{
|
|
|
|
|
Ml307_Power_Task_Init();
|
|
|
|
|
ml307_power_state = POWER_STATE_INIT;
|
|
|
|
|
tmos_set_event(ml307_power_task_id, ML307_POWER_ON_EVT);
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-15 16:39:47 +08:00
|
|
|
|
static void Ml307_Power_Off_NonBlocking(void)
|
2024-12-11 16:21:57 +08:00
|
|
|
|
{
|
2025-04-15 16:39:47 +08:00
|
|
|
|
Ml307_Power_Task_Init();
|
|
|
|
|
ml307_power_state = POWER_STATE_INIT;
|
|
|
|
|
tmos_set_event(ml307_power_task_id, ML307_POWER_OFF_EVT);
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-15 16:39:47 +08:00
|
|
|
|
|
2024-12-11 16:21:57 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-09 17:15:54 +08:00
|
|
|
|
// ֹͣ4Gͨ<47>ţ<EFBFBD>ֹͣ<CDA3><D6B9>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>
|
|
|
|
|
void BSP_Stop_ML307_Task(void)
|
|
|
|
|
{
|
|
|
|
|
if (ml307_task_id != INVALID_TASK_ID) {
|
|
|
|
|
tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
|
2025-04-15 16:39:47 +08:00
|
|
|
|
// Ml307_Power_Off();
|
|
|
|
|
// BSP_RequestSleep();
|
|
|
|
|
Ml307_Power_Off_NonBlocking();
|
2025-04-09 17:15:54 +08:00
|
|
|
|
logDebug("4G module polling stopped\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-11 16:21:57 +08:00
|
|
|
|
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");
|
2025-04-09 17:15:54 +08:00
|
|
|
|
// BSP_Stop_ML307_Task();
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
|
|
|
|
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);
|
2025-04-09 17:15:54 +08:00
|
|
|
|
// BSP_Stop_ML307_Task();
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void BSP_Read_Module(void)
|
|
|
|
|
{
|
|
|
|
|
at_do_work(ml307r_obj, NULL, Module_Read_State); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-20 11:26:08 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static void simcom_init_callback(at_response_t *r)
|
2024-12-11 16:21:57 +08:00
|
|
|
|
{
|
2025-03-20 11:26:08 +08:00
|
|
|
|
printf("SIM800C Init %s!\r\n",r->code == AT_RESP_OK ? "ok" : "error");
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
|
|
|
|
/*
|
2025-03-20 11:26:08 +08:00
|
|
|
|
* @brief ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static void simcom_init(void)
|
2024-12-11 16:21:57 +08:00
|
|
|
|
{
|
|
|
|
|
at_attr_t attr;
|
2025-03-20 11:26:08 +08:00
|
|
|
|
static const char *cmds[] = {
|
2025-04-15 16:39:47 +08:00
|
|
|
|
// "AT+GSN=1",
|
|
|
|
|
// "AT+CIMI",
|
|
|
|
|
// "AT+MCCID",
|
|
|
|
|
// "AT+CPIN?",
|
|
|
|
|
// "AT+CEREG?",
|
|
|
|
|
// "AT+CSQ",
|
|
|
|
|
"AT+CPIN?", // <20><><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>SIM<49><4D>״̬
|
|
|
|
|
"AT+CEREG?", // Ȼ<><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>״̬
|
|
|
|
|
"AT+CSQ", // <20>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
"AT+GSN=1", // <20><>ȡIMEI
|
|
|
|
|
"AT+CIMI", // <20><>ȡIMSI (<28><>ҪSIM<49><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
"AT+MCCID", // <20><>ȡICCID (<28><>ҪSIM<49><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
2025-03-20 11:26:08 +08:00
|
|
|
|
NULL,
|
|
|
|
|
};
|
2024-12-11 16:21:57 +08:00
|
|
|
|
at_attr_deinit(&attr);
|
2025-03-20 11:26:08 +08:00
|
|
|
|
attr.cb = simcom_init_callback; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
|
2025-04-15 16:39:47 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ٣<D3B3><D9A3><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧʱ<D3A6><CAB1>
|
|
|
|
|
attr.timeout = 2000; // <20><><EFBFBD>ӳ<EFBFBD>ʱʱ<CAB1>䵽2<E4B5BD><32>
|
|
|
|
|
attr.retry = 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
|
2025-03-20 11:26:08 +08:00
|
|
|
|
at_send_multiline(ml307r_obj, &attr, cmds);
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-20 11:26:08 +08:00
|
|
|
|
/*
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸
|
2025-04-09 17:15:54 +08:00
|
|
|
|
* @return
|
2025-03-20 11:26:08 +08:00
|
|
|
|
*/
|
|
|
|
|
static int BSP_Module_Connect_CtWing_Handle(at_env_t *e)
|
2024-12-11 16:21:57 +08:00
|
|
|
|
{
|
2025-03-20 11:26:08 +08:00
|
|
|
|
switch (e->state)
|
2024-12-11 16:21:57 +08:00
|
|
|
|
{
|
2025-03-20 11:26:08 +08:00
|
|
|
|
case 0:
|
2025-04-09 17:15:54 +08:00
|
|
|
|
logDebug("create device...\r\n");
|
2025-04-15 16:39:47 +08:00
|
|
|
|
e->println(e, "AT+MIPOPEN=0,\"TCP\",\"112.125.89.8\",43192,,1"); // 8.135.10.183,32994
|
2025-03-20 11:26:08 +08:00
|
|
|
|
e->reset_timer(e);
|
|
|
|
|
e->state++;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
if (e->contains(e, "CONNECT"))
|
|
|
|
|
{
|
|
|
|
|
logDebug("create device complete\r\n");
|
|
|
|
|
e->finish(e, AT_RESP_OK);
|
|
|
|
|
}
|
|
|
|
|
else if (e->is_timeout(e, 5000))
|
|
|
|
|
{
|
|
|
|
|
e->state--;
|
|
|
|
|
if (++e->i > 3)
|
|
|
|
|
{
|
|
|
|
|
logDebug("create device error\r\n");
|
|
|
|
|
e->finish(e, AT_RESP_ERROR);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
2025-03-20 11:26:08 +08:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
//<2F><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
static void BSP_Module_Connect_CtWing(void)
|
|
|
|
|
{
|
|
|
|
|
at_do_work(ml307r_obj, NULL, BSP_Module_Connect_CtWing_Handle);//<2F><><EFBFBD><EFBFBD><EFBFBD>豸
|
|
|
|
|
}
|
|
|
|
|
static int Module_Restart_Work(at_env_t *e)
|
|
|
|
|
{
|
|
|
|
|
switch (e->state)
|
2024-12-11 16:21:57 +08:00
|
|
|
|
{
|
2025-03-20 11:26:08 +08:00
|
|
|
|
case 0:
|
|
|
|
|
logDebug("restart module...\r\n");
|
|
|
|
|
e->println(e, "AT+CFUN=1,1");//<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
|
|
|
|
|
e->reset_timer(e);
|
|
|
|
|
e->state++;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
if (e->contains(e, "OK"))
|
|
|
|
|
{
|
|
|
|
|
logDebug("restart module complete\r\n");
|
|
|
|
|
e->reset_timer(e);
|
|
|
|
|
e->state++;
|
|
|
|
|
}
|
|
|
|
|
if (e->is_timeout(e, 5000))
|
|
|
|
|
{
|
|
|
|
|
e->state--;
|
|
|
|
|
if (++e->i > 3)
|
|
|
|
|
{
|
|
|
|
|
logDebug("Module restart error\r\n");
|
|
|
|
|
e->finish(e, AT_RESP_ERROR);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
logDebug("Check if the Module is ready\r\n");
|
|
|
|
|
e->println(e, "AT");
|
|
|
|
|
e->reset_timer(e);
|
|
|
|
|
e->state++;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
if (e->contains(e, "OK"))
|
|
|
|
|
{
|
|
|
|
|
e->recvclr(e);
|
|
|
|
|
e->finish(e, AT_RESP_OK);
|
|
|
|
|
logDebug("Module is ready\r\n");
|
|
|
|
|
}
|
|
|
|
|
if (e->is_timeout(e, 5000))
|
|
|
|
|
{
|
|
|
|
|
e->state--;
|
|
|
|
|
if (++e->i > 3)
|
|
|
|
|
{
|
|
|
|
|
logDebug("Module error\r\n");
|
|
|
|
|
e->finish(e, AT_RESP_ERROR);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
2025-03-20 11:26:08 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
|
|
|
|
|
static void BSP_Restart_Module(void)
|
2024-12-11 16:21:57 +08:00
|
|
|
|
{
|
2025-03-20 11:26:08 +08:00
|
|
|
|
at_do_work(ml307r_obj, NULL, Module_Restart_Work);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
{
|
2025-04-15 16:39:47 +08:00
|
|
|
|
FEED_IWDG();
|
2024-12-11 16:21:57 +08:00
|
|
|
|
Ml307r_Loop();
|
2025-04-09 17:15:54 +08:00
|
|
|
|
tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(200)); //5
|
2024-12-11 16:21:57 +08:00
|
|
|
|
return (events ^ ML307_PERIODIC_EVT);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2025-04-09 17:15:54 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-03-20 11:26:08 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void BSP_Module_Send_Data(uint8_t* data, uint8_t len)
|
|
|
|
|
{
|
|
|
|
|
at_attr_t attr;
|
|
|
|
|
at_send_data(ml307r_obj, &attr, data, len);
|
|
|
|
|
}
|
2024-12-11 16:21:57 +08:00
|
|
|
|
|
2025-03-31 17:33:05 +08:00
|
|
|
|
// <20>ϵ籣<CFB5><E7B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
|
|
|
|
|
void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len)
|
|
|
|
|
{
|
|
|
|
|
if (ml307_task_id != INVALID_TASK_ID) {
|
|
|
|
|
GPIOB_SetBits(ENABLE_3_8_V); // ȷ<><C8B7>3.8V<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
BSP_Read_Module(); // ȷ<><C8B7>ģ<EFBFBD><C4A3><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD>״̬
|
|
|
|
|
at_attr_t attr;
|
|
|
|
|
at_send_data(ml307r_obj, &attr, data, len);
|
2025-04-15 16:39:47 +08:00
|
|
|
|
// Ml307_Power_Off();
|
|
|
|
|
Ml307_Power_Off_NonBlocking(); // ʹ<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ر<EFBFBD>
|
2025-03-31 17:33:05 +08:00
|
|
|
|
logDebug("Power failure protection data has been sent\n");
|
|
|
|
|
} else {
|
|
|
|
|
BSP_Ml307r_Init(); // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ȳ<EFBFBD>ʼ<EFBFBD><CABC>
|
|
|
|
|
logDebug("4G initialization\n");
|
|
|
|
|
at_attr_t attr;
|
|
|
|
|
at_send_data(ml307r_obj, &attr, data, len);
|
2025-04-15 16:39:47 +08:00
|
|
|
|
// Ml307_Power_Off();
|
|
|
|
|
Ml307_Power_Off_NonBlocking(); // ʹ<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ر<EFBFBD>
|
2025-03-31 17:33:05 +08:00
|
|
|
|
logDebug("Power failure protection data has been sent\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-11 16:21:57 +08:00
|
|
|
|
void BSP_Ml307r_Init(void)
|
|
|
|
|
{
|
2025-04-15 16:39:47 +08:00
|
|
|
|
|
2024-12-11 16:21:57 +08:00
|
|
|
|
Ml307r_Gpio_Init();
|
2025-04-15 16:39:47 +08:00
|
|
|
|
|
|
|
|
|
// Ml307_Power_On();
|
|
|
|
|
|
2024-12-11 16:21:57 +08:00
|
|
|
|
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);
|
2025-04-15 16:39:47 +08:00
|
|
|
|
// tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT);
|
2024-12-11 16:21:57 +08:00
|
|
|
|
|
2025-04-09 17:15:54 +08:00
|
|
|
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
BSP_ML307_SetActive();
|
|
|
|
|
|
2025-04-15 16:39:47 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
Ml307_Power_On_NonBlocking();
|
|
|
|
|
|
|
|
|
|
// logDebug("BSP_Read_Module\n");
|
|
|
|
|
// BSP_Read_Module();
|
|
|
|
|
// logDebug("simcom_init\n");
|
|
|
|
|
// simcom_init();
|
|
|
|
|
// logDebug("BSP_Module_Connect_CtWing\n");
|
|
|
|
|
// BSP_Module_Connect_CtWing();
|
|
|
|
|
// logDebug("BSP_Module_Send_Data\n");
|
|
|
|
|
// // BSP_Module_Send_Data(databuf, 5);
|
|
|
|
|
// BSP_ML307_SendMessage();
|
2024-12-11 16:21:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-09 17:15:54 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief ML307<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static uint16_t BSP_ML307_TimeoutTask(uint8_t task_id, uint16_t events)
|
|
|
|
|
{
|
|
|
|
|
if (events & ML307_TIMEOUT_EVT)
|
|
|
|
|
{
|
|
|
|
|
logDebug("ML307 timeout, stopping task\n");
|
|
|
|
|
BSP_Stop_ML307_Task();
|
|
|
|
|
return (events ^ ML307_TIMEOUT_EVT);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ML307<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
void BSP_ML307_StartTimeoutTimer(void)
|
|
|
|
|
{
|
|
|
|
|
if (ml307_timeout_task_id == INVALID_TASK_ID)
|
|
|
|
|
{
|
|
|
|
|
ml307_timeout_task_id = TMOS_ProcessEventRegister(BSP_ML307_TimeoutTask);
|
|
|
|
|
}
|
|
|
|
|
tmos_stop_task(ml307_timeout_task_id, ML307_TIMEOUT_EVT);
|
2025-04-15 16:39:47 +08:00
|
|
|
|
tmos_start_task(ml307_timeout_task_id, ML307_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(10000)); // 5<>볬ʱ
|
2025-04-09 17:15:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ML307<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹϵͳ˯<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
void BSP_ML307_SetActive(void)
|
|
|
|
|
{
|
|
|
|
|
BSP_BlockSleep();
|
|
|
|
|
BSP_ML307_StartTimeoutTimer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void BSP_ML307_SendMessage(void)
|
|
|
|
|
{
|
|
|
|
|
char json_buffer[300];
|
|
|
|
|
snprintf(json_buffer, sizeof(json_buffer),
|
|
|
|
|
"{"
|
|
|
|
|
"\"device\":{"
|
|
|
|
|
"\"id\":\"SCV001\","
|
|
|
|
|
"\"time\":\"2025\""
|
|
|
|
|
"},"
|
|
|
|
|
"\"status\":\"closed\","
|
|
|
|
|
"\"fault\":{"
|
|
|
|
|
"\"lowBattery\":true,"
|
|
|
|
|
"\"code\":1001"
|
|
|
|
|
"},"
|
|
|
|
|
"\"monitor\":{"
|
|
|
|
|
"\"pressure\":0.8,"
|
|
|
|
|
"\"lowVoltage\":true"
|
|
|
|
|
"},"
|
|
|
|
|
"\"network\":{"
|
|
|
|
|
"\"sinr\":15.2,"
|
|
|
|
|
"\"signal\":4"
|
|
|
|
|
"},"
|
|
|
|
|
"\"standards\":{"
|
|
|
|
|
"\"iotId\":\"IoT-SCV-12345\""
|
|
|
|
|
"}"
|
|
|
|
|
"}");
|
|
|
|
|
BSP_Module_Send_Data((uint8_t*)json_buffer, strlen(json_buffer));
|
|
|
|
|
logDebug("BSP_ML307_SendMessage: %s\n", json_buffer);
|
|
|
|
|
}
|