SMS message display on LED Matrix board with printer option

Dependencies:   AdafruitThermalPrinter HT1632_LedMatrix VodafoneUSBModem mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
SomeRandomBloke
Date:
Mon Feb 25 22:22:20 2013 +0000
Parent:
1:243371cb92c8
Child:
3:59038ad536ac
Commit message:
Latest updates with link status message

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Jan 30 16:58:33 2013 +0000
+++ b/main.cpp	Mon Feb 25 22:22:20 2013 +0000
@@ -37,11 +37,12 @@
  *
  * TODO: Still have issue with restarts when using printer.
  * mbed-rtos and serial problem?
+ * Incoming queue for multiple messages, give each at least 60 to be displayed
  *
  */
 
 #define USE_LED
-#define USE_PRINTER
+#undef USE_PRINTER
 
 #include <ctype.h>
 
@@ -94,9 +95,12 @@
 #endif
 
 // Message buffers. New message waiting to be displayed and current message being displayed
+#define MAX_NUM_MSGS 10
 static char cmdBuf[12];
 static char newMsgBuf[MAX_MSG_LENGTH];
-static char msgBuf[MAX_MSG_LENGTH];
+static char msgBuf[MAX_NUM_MSGS][MAX_MSG_LENGTH];
+static int currentMsg = 0;
+static int numberOfMsgs = 0;
 
 #ifdef USE_LED
 static char ownNumber[20];
@@ -112,7 +116,7 @@
 DigitalOut led1(LED1);      // Activity
 DigitalOut led2(LED2);      // Activity, alternates with led2
 DigitalOut led3(LED3);      // SMS received, turns off after processed
-DigitalOut led4(LED4);      // USSD requested
+DigitalOut led4(LED4);      // USSD request in progress
 
 int threadRestartCount = 0;
 
@@ -141,11 +145,28 @@
 
 #ifdef USE_LED
 // Load a new message
-void setNewMessage( char *newMsgStart )
+void addNewMessage( char *newMsgStart )
 {
     strncpy( newMsgBuf, newMsgStart, MAX_MSG_LENGTH );
     resetMessage = true;
 }
+
+
+void resetMessageBuffers( )
+{
+    for( int i=0; i<MAX_NUM_MSGS; i++ ) {
+        strcpy( &msgBuf[i][0], "          " );
+    }
+    currentMsg = 0;
+    numberOfMsgs = 0;
+}
+
+void checkAndSetNextMessage()
+{
+    numberOfMsgs++;
+
+}
+
 #endif
 
 void sendUSSDCommand( VodafoneUSBModem *_modem, char *ussdCommand, bool setScrolling )
@@ -225,10 +246,6 @@
 #ifdef USE_LED
 void getOwnNumber(VodafoneUSBModem *_modem, char *numPtr  )
 {
-    char numBuf[10];
-    // Set RTC using received message, format is DD-MMM-YYYY HH:MM
-    // Month is in text name, e.g. NOV, time is using 24 hour clock.
-    struct tm t;
     int retryCount = 3;
 
     while( retryCount ) {
@@ -237,47 +254,18 @@
 #ifdef DEBUG
         debug_pc.printf("Own Number received %s\n", newMsgBuf);
 #endif
-
-        // Save number in array pointed to be numPtr
-        
-        // Terminator
-        *numPtr = '\0';
-        
-/*
-        
-
-        t.tm_sec = 0;    // 0-59
-        strncpy(numBuf, &newMsgBuf[15], 2 );
-        t.tm_min = atoi(numBuf);    // 0-59
-        strncpy(numBuf, &newMsgBuf[12], 2 );
-        t.tm_hour = atoi(numBuf);   // 0-23
-        strncpy(numBuf, &newMsgBuf[0], 2 );
-        t.tm_mday = atoi(numBuf);   // 1-31
-        strncpy(numBuf, &newMsgBuf[3], 3 );
-        t.tm_mon = 0;     // 0-11
-        for( int i=0; i<12; i++ ) {
-            if( strncmp( months[i], numBuf, 3 ) == 0 ) {
-                t.tm_mon = i;     // 0-11
-                break;
-            }
-        }
-        strncpy(numBuf, &newMsgBuf[9], 2 );
-        t.tm_year = 100 + atoi( numBuf );  // year since 1900
-
-        if( t.tm_year >110 ) {
-            // convert to timestamp and display
-            time_t seconds = mktime(&t);
-            set_time( seconds );
-            retryCount = 0;     // No more retries, terminate while
-        } else {
-            // Failed to set time, decrement tries
+        if( strlen(newMsgBuf) > 0 ) {
+            // Save number in array pointed to be numPtr
+            strncpy(ownNumber, newMsgBuf, strlen(newMsgBuf) );
+            retryCount = 0;
+        } else
             retryCount--;
-        }
-*/
     }
 }
 #endif
 
