Test program to send MAX!-Messages with a RFM22-Module

Dependencies:   RF22 TextLCD TextLCDScroll mbed RF22Max

Revision:
1:b71f9a293c54
Parent:
0:94dd393bd9bb
Child:
2:941c46d37d7e
--- a/main.cpp	Mon Jan 16 19:06:53 2012 +0000
+++ b/main.cpp	Wed Jan 18 20:09:21 2012 +0000
@@ -6,9 +6,19 @@
 #include "mbed.h"
 
 #include <RF22.h>
+#include "TextLCD.h"
+#include "mRotaryEncoder.h"
 
 Serial pc(USBTX, USBRX);
 
+TextLCD lcd(p30, p29, p28, p27, p26, p25, TextLCD::LCD16x2); // rs, e, d4-d7
+
+//mRotaryEncoder(PinName pinA, PinName pinB, PinName pinSW, PinMode pullMode=PullUp, int debounceTime_us=1500)
+mRotaryEncoder  wheel(p21, p22, p23, PullUp, 1500);
+
+volatile bool enc_pressed = false;      // Button of rotaryencoder was pressed
+volatile bool enc_rotated = false;      // rotary encoder was totaded left or right
+
 // mbed LEDs
 //DigitalOut led1(LED1);
 //DigitalOut led2(LED2);
@@ -20,6 +30,26 @@
 //rf22(PinName slaveSelectPin , PinName mosi, PinName miso, PinName sclk, PinName interrupt );
 RF22 rf22(p14,p11,p12,p13,p15);
 
