Class to communicate with ELV(R) MAX! wireless devices with RFM22B-Modules. Based on Library RF22. Initial version unable to send! Only receive! See http://mbed.org/users/charly/notebook/reading-a-max-wireless-window-sensor-with-rfm22-an/

Dependents:   RF22_MAX_test_Send

Revision:
2:f75e51ce001b
Parent:
0:565a81d6f278
--- a/RF22Max.cpp	Wed Sep 18 20:03:26 2013 +0000
+++ b/RF22Max.cpp	Tue Oct 22 19:41:52 2013 +0000
@@ -1,3 +1,6 @@
+//show debug output on Serial pc
+#define DEBUG
+
 #include "mbed.h"
 #include <RF22Max.h>
 
@@ -8,9 +11,9 @@
 }
 
 static const RF22::ModemConfig max_config = { // for MAX! protocol
-    .reg_1c = 0x01,
-    .reg_1f = 0x03,
-    .reg_20 = 0x90,
+    .reg_1c = 0x01, //POR-Value : 75KHzBW?
+    .reg_1f = 0x03, //POR-Value: 
+    .reg_20 = 0x90, //?? Oversampling Rate
     .reg_21 = 0x20,
     .reg_22 = 0x51,
     .reg_23 = 0xea,
@@ -22,10 +25,12 @@
     .reg_2e = 0x00,
     .reg_58 = 0x80, // Copied from RF22 defaults
     .reg_69 = 0x60, // Copied from RF22 defaults
-    .reg_6e = 0x08,
-    .reg_6f = 0x31,
-    .reg_70 = 0x24,
-    .reg_71 = RF22_DTMOD_FIFO | RF22_MODTYP_FSK,
+    //.reg_6e = 0x08, // TX Data Rate 1
+    //.reg_6f = 0x31, // TX Data Rate 0
+    .reg_6e = 0x51, // TX Data Rate 1
+    .reg_6f = 0xDC, // TX Data Rate 0
+    .reg_70 = 0x20, //<30kps,no manchaster, no dewithening
+    .reg_71 = RF22_DTMOD_FIFO | RF22_MODTYP_FSK, //=0x22
     .reg_72 = 0x1e,
 };
 
@@ -169,7 +174,7 @@
     if (ret) {
         //Max! specific settings
         this->RF22::setModemRegisters(&max_config);
-        this->RF22::setFrequency(868.3, 0.035);
+        this->RF22::setFrequency(868.299866, 0.035);
         /* Disable TX packet control, since the RF22 doesn't do proper
          * whitening so can't read the length header or CRC. We need RX packet
          * control so the RF22 actually sends pkvalid interrupts when the
@@ -181,8 +186,8 @@
         this->RF22::setSyncWords(max_sync_words, lengthof(max_sync_words));
         /* Detect preamble after 4 nibbles */
         this->RF22::spiWrite(RF22_REG_35_PREAMBLE_DETECTION_CONTROL1, (0x4 << 3));
-        /* Send 8 bytes of preamble */
-        this->RF22::setPreambleLength(8); // in nibbles
+        /* Send 4 nibbles of preamble */
+        this->RF22::setPreambleLength(4); // in nibbles
         this->RF22::spiWrite(RF22_REG_3E_PACKET_LENGTH, 30); // maximum length of a MAX!-packet
     }
     return ret;
@@ -310,6 +315,52 @@
             }
 
         }
+#if 0
+        if (message->type == 0x00 && len >= 11) { //PairPing
+            char    serial[20]="";
+            uint8_t sbuf[RF22_MAX_MESSAGE_LEN];
+            uint8_t slen =0;
+            
+            strncpy(serial,(char*)buf+14,10); //10 Characters for Seial Number
+            serial[11] = '\0';
+#ifdef DEBUG                    
+            pc.printf("Serial:        %s\n\r",serial);
+#endif            
+
+            // try to send PairPong
+            // wait some time
+            wait_ms(20);         // seen at moritz-code
+            sbuf[0] = 11; // MsgLen
+            sbuf[1] = buf[1]+1 &0xFF; // MsgCount ??
+            sbuf[2] = 0x00; // Flag
+            sbuf[3] = 0x01; // Type = Cmd = PairPong
+            sbuf[4] = 0x11; // From Fake Address
+            sbuf[5] = 0x11; // From
+            sbuf[6] = 0x11; // From
+            sbuf[7] = buf[4] ; // To Address = From address of Windowcontact
+            sbuf[8] = buf[5] ;
+            sbuf[9] = buf[6] ;
+            sbuf[10] = 0x00; // GroupId
+            sbuf[11] = 0x00;  //Payload is 0x00 for pairpong?
+            slen = 12+2; //+2Byte CRC????
+            /* Calculate CRC */
+            uint16_t scrc = calc_crc(sbuf, slen - 2);
+            sbuf[12] = crc >> 8;
+            sbuf[13] = crc & 0xff;
+
+
+            if (RF22::send(sbuf,slen)) {
+#ifdef DEBUG        
+                pc.printf("Send PairPong OK\n\r");
+#endif                
+            } else {
+#ifdef DEBUG                    
+                pc.printf("Send PairPong NOT OK\n\r");
+#endif                
+            }
+
+        }
+#endif
         return true;
     } else
         return false;