+char linkStateStr[6][13] = { "Unknown     ", "Registering ", "Denied      ", "No Signal   ", "Home Network", "Roaming     " };
+char bearerStr[6][5] = {"Unkn", "GSM ", "EDGE", "3G  ", "HSPA", "LTE " };
 
 void receiveSMS(void const*)
 {
@@ -286,24 +274,27 @@
 
     threadRestartCount++;
 
-//    int pRssi = 0;
-//    setNewMessage( "Starting" );
+    int pRssi = 0;
+//    addNewMessage( "Starting" );
 
+    LinkMonitor::REGISTRATION_STATE pRegistrationState;
+    LinkMonitor::BEARER pBearer;
 
-//    LinkMonitor::REGISTRATION_STATE pRegistrationState;
-//    LinkMonitor::BEARER pBearer;
+    modem.getLinkState( &pRssi,&pRegistrationState, &pBearer);
+#ifdef DEBUG
+    debug_pc.printf("Link state Rssi: %d, Registration state %x Bearer %x\n",pRssi,pRegistrationState, pBearer);
+#endif
+    sprintf(newMsgBuf, "Link State: %s on %s          ", linkStateStr[pRegistrationState], bearerStr[pBearer] );
+    addNewMessage( newMsgBuf );
 
-//    modem.getLinkState( &pRssi,&pRegistrationState, &pBearer);
-#ifdef DEBUG
-//    debug_pc.printf("Link state Rssi: %d, Registration state %x Bearer %x\n",pRssi,pRegistrationState, pBearer);
-#endif
+    Thread::wait(3000);
 
 #ifdef USE_LED
     // Get own number fromt he  network
     getOwnNumber( &modem, ownNumber );
 #endif
 
-//    sprintf(msgBuf, "Link state Rssi: %d, Registration state %x Bearer %x      ",pRssi,pRegistrationState, pBearer);
+//    sprintf(msgBuf[&msgBuf[currentMsg][0], "Link state Rssi: %d, Registration state %x Bearer %x      ",pRssi,pRegistrationState, pBearer);
 #ifdef USE_PRINTER
     // Check if time already set, if not then get it. Use year = 0 as test
     struct tm *t = localtime(&seconds);
@@ -315,10 +306,10 @@
     timestampMessage( newMsgBuf );
 #endif
 #ifdef USE_LED
-    //strcpy( msgBuf, INFO_MSG );
+    //strcpy( &msgBuf[currentMsg][0], INFO_MSG );
     sprintf(newMsgBuf, "%s %s          ", INFO_MSG, ownNumber );
-    setNewMessage( newMsgBuf );
-    
+    addNewMessage( newMsgBuf );
+
     led.displayOn();
 #endif
     char num[17];
@@ -353,17 +344,17 @@
 #ifdef USE_LED
                         resetMessage = true;
                     } else if ( strncmp( cmdBuf, "INFO", 4 ) == 0 ) {
-//                        setNewMessage( INFO_MSG );
+//                        addNewMessage( INFO_MSG );
                         sprintf(newMsgBuf, "%s %s          ", INFO_MSG, ownNumber );
-                        setNewMessage( newMsgBuf );
+                        addNewMessage( newMsgBuf );
 #endif
 //                  } else if ( strncmp( cmdBuf, "DEMO", 4 ) == 0 ) {
 //                        matrixDemo();
 //                        sprintf(newMsgBuf, "%s %s          ", INFO_MSG, ownNumber );
-//                        setNewMessage( newMsgBuf );
+//                        addNewMessage( newMsgBuf );
 #ifdef USE_LED
                     } else if ( strncmp( cmdBuf, "CLEAR", 5 ) == 0 ) {
-                        setNewMessage( "      " );
+                        addNewMessage( "      " );
 #endif
                     }
                 }