+int counter = 1;
+
+float frequence = 869.50;           // frequence for sender
+const float f_offset = -0.01;       // frequence-offset for receiver
+
+
+//interrup-Handler for button on rotary-encoder - no function
+void trigger_sw() {
+    enc_pressed = true;               // just set the flag, rest is done outside isr
+}
+
+//interrup-Handler for rotary-encoder rotation - change frequence
+void trigger_rotated() {
+    frequence = wheel.Get()/1000.0;
+    lcd.locate(0,1);
+    lcd.printf("%4.3fMHz   ",frequence);
+    if (!rf22.setFrequency(frequence))               // set the new frequence
+        pc.printf("setFrequency failed");
+}
+
 void setup() {
 
     if (!rf22.init())
@@ -176,7 +206,9 @@
         pc.printf("setModemConfig failed");
     //uint8_t data[] = "hello";
     // 255 octets:
-    uint8_t data[] = "12345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012345";
+    //uint8_t data[] = "12345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012345";
+    uint8_t data[32] = "";
+    sprintf((char*)data,"Message-Nr:     %d",counter);
     rf22.send(data, sizeof(data));
     rf22.waitPacketSent();
     pc.printf("Send OK\n\r");
@@ -187,26 +219,27 @@
 void test_rx() {
     pc.printf("Start Receive...\n\r");
     //if (!rf22.setFrequency(869.50))
-    if (!rf22.setFrequency(869.49))      //          sending frequesnce doesn't work!!!  Seems to be a problem if combining RFM22B-S1 with -S2
+    if (!rf22.setFrequency(869.49))      //          sending frequence doesn't work!!! Offset!   Seems to be a problem if combining RFM22B-S1 with -S2
         pc.printf("setFrequency failed\n\r");
     if (!rf22.setModemConfig(RF22::GFSK_Rb2Fd5))
         pc.printf("setModemConfig failed\n\r");
 
     //while (1) {
-        uint8_t buf[RF22_MAX_MESSAGE_LEN];
-        uint8_t len = sizeof(buf);
-        if (rf22.recv(buf, &len)) // Should fail, no message available
-            pc.printf("recv 1 failed\n\r");
+    uint8_t buf[RF22_MAX_MESSAGE_LEN];
+    uint8_t len = sizeof(buf);
+    if (rf22.recv(buf, &len)) // Should fail, no message available
+        pc.printf("recv 1 failed\n\r");
 
-        //rf22.waitAvailable();
-        if (rf22.waitAvailableTimeout(6000)) {
-            if (rf22.recv(buf, &len))
-                pc.printf("got one in user: >%s<\n\r",(char*)buf);
-
-            else
-                pc.printf("recv 2 failed\n\r");
+    //rf22.waitAvailable();
+    if (rf22.waitAvailableTimeout(6000)) {
+        if (rf22.recv(buf, &len)) {
+            pc.printf("got one in user: >%s<\n\r",(char*)buf);
+            lcd.locate(0,0);
+            lcd.printf("%16s",(char*)buf);
         } else
-            pc.printf("recv timeout\n\r");
+            pc.printf("recv 2 failed\n\r");
+    } else
+        pc.printf("recv timeout\n\r");
 
     //}
 }
@@ -238,6 +271,8 @@
 float end = 869.65;
 float step = 0.02;
 
+
+
 void spec() {
     rf22.setModeRx();
     float freq;
@@ -261,16 +296,56 @@
     pc.printf("------------------\n\r");
 }
 
+void send_loop() {
+    uint8_t data[32] = "";
+
+    while (1) {
+        //uint8_t data[] = "hello";
+        // 255 octets:
+        //uint8_t data[] = "12345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012345";
+
+        sprintf((char*)data,"Message-Nr:     %d",counter++);
+        rf22.send(data, sizeof(data));
+        rf22.waitPacketSent();
+        pc.printf("Send OK: %s\n\r",(char*)data);
+
+        wait(2);  // Wait 2 Seconds
+    }
+}
+
+void receive_loop() {
+    while (1) {
+        uint8_t buf[RF22_MAX_MESSAGE_LEN];
+        uint8_t len = sizeof(buf);
+
+        rf22.waitAvailable();
+        if (rf22.recv(buf, &len)) {
+            pc.printf("got one in user: >%s<\n\r",(char*)buf);
+            lcd.cls();
+            lcd.locate(0,0);
+            lcd.printf("%16s",(char*)buf);
+        } else {
+            lcd.printf("recv  failed");
+            pc.printf("recv  failed\n\r");
+        }
+    }
+}
 
 int main() {
+
+//#define sender;                         // are we sender?
+
     pc.baud(115200);
 
     pc.printf("\n\rConnected to mbed\n\r");
 
+    lcd.locate(0,0);                    // 2nd cls needed, as otherwise it doesn't init correctly!!???
+    lcd.printf("RF22-Test-V1.0");
+
     pc.printf("Pre-setup|");
     setup();
     pc.printf("Post-setup\n\r");
-    
+
 
     //pc.printf("Pre-test_temp|");
     //test_temp();
@@ -285,13 +360,14 @@
         test_rssi();
         pc.printf("Post-test_rssi\n\r");
         }
-     
+
     while (1) {
         spec();
     }
     */
-    
+    /*
     while (1) {
+        lcd.cls();
         test_tx();
         rf22.setModeRx();
         wait(0.5);
@@ -299,7 +375,59 @@
         wait(2);
         spec();
     }
-    
+    */
+
+    if (!rf22.setModemConfig(RF22::GFSK_Rb19_2Fd9_6))
+        pc.printf("setModemConfig failed");
+
+
+// Test  activation of AFC: not enough for combination -S1/-S2 Modules!
+
+//  RF22_REG_1D_AFC_LOOP_GEARSHIFT_OVERRIDE     0x1d
+// RF22_AFC_EN                             0x40
+    rf22.spiWrite(RF22_REG_1D_AFC_LOOP_GEARSHIFT_OVERRIDE, RF22_AFC_EN);
+
+
+// Reg  RF22_REG_1E_AFC_TIMING_CONTROL          0x1e
+// RF22_AFC_TC                             0x0a
+    rf22.spiWrite(RF22_REG_1E_AFC_TIMING_CONTROL, RF22_AFC_TC );
+
+// Reg RF22_REG_2A_AFC_LIMITER                  0x2a
+// RF22_AFC_LIMIT                          0x50
+    rf22.spiWrite(RF22_REG_2A_AFC_LIMITER, RF22_AFC_LIMIT);
+
+#ifndef sender
+    frequence+=f_offset;
+#endif
+
+    wheel.Set(frequence*1000);   // 3 digits after period
+
+    // call trigger_rot() when the shaft is rotaded left or right - change frequence
+    wheel.attachROT(&trigger_rotated);
+
+    lcd.locate(0,1);
+    lcd.printf("%fMHz",frequence);
+    wait(10);
+    lcd.cls();
+
+    if (!rf22.setFrequency(frequence))
+        pc.printf("setFrequency failed");
+
+
+#ifdef sender
+    // Code for sending
+
+
+    send_loop();                // start sending
+#endif
+
+#ifndef sender
+    // Code for receiving
+
+    receive_loop();             // start receiving
+
+#endif
+
     //pc.printf("Ready.\n\r");
 }