paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [4964] gsm and max3100 finally working together


From: Gautier Hattenberger
Subject: [paparazzi-commits] [4964] gsm and max3100 finally working together
Date: Tue, 15 Jun 2010 17:59:16 +0000

Revision: 4964
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4964
Author:   gautier
Date:     2010-06-15 17:59:15 +0000 (Tue, 15 Jun 2010)
Log Message:
-----------
gsm and max3100 finally working together

Modified Paths:
--------------
    paparazzi3/trunk/sw/airborne/modules/gsm/gsm.c
    paparazzi3/trunk/sw/airborne/modules/gsm/gsm.h
    paparazzi3/trunk/sw/airborne/modules/max3100/max3100_hw.c
    paparazzi3/trunk/sw/airborne/modules/max3100/max3100_hw.h

Modified: paparazzi3/trunk/sw/airborne/modules/gsm/gsm.c
===================================================================
--- paparazzi3/trunk/sw/airborne/modules/gsm/gsm.c      2010-06-15 17:35:12 UTC 
(rev 4963)
+++ paparazzi3/trunk/sw/airborne/modules/gsm/gsm.c      2010-06-15 17:59:15 UTC 
(rev 4964)
@@ -154,24 +154,34 @@
   if (gsm_status == STATUS_NONE) { /* First call */
     LED_ON(GSM_ONOFF_LED);
     gsm_status = STATUS_POWERON;
-  } else { /* Second call */
+  //} else { /* Second call */
+  //  gsm_buf_idx = 0;
+  //  gsm_line_received = false;
+  //  
+  //  Send_AT();
+  //  gsm_status = STATUS_SEND_AT;
+  //  gsm_gsm_init_status = FALSE;
+  }
+}
+
+void gsm_init_report(void) { /* Second call */
+  if (gsm_status != STATUS_NONE) {
     gsm_buf_idx = 0;
     gsm_line_received = false;
-    
+
     Send_AT();
     gsm_status = STATUS_SEND_AT;
-    gsm_gsm_init_status = FALSE;
+    gsm_gsm_init_report_status = FALSE;
   }
 }
 
