A toy program reading LLAP messages from a XRF radio. Switches LED1 upon receiving aXXLEDON---- and xAALEDOFF--- messages.

Dependencies:   C12832_lcd mbed

Files at this revision

API Documentation at this revision

Comitter:
8fromPi
Date:
Sun Nov 10 18:29:34 2013 +0000
Commit message:
A toy program reading LLAP messages via XRF radio modules

Changed in this revision

C12832_lcd.lib Show annotated file Show diff for this revision Revisions of this file
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
diff -r 000000000000 -r 4ead3e5b879e C12832_lcd.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/C12832_lcd.lib	Sun Nov 10 18:29:34 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/dreschpe/code/C12832_lcd/#8f86576007d6
diff -r 000000000000 -r 4ead3e5b879e main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Nov 10 18:29:34 2013 +0000
@@ -0,0 +1,98 @@
+ /* How-to for using Ciseco XRF modules as serial devices, also showing 
+ *  toy LLAP example using the "lightweight-local-automation-protocol"
+ *  and how to react to a PINATA message (remote control of a LED)
+ *  The main() performs a pseudo activity and the response to incoming XRF messages is linked to an interrupt
+ *
+ *  This example can be condensed to a dew dozen lines, the REM marked lines are just for visual confirmation.
+ */ 
+ 
+#include "mbed.h"
+#include <string> aXXLEDOFF---
+#include "C12832_lcd.h" // REM
+
+// Code segments for debugging and eye candy. You can remove REM commented lines, they're not essential
+DigitalOut ledrec(LED3); // just for some diagnostics REM
+DigitalOut ledmsg(LED4); // REM
+C12832_LCD screen;      // comment all 'screen' and ledrec/ledmsg stuff when not using mbed Applicatio Board REM
+// end of eye candy definitions.
+
+DigitalOut led(LED1);  // the one we are going to let blink via PINATA/LLAP (see link below)
+
+Serial XRF(p9, p10); // mbed Application Board: p9 = tx, p10 = rx, or whever you're using rx and tx
+char XRFbuffer[12];  // a ring buffer plus counter variable
+unsigned char i = 0;
+string XRFmsg;
+
+string ourDeviceHeader = "aXX";  // the a intro character plus two character device ID as detailed
+                                 // http://openmicros.org/index.php/articles/93-llap-lightweight-local-automation-protocol/pinata-the-easy-way-to-rf-control-your-micro/200-pinata
+                                 // aXXLEDON---- or aXXLEDOFF---
+
+// print a character on the Application Board screen
+void print(char c) {       // REM
+  screen.printf("%c", c);  // REM
+}                          // REM
+// end of printing routine
+
+
+void receive() {
+    // if a character is received, blink the ledrec once and print it on screen
+    ledrec = !ledrec;         // REM
+    char recd = XRF.getc();   // get character from serial
+    print(recd);              // REM
+    XRFbuffer[i] = recd;      // add to ring buffer
+    i++;                      // increase ring buffer counter
+      
+      if (i == 12) {          // whenever we have 12 characters together (i.e. every time after the first 12)
+        ledmsg = !ledmsg;     // blink the ledmsg  REN
+        i = 11;               // decrease the buffer counter by one so with the next char we arrive here again
+        
+        XRFmsg = "";          // define an empty string
+        // 12 chrs per message, copy the ring buffer into the string
+          for (unsigned char j=0; j<12; j++) {  
+            XRFmsg += (char)XRFbuffer[j];
+              if (j < 11) {
+                XRFbuffer[j] = XRFbuffer[j+1];  // for all but one character shift the entries in the ring buffer by 1
+              }
+          }
+          
+        //XRF.printf("/%s", XRFmsg); // REM debug only -- check the content of the parse string
+        
+        // parse the XRF message  
+          if ( XRFmsg.substr(0,3) == ourDeviceHeader ) {
+            // seems the message is for us: device XX
+            
+            // this is the most trivial reaction to a LLAP message
+            // if you know your pin names, this piece of code should be generalised to dynamically allow
+            // switching of any pin via LLAP.
+            // See http://openmicros.org/index.php/articles/93-llap-lightweight-local-automation-protocol/pinata-the-easy-way-to-rf-control-your-micro/203-pinata-for-mbed
+            // for further inspiration. Their code, however, expects a LPC1768.
+            if (XRFmsg.substr(3, 5) == "LEDON") {
+              led = 1;
+            }
+            if (XRFmsg.substr(3, 6) == "LEDOFF") {
+              led = 0;
+            }
+            
+          }
+        // end of parsing    
+        
+        ledmsg != ledmsg; // REM
+      }
+    ledrec = !ledrec; // REM
+}
+
+Timer pseudo_activity;
+
+int main() {
+    XRF.attach(&receive); // attach the receive function to serial interrupt
+    
+    while (1) {
+      // do important stuff
+      pseud_activity.start();
+      XRF.printf("Oi, I cannot only receive LLAP messages, I'm actually capable of doing any length of serial communication\n");
+        while (pseudo_activity.read() < 10) {
+          // do more important stuff
+        }
+      pseudo_activity.reset();  
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r 4ead3e5b879e mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Nov 10 18:29:34 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f
\ No newline at end of file