Files
g0b1vetx-board/Board/network/cat1drv.c
T
2024-05-31 16:57:54 +08:00

336 lines
8.3 KiB
C

#include <cat1drv.h>
#include <rtthread.h>
#include <os-app.h>
#include "main.h"
#include "usart-board.h"
#include <string.h>
#include <stdlib.h>
#include <easyflash.h>
#include "netdrv.h"
#include "data.h"
#if !defined(LOG_TAG)
#define LOG_TAG "CAT1"
#endif
#include <elog.h>
ALIGN (RT_ALIGN_SIZE)
static char thread_stack[4096];
static struct rt_thread netapp_thread;
static char tcprxbbuff[1200];
static char tcptxbbuff[1200];
netDrv_t g_cat1Drv =
{
0, // 信号值
"", // iccid
Init, // 状态
tcprxbbuff, // 接受缓存
0, // 接受数据长度
tcptxbbuff, // 发送数据缓存
0, // 发送数据长度
};
static void ec200_resp_csq_callback (char * data, uint16_t length)
{
char * p;
p = strstr (data, "+CSQ:");
p = p + 6;
g_cat1Drv.Csq = atoi (p);
rt_kprintf ("CSQ: <<< <%d>\r\n", g_cat1Drv.Csq);
}
// 校准时间程序
static void ec200_resp_qlts_callback (char * data, uint16_t length)
{
uint8_t k[6] = {NULL};
char *p = NULL;
p = strstr (data, "+QLTS:") ;
p = p + 10;
k[0] = atoi (p); // 年
k[0] = (k[0] + (k[0] / 10) * 6) ; // 十进制转bcd码
p = p + 3;
k[1] = atoi (p); // 月
k[1] = (k[1] + (k[1] / 10) * 6) ;
p = p + 3;
k[2] = atoi (p); // 日
k[2] = (k[2] + (k[2] / 10) * 6) ;
p = p + 3; // p
k[3] = atoi (p); // 时
k[3] = (k[3] + (k[3] / 10) * 6) ;
p = p + 3; // p
k[4] = atoi (p); // 分
k[4] = (k[4] + (k[4] / 10) * 6) ;
p = p + 3; // p
k[5] = atoi (p); // 秒
k[5] = (k[5] + (k[5] / 10) * 6) ;
rt_kprintf ("20%02x-%02x-%02x %02x:%02x:%02x\r\n", k[0], k[1], k[2], k[3], k[4], k[5]);
}
static void ec200_resp_iccid_callback (char * data, uint16_t length)
{
char *p;
p = strstr (data, "+QCCID:");
p = p + 8;
rt_memset (SysData.iccid, 0, 32);
rt_memcpy (SysData.iccid, p, 20);
rt_kprintf ("ICCID: <<< <%d> [%s]\r\n", length, SysData.iccid);
}
static void ec200_resp_qird_callback (char * data, uint16_t length)
{
char * p;
p = strstr (data, "+QIRD: ");
p = p + 7;
g_cat1Drv.rx_size = atoi (p);
if (g_cat1Drv.rx_size > 0) // 读取到数据
{
p = strstr (p, "\r\n");
p = p + 2;
for (int i = 0; i < g_cat1Drv.rx_size; i++)
{
g_cat1Drv.rxbuff[i] = *p;
p++;
}
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_RX1) ;
// rt_kprintf("EVENT_TRIG_NETMODE_RX1\r\n");
// for(int i =0 ;i < g_cat1Drv.rx_size;i++)
// {
// rt_kprintf("%02X ",g_cat1Drv.rxbuff[i]);
// }
}
}
// type 0 无需打包 1 需要重新打包
const struct
{
char * cmd;
char * ack;
uint32_t delayms;
uint32_t waitms;
uint32_t retry;
void (*call) (char *, uint16_t);
} cat1list[] =
{
[ATE] = {"ATE0\r\n", "OK", 10, 2000, 10, NULL},
[ATI] = {"ATI\r\n", "OK", 10, 2000, 3, NULL},
[CPIN] = {"AT+CPIN?\r\n", "+CPIN: READY", 10, 2000, 10, NULL},
// [CREG] = {"AT+CREG?\r\n", "+CREG: 0,1", 10, 2000, 30, NULL},
// [CGREG] = {"AT+CGREG?\r\n", "+CGREG: 0,1", 10, 2000, 30, NULL},
[CGATT] = {"AT+CGATT?\r\n", "+CGATT: 1", 10, 2000, 30, NULL},
[CSQ] = {"AT+CSQ\r\n", "+CSQ:", 10, 2000, 1, ec200_resp_csq_callback},
[QLTS] = {"AT+QLTS=2\r\n", "+QLTS:", 10, 2000, 1, ec200_resp_qlts_callback},
[QCCID] = {"AT+QCCID\r\n", "+QCCID:", 10, 2000, 1, ec200_resp_iccid_callback},
};
static void cat1_rx_done (void)
{
rt_event_send (gUartEvents, EVENT_UART_GSM_RX);
// for (int i = 0 ; i < g_GSMDrv.rx_size; i++)
// {
// rt_kprintf ("%c", g_GSMDrv.rx_buffer[i]);
// }
// MX_UART_Clear (&g_GSMDrv);
}
// cat1 发送数据
//0 : 结束,下一个
//1 : 运行中,下一个
static CommRet_T cat1_sendcmd_and_responce (int time, char * tx, int size, char * ack, void (*call) (char *, uint16_t))
{
MX_UART_Clear (&g_GSMDrv);
MX_UART_PutBuffer (&g_GSMDrv, tx, size);
//rt_kprintf ("%.*s", size, tx) ;
//timeout = cat1list[i].waitms;
int timeout = time;
while (timeout--)
{
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_GSM_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
{
//rt_kprintf ("[%.*s]", g_GSMDrv.rx_size, g_GSMDrv.rx_buffer) ;
if (NULL != rt_strstr ( (char *) g_GSMDrv.rx_buffer, ack))
{
if (call != NULL)
{
call ( (char *) g_GSMDrv.rx_buffer, g_GSMDrv.rx_size) ;
}
return RetSucc; // 成功
}
MX_UART_Clear (&g_GSMDrv);
}
rt_thread_mdelay (1);
}
return RetErr; // 超时
}
static void thread_entry (void * argument)
{
char at_cmd[128] = {NULL};
char ipaddr[32] = {NULL};
int ipport;
char *p;
int retry = 0;
p = ef_get_env ("mqtt_addr");
rt_strncpy (ipaddr, p, rt_strlen (p));
p = ef_get_env ("mqtt_port");
ipport = atoi (p);
rt_sprintf (at_cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,0\r", ipaddr, ipport);
g_GSMDrv.rxdone = cat1_rx_done;
g_GSMDrv.BaudRate = 115200;
// 启动4G 模块电源
// 拉高4G 模块复位
while (1)
{
CAT1RST:
// 初始化串口,打开模块电源
g_cat1Drv.State = Init;
MX_UART_Init (&g_GSMDrv);
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_RESET); // 关闭4G 模块电源
rt_thread_mdelay (3000);
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_SET); // 开启4G
rt_thread_mdelay (100);
// 拉高模组复位
HAL_GPIO_WritePin (GSM_RST_GPIO_Port, GSM_RST_Pin, GPIO_PIN_RESET);
rt_thread_mdelay (100);
HAL_GPIO_WritePin (GSM_RST_GPIO_Port, GSM_RST_Pin, GPIO_PIN_SET);
rt_thread_mdelay (8000);
for (int i = 0; i < MAXSETP; i++)
{
retry = cat1list[i].retry;
while (1)
{
if (cat1_sendcmd_and_responce (cat1list[i].waitms, cat1list[i].cmd, strlen (cat1list[i].cmd), cat1list[i].ack, cat1list[i].call) == RetSucc)
{
break;
}
else
{
retry--;
if (retry <= 0)
{
rt_kprintf ("Join Faild%d \r\n", i);
goto CAT1RST;
}
}
}
}
rt_kprintf ("Join Success \r\n");
rt_sprintf (at_cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,0\r", ipaddr, ipport);
if (cat1_sendcmd_and_responce (15000, at_cmd, strlen (at_cmd), "+QIOPEN: 0,0", NULL) == RetSucc)
{
g_cat1Drv.State = Conn;
rt_kprintf ("Net is ready \r\n");
}
else
{
rt_kprintf ("Net is Error \r\n");
goto CAT1RST;
}
while (1)
{
// 发送数据
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_TX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) // 需要发送数据
{
if (g_cat1Drv.txbuff != NULL)
{
rt_sprintf (at_cmd, "AT+QISEND=0,%d\r\n", g_cat1Drv.tx_size);
rt_thread_mdelay (10);
if (cat1_sendcmd_and_responce (1000, at_cmd, strlen (at_cmd), ">", NULL) != RetSucc)
{
rt_kprintf ("NET:+CME:ERROR QISEND\r\n");
goto CAT1RST;
}
if (cat1_sendcmd_and_responce (3000, g_cat1Drv.txbuff, g_cat1Drv.tx_size, "SEND OK", NULL) != RetSucc)
{
rt_kprintf ("NET:+CME:ERROR QPUSH\r\n");
goto CAT1RST;
}
}
}
// 读取数据
rt_thread_mdelay (300);
if (cat1_sendcmd_and_responce (1000, "AT+QIRD=0,1500\r\n", strlen ("AT+QIRD=0,1500\r\n"), "+QIRD:", ec200_resp_qird_callback) != RetSucc)
{
rt_kprintf ("NET:+CME:ERROR QIRD\r\n");
goto CAT1RST;
}
// // 通过通道2上报数据
// if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_TX2, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) // 需要发送数据
// {
// if (g_cat1Drv.txbuff != NULL)
// {
// rt_sprintf (at_cmd, "AT+QISEND=0,%d\r\n", g_cat1Drv.tx_size);
// rt_thread_mdelay (10);
// if (cat1_sendcmd_and_responce (1000, at_cmd, strlen (at_cmd), ">", NULL) != RetSucc)
// {
// rt_kprintf ("NET:+CME:ERROR QISEND\r\n");
// goto CAT1RST;
// }
// if (cat1_sendcmd_and_responce (3000, g_cat1Drv.txbuff, g_cat1Drv.tx_size, "SEND OK", NULL) != RetSucc)
// {
// rt_kprintf ("NET:+CME:ERROR QPUSH\r\n");
// goto CAT1RST;
// }
// }
// }
}
rt_thread_mdelay (3000);
}
}
void cat1_service_tx (char * buff, int size)
{
rt_memcpy (g_cat1Drv.txbuff, buff, size);
g_cat1Drv.tx_size = size;
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_TX1) ;
}
// 通过网络通道2发送数据
void cat1_service2_tx (char * buff, int size)
{
rt_memcpy (g_cat1Drv.txbuff, buff, size);
g_cat1Drv.tx_size = size;
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_TX2) ;
}
void CAT1ThreadStart (void)
{
/* 创建线程1,名称是thread1,入口是thread1_entry */
rt_thread_init (&netapp_thread, "netapp_thread",
thread_entry, RT_NULL,
&thread_stack[0],
sizeof (thread_stack),
CAT1_THREAD_PRIORITY, CAT1_THREAD_TIMESLICE);
rt_thread_startup (&netapp_thread);
return ;
}