-
 void gsm_event(void) {
   if (GSMBuffer()) {
     ReadGSMBuffer();
   }
 
   if (gsm_line_received) {
-    DOWNLINK_SEND_DEBUG_GSM_RECEIVE(DefaultChannel, gsm_buf_len, gsm_buf);
+    if (gsm_buf_len > 0) DOWNLINK_SEND_DEBUG_GSM_RECEIVE(DefaultChannel, 
gsm_buf_len, gsm_buf);
     gsm_got_line();
     gsm_line_received = false;
   } else if (prompt_received) {
@@ -190,7 +200,7 @@
     Suppr_SMS(index_msg);
     gsm_status = STATUS_DELETE_SMS;
   } else if (gsm_status == STATUS_IDLE 
-            && strncmp(CMTI, gsm_buf, strlen(CMTI)) == 0) {
+      && strncmp(CMTI, gsm_buf, strlen(CMTI)) == 0) {
     /* A SMS is available */
     /* Extracting the index of the message */
     char * first_comma = indexn(gsm_buf, ',',MAXLEN_CMTI_ANSWER);
@@ -201,52 +211,56 @@
     }
   } else if (waiting_for_reply) { // Other cases
     // Do we get what we were expecting
-    
+
     bool gsm_answer = strncmp(expected_ack, gsm_buf, strlen(expected_ack)) == 
0;
     if (gsm_answer) {
       waiting_for_reply = false;
 
       switch(gsm_status) {
-      case STATUS_CSQ :                        
-       gsm_send_report_continue();
-       gsm_status = STATUS_WAITING_PROMPT;
-       break;
-       
-      case STATUS_REQUESTING_MESSAGE:
-       parse_msg_header();
-       gsm_status = STATUS_WAITING_DATA;
-       break;
-      
-      case STATUS_SEND_AT :
-       gsm_answer = false;
-       Send_CMGF();
-       gsm_status = STATUS_SEND_CMGF;
-       break;
-      
-      case STATUS_SEND_CMGF :
-       gsm_answer = false;
-       Send_CNMI();
-       gsm_status = STATUS_SEND_CNMI;
-       break;
-      
-      case STATUS_SEND_CNMI :
-       gsm_answer = false;
-       Send_CPMS();
-       gsm_status = STATUS_SEND_CPMS;
-       break;
-      
-      case STATUS_SEND_CPMS :
-       gsm_answer = false;
-       gsm_status = STATUS_IDLE;
-       gsm_gsm_send_report_status = MODULES_START; /** Start reporting */
-       break;
-      
-      case STATUS_DELETE_SMS :
-       gsm_status = STATUS_IDLE;
-       break;
-      
-      default:                         
-       break;
+        case STATUS_CSQ :                      
+          gsm_send_report_continue();
+          gsm_status = STATUS_WAITING_PROMPT;
+          break;
+
+        case STATUS_REQUESTING_MESSAGE:
+          parse_msg_header();
+          gsm_status = STATUS_WAITING_DATA;
+          break;
+
+        case STATUS_SEND_AT :
+          gsm_answer = false;
+          Send_CMGF();
+          gsm_status = STATUS_SEND_CMGF;
+          LED_TOGGLE(3);
+          break;
+
+        case STATUS_SEND_CMGF :
+          gsm_answer = false;
+          Send_CNMI();
+          gsm_status = STATUS_SEND_CNMI;
+          LED_TOGGLE(3);
+          break;
+
+        case STATUS_SEND_CNMI :
+          gsm_answer = false;
+          Send_CPMS();
+          gsm_status = STATUS_SEND_CPMS;
+          LED_TOGGLE(3);
+          break;
+
+        case STATUS_SEND_CPMS :
+          gsm_answer = false;
+          gsm_status = STATUS_IDLE;
+          gsm_gsm_send_report_status = MODULES_START; /** Start reporting */
+          LED_TOGGLE(3);
+          break;
+
+        case STATUS_DELETE_SMS :
+          gsm_status = STATUS_IDLE;
+          break;
+
+        default:                               
+          break;
       }
     } else { /** We did not get the expected answer */
       /* Let's wait for the next line */
@@ -260,7 +274,7 @@
 static void request_for_msg(void)
 {
   char demande_lecture_SMS[16];
-  
+
   strcpy(expected_ack, "+CMGR");
   sprintf(demande_lecture_SMS, "AT+CMGR=%d", index_msg);
   waiting_for_reply = true;
@@ -269,10 +283,10 @@
 
 
 /** Receiving a SMS, third step, content in gsm_buf
-    Message can be
-      Bdd         where dd is a block index on two digits. WARNING: dd > 0
-      Sdd value   where dd>0 is a var index on two digits and value is a float
- */
+  Message can be
+  Bdd         where dd is a block index on two digits. WARNING: dd > 0
+  Sdd value   where dd>0 is a var index on two digits and value is a float
+  */
 static void gsm_receive_content(void)
 {
   // ?????? sprintf(data_to_send, "%d %s %s %s %s", index_msg, flag, 
expediteur, dateheure, data_recue);
@@ -365,6 +379,7 @@
 // Sending a message, second step; we have asked for network quality
 void gsm_send_report_continue(void)
 {
+  LED_ON(2);
   //We got "+CSQ: <rssi>,<ber>" <rssi> and <ber> on 2 digits (cf 3.5.4.4.4)
   // and we expect "OK" on the second line
   uint8_t rssi = atoi(gsm_buf + strlen("+CSQ: "));
@@ -378,6 +393,7 @@
   char buf[32];
   sprintf(buf, "AT+CMGS=\"%s\"", GCS_NUMBER);
   Send(buf);
+  LED_OFF(2);
 }
 
 
@@ -423,23 +439,23 @@
 
 static void gsm_parse(uint8_t c) {
   switch(c) {
-  case GSM_CR:
-    gsm_buf[gsm_buf_idx] = '\0';
-    gsm_line_received = true;
-    gsm_buf_len = gsm_buf_idx;
-    gsm_buf_idx=0;
-    break;
-  case '>':
-    prompt_received = true;
-    break;
-  case '\n':
-    break;
-  default:
-    if (gsm_buf_idx < GSM_MAX_PAYLOAD) { 
-      gsm_buf[gsm_buf_idx] = c;
-      gsm_buf_idx++;
-    } /* else extra characters are ignored */
-    break;
+    case GSM_CMD_LINE_TERMINATION:
+      break;
+    case '>':
+      prompt_received = true;
+      break;
+    case GSM_RESPONSE_FORMATING:
+      gsm_buf[gsm_buf_idx] = '\0';
+      gsm_line_received = true;
+      gsm_buf_len = gsm_buf_idx;
+      gsm_buf_idx=0;
+      break;
+    default:
+      if (gsm_buf_idx < GSM_MAX_PAYLOAD) { 
+        gsm_buf[gsm_buf_idx] = c;
+        gsm_buf_idx++;
+      } /* else extra characters are ignored */
+      break;
   }
 }
 
@@ -451,7 +467,7 @@
 
   while(string[i])
     GSMTransmit(string[i++]);
-  GSMTransmit(GSM_CR);
+  GSMTransmit(GSM_CMD_LINE_TERMINATION);
 
   DOWNLINK_SEND_DEBUG_GSM_SEND(DefaultChannel, i, string);
 }

Modified: paparazzi3/trunk/sw/airborne/modules/gsm/gsm.h
===================================================================
--- paparazzi3/trunk/sw/airborne/modules/gsm/gsm.h      2010-06-15 17:35:12 UTC 
(rev 4963)
+++ paparazzi3/trunk/sw/airborne/modules/gsm/gsm.h      2010-06-15 17:59:15 UTC 
(rev 4964)
@@ -32,6 +32,7 @@
 
 void gsm_init(void);
 void gsm_periodic_1Hz(void);
+void gsm_init_report(void);
 void gsm_send_report(void);
 void gsm_start(void);
 void gsm_stop(void);

Modified: paparazzi3/trunk/sw/airborne/modules/max3100/max3100_hw.c
===================================================================
--- paparazzi3/trunk/sw/airborne/modules/max3100/max3100_hw.c   2010-06-15 
17:35:12 UTC (rev 4963)
+++ paparazzi3/trunk/sw/airborne/modules/max3100/max3100_hw.c   2010-06-15 
17:59:15 UTC (rev 4964)
@@ -32,6 +32,7 @@
 
 uint8_t volatile max3100_status;
 bool volatile max3100_data_available;
+bool volatile max3100_transmit_buffer_empty;
 
 uint8_t volatile max3100_tx_insert_idx, max3100_tx_extract_idx;
 uint8_t volatile max3100_rx_insert_idx, max3100_rx_extract_idx;
@@ -73,6 +74,7 @@
 void max3100_init( void ) {
   max3100_status = MAX3100_STATUS_IDLE;
   max3100_data_available = false;
+  max3100_transmit_buffer_empty = true;
   max3100_tx_insert_idx = 0;
   max3100_tx_extract_idx = 0;
   max3100_rx_insert_idx = 0;
@@ -88,22 +90,22 @@
 
 
   /* From arm7/max1167_hw.c */
-  
+
   /* SS pin is output */
   SetBit(MAX3100_SS_IODIR, MAX3100_SS_PIN);
   /* unselected max3100 */
   Max3100Unselect();
 
-  /* connect P0.7 to extint2 (IRQ) */
+  /* connect extint (IRQ) */
   MAX3100_IRQ_PINSEL |= MAX3100_IRQ_PINSEL_VAL << MAX3100_IRQ_PINSEL_BIT;
-  /* extint0 is edge trigered */
+  /* extint is edge trigered */
   SetBit(EXTMODE, MAX3100_IRQ_EINT);
-  /* extint0 is trigered on falling edge */
+  /* extint is trigered on falling edge */
   ClearBit(EXTPOLAR, MAX3100_IRQ_EINT);
   /* clear pending extint0 before enabling interrupts */
   SetBit(EXTINT, MAX3100_IRQ_EINT);
 
-   /* Configure interrupt vector for external pin interrupt */
+  /* Configure interrupt vector for external pin interrupt */
   VICIntSelect &= ~VIC_BIT( MAX3100_VIC_EINT );    // EXTINT selected as IRQ
   VICIntEnable = VIC_BIT( MAX3100_VIC_EINT );             // EXTINT interrupt 
enabled
   VICVectCntl8 = VIC_ENABLE | MAX3100_VIC_EINT;
@@ -116,7 +118,8 @@
   VICVectAddr7 = (uint32_t)SPI1_ISR;    /* address of the ISR */
 
   /* Write configuration */
-  Max3100TransmitConf(MAX3100_BAUD_RATE | MAX3100_BIT_NOT_RM);
+  //Max3100TransmitConf(MAX3100_BAUD_RATE | MAX3100_BIT_NOT_TM);
+  Max3100TransmitConf(MAX3100_BAUD_RATE | MAX3100_BIT_NOT_RM | 
MAX3100_BIT_NOT_TM);
 }
 
 
@@ -124,15 +127,11 @@
 void EXTINT_ISR(void) {
   ISR_ENTRY();
 
-  LED_ON(2);
-
   max3100_data_available = true;
   
   SetBit(EXTINT, MAX3100_IRQ_EINT);   /* clear extint */
   VICVectAddr = 0x00000000; /* clear this interrupt from the VIC */
 
-  LED_OFF(2);
-
   ISR_EXIT();
 }
 
@@ -140,9 +139,6 @@
   ISR_ENTRY();
 
   while (bit_is_set(SSPSR, RNE)) {
-    //    uint8_t byte1 = SSPDR;
-    //uint8_t byte2 = SSPDR;
-    //    uint16_t data = byte1 << 8 | byte2;
     uint16_t data = SSPDR;
 
     if (bit_is_set(data, MAX3100_R_BIT)) { /* Data available */
@@ -150,6 +146,9 @@
       max3100_rx_insert_idx++;  // automatic overflow because len=256
       read_bytes = true;
     }
+    if (bit_is_set(data, MAX3100_T_BIT) && (max3100_status == 
MAX3100_STATUS_READING)) { /* transmit buffer empty */
+      max3100_transmit_buffer_empty = true;
+    }
   }
   SpiClearRti();                  /* clear interrupt */
   SpiDisableRti();    
@@ -162,5 +161,5 @@
 }
 
 void max3100_debug(void) {
-  /***     DOWNLINK_SEND_DEBUG(16, max3100_rx_buf); ***/
+  /***     DOWNLINK_SEND_DEBUG(DefaultChannel, 16, max3100_rx_buf); ***/
 }

Modified: paparazzi3/trunk/sw/airborne/modules/max3100/max3100_hw.h
===================================================================
--- paparazzi3/trunk/sw/airborne/modules/max3100/max3100_hw.h   2010-06-15 
17:35:12 UTC (rev 4963)
+++ paparazzi3/trunk/sw/airborne/modules/max3100/max3100_hw.h   2010-06-15 
17:59:15 UTC (rev 4964)
@@ -41,6 +41,7 @@
 
 extern volatile uint8_t max3100_status;
 extern volatile bool max3100_data_available;
+extern volatile bool max3100_transmit_buffer_empty; // Max3100 ready to 
receive data on SPI
 
 /** I/O Buffers */
 #define MAX3100_TX_BUF_LEN 256
@@ -70,6 +71,7 @@
 
 /* Datasheet page 12 */
 #if MAX3100_FOSC == 1843200
+#define MAX3100_B115200 0x0
 #define MAX3100_B57600 0x1
 #define MAX3100_B19200 0x9 
 #define MAX3100_B9600 0xA
@@ -82,6 +84,7 @@
 #define MAX3100_BIT_NOT_RM (1U<<10)
 #define MAX3100_BIT_NOT_TM (1U<<11)
 #define MAX3100_BIT_NOT_FEN (1U<<13)
+#define MAX3100_T_BIT 14
 #define MAX3100_R_BIT 15
 
 /** Like Uart macros */
@@ -120,10 +123,12 @@
   
 static inline void max3100_flush( void ) {
   if (max3100_status == MAX3100_STATUS_IDLE
-      && max3100_tx_extract_idx != max3100_tx_insert_idx) {
+      && max3100_tx_extract_idx != max3100_tx_insert_idx
+      && max3100_transmit_buffer_empty) {
     Max3100TransmitData(max3100_tx_buf[max3100_tx_extract_idx]);
     max3100_tx_extract_idx++; /* automatic overflow since len=256 */
     max3100_status = MAX3100_STATUS_WRITING;
+    max3100_transmit_buffer_empty = false;
   }
 }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]