瀏覽代碼

fix udp connection
add power_on/power_off oper

thomasonegd 6 年之前
父節點
當前提交
e42fe8c8a7
共有 1 個文件被更改,包括 68 次插入10 次删除
  1. 68 10
      at_socket_sim76xx.c

+ 68 - 10
at_socket_sim76xx.c

@@ -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();