parent
cfca47afdf
commit
e42fe8c8a7
|
@ -20,6 +20,8 @@
|
|||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-12-22 thomasonegd first version
|
||||
* 2019-03-06 thomasonegd fix udp connection.
|
||||
* 2019-03-08 thomasonegd add power_on & power_off api
|
||||
*/
|
||||
|
||||
#include <at.h>
|
||||
|
@ -40,11 +42,13 @@
|
|||
|
||||
#ifdef AT_DEVICE_SIM76XX
|
||||
|
||||
#define SIM76XX_MODULE_SEND_MAX_SIZE 2048
|
||||
#define SIM76XX_MODULE_SEND_MAX_SIZE 1500
|
||||
#define SIM76XX_WAIT_CONNECT_TIME 5000
|
||||
#define SIM76XX_THREAD_STACK_SIZE 1024
|
||||
#define SIM76XX_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX/2)
|
||||
|
||||
#define SIM76XX_MAX_CONNECTIONS 10
|
||||
|
||||
/* set real event by current socket and current state */
|
||||
#define SET_EVENT(socket, event) (((socket + 1) << 16) | (event))
|
||||
|
||||
|
@ -67,6 +71,9 @@ static at_evt_cb_t at_evt_cb_set[] = {
|
|||
[AT_SOCKET_EVT_CLOSED] = NULL,
|
||||
};
|
||||
|
||||
static char udp_ipstr[SIM76XX_MAX_CONNECTIONS][16];
|
||||
static int udp_port[SIM76XX_MAX_CONNECTIONS];
|
||||
|
||||
static void at_tcp_ip_errcode_parse(int result)//Unsolicited TCP/IP command<err> codes
|
||||
{
|
||||
switch(result)
|
||||
|
@ -122,6 +129,7 @@ static int sim76xx_socket_close(int socket)
|
|||
at_response_t resp = RT_NULL;
|
||||
int result = RT_EOK;
|
||||
int activated;
|
||||
uint8_t s;
|
||||
uint8_t lnk_stat[10];
|
||||
|
||||
resp = at_create_resp(128, 0, rt_tick_from_millisecond(500));
|
||||
|
@ -298,10 +306,12 @@ __retry:
|
|||
break;
|
||||
|
||||
case AT_SOCKET_UDP:
|
||||
if (at_exec_cmd(resp, "AT+CIPOPEN=%d,\"UDP\",\"%s\",%d", socket, ip, port) < 0)
|
||||
if (at_exec_cmd(resp, "AT+CIPOPEN=%d,\"UDP\",,,%d", socket, port) < 0)
|
||||
{
|
||||
result = -RT_ERROR;
|
||||
}
|
||||
strcpy(udp_ipstr[socket],ip);
|
||||
udp_port[socket] = port;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -414,14 +424,27 @@ static int sim76xx_socket_send(int socket, const char *buff, size_t bfsz, enum a
|
|||
{
|
||||
cur_pkt_size = SIM76XX_MODULE_SEND_MAX_SIZE;
|
||||
}
|
||||
|
||||
/* send the "AT+CIPSEND" commands to AT server than receive the '>' response on the first line. */
|
||||
if (at_exec_cmd(resp, "AT+CIPSEND=%d,%d", socket, cur_pkt_size) < 0)
|
||||
|
||||
switch(type)
|
||||
{
|
||||
result = -RT_ERROR;
|
||||
goto __exit;
|
||||
case AT_SOCKET_TCP:
|
||||
/* send the "AT+CIPSEND" commands to AT server than receive the '>' response on the first line. */
|
||||
if (at_exec_cmd(resp, "AT+CIPSEND=%d,%d", socket, cur_pkt_size) < 0)
|
||||
{
|
||||
result = -RT_ERROR;
|
||||
goto __exit;
|
||||
}
|
||||
break;
|
||||
case AT_SOCKET_UDP:
|
||||
/* send the "AT+CIPSEND" commands to AT server than receive the '>' response on the first line. */
|
||||
if (at_exec_cmd(resp, "AT+CIPSEND=%d,%d,\"%s\",%d", socket, cur_pkt_size,udp_ipstr[socket],udp_port[socket]) < 0)
|
||||
{
|
||||
result = -RT_ERROR;
|
||||
goto __exit;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/* send the real data to server or client */
|
||||
result = (int) at_client_send(buff + sent_size, cur_pkt_size);
|
||||
if (result == 0)
|
||||
|
@ -675,7 +698,7 @@ static void urc_recv_func(const char *data, rt_size_t size)
|
|||
/* get the current socket and receive buffer size by receive data */
|
||||
sscanf(data, "+IPD%d:",(int *) &bfsz);
|
||||
/* get receive timeout by receive buffer length */
|
||||
timeout = bfsz * 2;
|
||||
timeout = bfsz * 10;
|
||||
|
||||
if (bfsz == 0)
|
||||
return;
|
||||
|
@ -734,6 +757,36 @@ static struct at_urc urc_table[] = {
|
|||
} \
|
||||
} while(0); \
|
||||
|
||||
|
||||
/**
|
||||
* power up sim76xx modem
|
||||
*/
|
||||
static void sim76xx_power_on(void)
|
||||
{
|
||||
rt_pin_write(AT_DEVICE_POWER_PIN, PIN_HIGH);
|
||||
rt_thread_delay(rt_tick_from_millisecond(300));
|
||||
rt_pin_write(AT_DEVICE_POWER_PIN, PIN_LOW);
|
||||
|
||||
while (rt_pin_read(AT_DEVICE_STATUS_PIN) == PIN_LOW)
|
||||
{
|
||||
rt_thread_delay(rt_tick_from_millisecond(10));
|
||||
}
|
||||
}
|
||||
|
||||
static void sim76xx_power_off(void)
|
||||
{
|
||||
rt_pin_write(AT_DEVICE_POWER_PIN, PIN_HIGH);
|
||||
rt_thread_delay(rt_tick_from_millisecond(3000));
|
||||
rt_pin_write(AT_DEVICE_POWER_PIN, PIN_LOW);
|
||||
|
||||
while (rt_pin_read(AT_DEVICE_STATUS_PIN) == PIN_HIGH)
|
||||
{
|
||||
rt_thread_delay(rt_tick_from_millisecond(10));
|
||||
}
|
||||
rt_pin_write(AT_DEVICE_POWER_PIN, PIN_LOW);
|
||||
}
|
||||
|
||||
|
||||
static void sim76xx_init_thread_entry(void *parameter)
|
||||
{
|
||||
#define CSQ_RETRY 20
|
||||
|
@ -755,7 +808,8 @@ static void sim76xx_init_thread_entry(void *parameter)
|
|||
goto __exit;
|
||||
}
|
||||
|
||||
/* TODO: maybe you should power-up sim76xx first*/
|
||||
/* power-up sim76xx */
|
||||
sim76xx_power_on();
|
||||
|
||||
LOG_D("Start initializing the SIM76XXE module");
|
||||
/* wait SIM76XX startup finish, Send AT every 5s, if receive OK, SYNC success*/
|
||||
|
@ -1103,6 +1157,10 @@ static int at_socket_device_init(void)
|
|||
/* register URC data execution function */
|
||||
at_set_urc_table(urc_table, sizeof(urc_table) / sizeof(urc_table[0]));
|
||||
|
||||
/* initialize sim76xx pin config */
|
||||
rt_pin_mode(AT_DEVICE_POWER_PIN, PIN_MODE_OUTPUT);
|
||||
rt_pin_mode(AT_DEVICE_STATUS_PIN, PIN_MODE_INPUT);
|
||||
|
||||
/* initialize sim76xx network */
|
||||
sim76xx_net_init();
|
||||
|
||||
|
|
Loading…
Reference in New Issue