@@ -382,16 +373,16 @@
 
     while(true) {
         // shift the whole screen 6 times, one column at a time; making 1 character
-        if( strlen( msgBuf ) > 10 ) {
+        if( strlen( &msgBuf[currentMsg][0] ) > 10 ) {
             for (int x=0; x < 6; x++) {
                 led.scrollLeft(1, 1);
                 msgx--;
                 // fit as much as we can on the available display space
 
-                while (!led.putChar(msgx,0,msgBuf[crtPos]))  { // zero return if it all fitted
+                while (!led.putChar(msgx,0,msgBuf[currentMsg][crtPos]))  { // zero return if it all fitted
                     led.getXY(&msgx,&y);
                     crtPos++; // we got all of the character on!!
-                    if (crtPos >= strlen(msgBuf)) {
+                    if (crtPos >= strlen(&msgBuf[currentMsg][0])) {
                         crtPos = 0;
                     }
                 }
@@ -405,11 +396,12 @@
             led.clear();
             crtPos = 0;
             msgx = 1;
-            strncpy( msgBuf, newMsgBuf, MAX_MSG_LENGTH );
-            if( strlen( msgBuf ) > 10 ) {
-                strcat( msgBuf, "          ");
+
+            strncpy( &msgBuf[currentMsg][0], newMsgBuf, MAX_MSG_LENGTH );
+            if( strlen( &msgBuf[currentMsg][0] ) > 10 ) {
+                strcat( &msgBuf[currentMsg][0], "          ");
             } else {
-                led.putString(0,0, msgBuf);
+                led.putString(0,0, &msgBuf[currentMsg][0]);
             }
             resetMessage = false;
         }
@@ -446,7 +438,7 @@
     wait(2);
 
     led.clear();
-    led.init(2,1);    // Use displays 1 and 2 as 64x8 display
+    led.init(LED_MAX_DISPLAY_X,LED_MAX_DISPLAY_Y);
 }
 
 
@@ -485,7 +477,7 @@
     int displayCount = 10;
     bool displayTime = true;
 
-    led.init(LED_MAX_DISPLAY_X,LED_MAX_DISPLAY_Y);    // Use displays 1 and 2 as 64x8 display
+    led.init(LED_MAX_DISPLAY_X,LED_MAX_DISPLAY_Y);    // Use all displays as 128x8 display
     led.clear();
     led.setBrightness(2);
     //led.displayOff(); // Turn off display for now until receiver tast has started
@@ -496,7 +488,7 @@
 #endif
 
     // Set initial blank message
-    strcpy( msgBuf, "          " );
+    resetMessageBuffers();
 
     Thread receiveTask(receiveSMS, NULL, osPriorityNormal, 1024 * 8);   // try 6 next
 #ifdef USE_LED
@@ -529,5 +521,5 @@
         Thread::wait(1000);
     }
 
-    return 0;
+    //return 0;
 }
\ No newline at end of file
--- a/mbed.bld	Wed Jan 30 16:58:33 2013 +0000
+++ b/mbed.bld	Mon Feb 25 22:22:20 2013 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/0954ebd79f59
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/3d0ef94e36ec
\ No newline at end of file