Programm for decoding radio-signals sent by a ETH-Window-Shutter-Contact, received with a RFM12B-module

Dependencies:   TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
charly
Date:
Thu Apr 07 19:54:09 2011 +0000
Parent:
0:96794c9fc5a3
Commit message:
Reorganized and created classes for RFM12B and ETH-Comfort

Changed in this revision

eth_comfort.cpp Show annotated file Show diff for this revision Revisions of this file
eth_comfort.h 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
rfm12b.cpp Show annotated file Show diff for this revision Revisions of this file
rfm12b.h Show annotated file Show diff for this revision Revisions of this file
--- a/eth_comfort.cpp	Wed Mar 02 20:46:57 2011 +0000
+++ b/eth_comfort.cpp	Thu Apr 07 19:54:09 2011 +0000
@@ -5,7 +5,7 @@
   Modulation FSK
   Hub +/- 15kHz
   Datenrate 10kbit Manchester
-  
+
   das Protokoll ist Machester codiert
   0x7e zz ll aa aa aa cmd crc crc
 
@@ -18,15 +18,15 @@
   die Reihenfolge der Bits im Byte ist verdreht.
 
 */
-
-
-// WED 6.9.2009
-// extended and adapeted to mbed by Karl Zweimueller 1/2011
+/*!
+ * \file       eth_comfort.cpp
+ * \brief      Read the messages from the ETH-Radio-Shutter
+ * \author     Karl Zweimüller based on code from WED 6.9.2009
+ */
 
 
 #include "eth_comfort.h"
 
-
 /* orig AVR-values
 #define BIT_MAX 0x90
 #define BIT_MIN 0x10
@@ -40,23 +40,27 @@
 #define LEN_2T 200                          // time-value to differentiate one or two bit length
 
 
-volatile uint16_t b;
-
-volatile uint8_t transmit,bit_cnt;
-volatile uint16_t buffer_cnt;
-
-
-volatile unsigned char old ;
-volatile uint8_t rbyte;
-
-volatile uint8_t buf[1024];
-volatile uint8_t pack_ok,startbit;
-volatile uint8_t decode,bcnt,lastbit;
-volatile uint8_t state;
-
 // Timer for bit-length-measurement
 Timer BitTime;
 
+
+eth_comfort::eth_comfort(PinName mosi, PinName miso, PinName sclk, PinName nsel, PinName rxdata, PinName rxled) {
+
+    rfm12b_spi = new rfm12b(mosi,miso,sclk,nsel,rxdata);
+
+    // the ReceiveLED
+    rxLED = new DigitalOut(rxled);
+
+    // init the eth_receiver
+    init();
+
+    // Interrupt on every bit-change
+    rfm12b_spi->attachISR(this, &eth_comfort::ISR);
+
+    // Init the RFM12B
+    rfm12b_spi->RFM_init();
+
+};
 //-------------------------------------------------------------------------
 // calcCRC16r()
 //-------------------------------------------------------------------------
@@ -67,29 +71,57 @@
  * @param mask crc polynom
  * @return crc value
  */
-uint16_t calcCRC16r( uint16_t c,uint16_t crc, uint16_t mask)  // reverser crc!!!!!!
-{
-uint8_t  i;
-  for(i=0;i<8;i++)
-  {
-    if((crc ^ c) & 1) { crc=(crc>>1)^mask; }
-    else crc>>=1;
-    c>>=1;
-  };
- return(crc);
+uint16_t eth_comfort::calcCRC16r( uint16_t c,uint16_t crc, uint16_t mask) { // reverse crc!!!!!!
+    uint8_t  i;
+    for (i=0;i<8;i++) {
+        if ((crc ^ c) & 1) {
+            crc=(crc>>1)^mask;
+        } else crc>>=1;
+        c>>=1;
+    };
+    return(crc);
 }
 
 // initialize eth_receiver
-void eth_init()
-{
-      // start timer for bit-length-measurement
-      BitTime.start();
+void eth_comfort::init() {
+
+    rbyte=0;
+    bit_cnt=0;
+    buffer_cnt=0;
+    decode=0;
+    pack_ok=0;
 
+    // start timer for bit-length-measurement
+    BitTime.start();
+    message_received = false;
+    // init the buffer
+    last_message.cnt = 0;
+    last_message.len = 0;
+    last_message.adr = 0;
+    last_message.cmd = 0;
+    last_message.data = 0;
+    last_message.xdata = 0;
+    last_message.crc = 0;
+
+    new_message = last_message;
 }
 
-//
-//
-//
+
+// is a new message readable
+bool eth_comfort::readable() {
+    return(message_received);
+}
+
+// read a eth-messsage
+eth_message eth_comfort::getMessage() {
+    if (readable()) {
+        last_message = new_message;
+        message_received = false;
+        return(new_message);
+    } else
+        // we should return nothing here!
+        return(last_message);
+}
 
 /** ISR Interrupt routine for received data
   * triggers on every pin change high/low and low/high
@@ -97,106 +129,163 @@
   * as the eth doesn't send a good signal, which the rfm12 could decode for himself
   * didn't test for myself - just got the code from someone else and ported to mbed!
 */
-void ISR()    // pin change on rxin ->interrupt
-{
-      //led2=!led2;
-      b=BitTime.read_us();                                      // time since last change
-      BitTime.reset();
+void eth_comfort::ISR() {  // pin change on rxin ->interrupt
+    //led2=!led2;
+    b=BitTime.read_us();                                      // time since last change
+    BitTime.reset();
+
+    if ((b>BIT_MAX)||(b<BIT_MIN)) {                           // is bit time in range?
+        state=0;
+    } else {
+
+
+        if (state==0) {                                // wait for first bitchange 2T
+            if (b>LEN_2T)state=1;
+            //if((rxin)!=0)state=0;                      // level should be low
+        } else if (state<=10) {                         // wait for 5 fullbit without bitchange 10 shortbits
+            if (b<LEN_2T)state++;
+            else state=1;                              // bitchange found back to state 1
+        } else if (state==11) {                         // now expecting bitchange (last bit in 7e is 0)
+            if (b<LEN_2T) {
+                state=0;                               // no bitchange -> back to search
+            };
+            state=20;                                  // now we found 7e sync finished
+            rbyte=0x7e;                                // set shift value to 0
+            bit_cnt=8;                                 // clear bitcounter
+            buffer_cnt=0;                              // clear buffercounter
+            bcnt=0;
+            lastbit=0;
 
-      if((b>BIT_MAX)||(b<BIT_MIN)){                             // is bit time in range?
-          state=0;
-      }
-      else{
+        } else if (state==20) {
+            if (b>LEN_2T) {                              // check for bitchange
+                if (lastbit!=0) {
+                    rbyte=(rbyte>>1);                     // last bit was 1 new is 0
+                    bcnt=0;
+                    lastbit=0;
+                } else {
+                    rbyte=(rbyte>>1)|0x80;              // last bit was 0 new is 1
+                    bcnt++;
+                    lastbit=1;
+                }
+                state=20;                                // fullbit compleate
+                bit_cnt++;                            // increase bit counter
+            } else {
+                state=21;                                // bit is halfbit, wait for next halfbit
+            };
+        } else if (state==21) {                         // no bitchange
+            if (b<LEN_2T) {                              // next bit must be a halfbit
+                if (lastbit==0) {
+                    rbyte=(rbyte>>1);  // last bit was 0 new is 0
+                    lastbit=0;
+                    bcnt=0;
+                } else {
+                    rbyte=(rbyte>>1)|0x80;              // last bit was 1 new is 1
+                    lastbit=1;
+                    bcnt++;
+                }
+                state=20;
+                bit_cnt++;
+            } else {
+                state=0;                            // bit is no halfbit -> Manchester violation
+                // state=20;
+            };
+        } else if (state==22) {                         // after 5 bit 1 skip one bit 0
+            if (b>LEN_2T) {                              // check for bitchange (next bit 0)
+                lastbit=0;
+                state=20;
+            } else {
+
+                lastbit=1;
+                //state=11;
+                state=21;
+            }
+            bcnt=0;
 
 
-              if(state==0){                                  // wait for first bitchange 2T
-                  if(b>LEN_2T)state=1;
-                  //if((rxin)!=0)state=0;                      // level should be low
-              }
-              else if(state<=10){                            // wait for 5 fullbit without bitchange 10 shortbits
-                  if(b<LEN_2T)state++;
-                  else state=1;                              // bitchange found back to state 1
-              }
-              else if(state==11){                            // now expecting bitchange (last bit in 7e is 0)
-                  if(b<LEN_2T){
-                      state=0;                               // no bitchange -> back to search
-                  };
-                  state=20;                                  // now we found 7e sync finished
-                  rbyte=0x7e;                                // set shift value to 0
-                  bit_cnt=8;                                 // clear bitcounter
-                  buffer_cnt=0;                              // clear buffercounter
-                  bcnt=0;
-                  lastbit=0;
+        }
+        if (bcnt==5)state=22;
+
+        if (bit_cnt>7) {                              // wait for 8 bits
+            buf[buffer_cnt]=rbyte;                    // save value into buffer
+            if (buffer_cnt<1020) {
+                buffer_cnt++;
+            };
+            pack_ok=1;                                // set receiveflag
+            bit_cnt=0;                                // clear bitcounter
+            *rxLED = ! *rxLED;                              //show received byte
+            //////////////////////////////////////////////////////////////////////////////////////////////////////////
+            //here we received another byte
 
-              }
-              else if(state==20){
-                  if(b>LEN_2T){                                // check for bitchange
-                      if(lastbit!=0){
-                          rbyte=(rbyte>>1);                     // last bit was 1 new is 0
-                          bcnt=0;
-                          lastbit=0;
-                      }
-                      else {
-                          rbyte=(rbyte>>1)|0x80;              // last bit was 0 new is 1
-                          bcnt++;
-                          lastbit=1;
-                      }
-                      state=20;                                // fullbit compleate
-                      bit_cnt++;                            // increase bit counter
-                  }
-                  else{
-                      state=21;                                // bit is halfbit, wait for next halfbit
-                  };
-              }
-              else if(state==21){                            // no bitchange
-                  if(b<LEN_2T){                                // next bit must be a halfbit
-                      if(lastbit==0){
-                          rbyte=(rbyte>>1);  // last bit was 0 new is 0
-                          lastbit=0;
-                          bcnt=0;
-                      }
-                      else {
-                          rbyte=(rbyte>>1)|0x80;              // last bit was 1 new is 1
-                          lastbit=1;
-                          bcnt++;
-                      }
-                      state=20;
-                      bit_cnt++;
-                  }
-                  else{
-                      state=0;                            // bit is no halfbit -> Manchester violation
-                     // state=20;
-                  };
-              }else if(state==22){                            // after 5 bit 1 skip one bit 0
-                  if(b>LEN_2T){                                // check for bitchange (next bit 0)
-                      lastbit=0;
-                      state=20;
-                  }
-                  else{
+            // we have to check  if we are ready with the message
+            if (buffer_cnt>8) {
+                if     (buf[2]==0x10) blocklength=10;
+                else if (buf[2]==0x20) blocklength=9;
+                else                  blocklength=99;
+                j=0;
+                crc_ok = false;
+                for (i=0;i<=buffer_cnt;i++) {
+                    //pc.printf("%02X ",buf[i]);
+                    j++;
+                    if (j==blocklength) {
+                        //check crc
+                        if (blocklength==9) {
+                            crc=0xbdb7;
+                            for (k=0;k<7;k++) {                         // crc over first 7 byte
+                                crc=calcCRC16r(buf[k],crc,0x8408);
+                            }
+                            //swap the two crc-bytes
+                            swapped = ((crc >> 8) & 0xff) | ((crc << 8) & 0xff00);
+                            //pc.printf("CRC: %04X ",swapped);
+                            if (((buf[7]<<8) | buf[8]) == swapped) crc_ok = true;
+                            else crc_ok = false;
+                            //pc.printf("%s", (crc_ok==true) ? "OK" : "Not OK");
+                            if (crc_ok) {
+                                /*
+                                pc.printf("\n\rCounter: %02X\n\r",buf[1]);
+                                pc.printf(    " Dev-ID: %02X %02X %02X\n\r",buf[3],buf[4],buf[5]);
+                                //pc.printf(    "Battery: %s\n\r", (buf[6]&0x80 != 0x00) ? "WEAK" : "GOOD");
+                                pc.printf(    "Window : %s\n\r\n\r", (buf[6]&0x01 != 0x00) ? "OPEN" : "CLOSE");
+                                lcd.cls();
+                                lcd.printf("#:%02X ID: %02X%02X%02X\n",buf[1],buf[3],buf[4],buf[5]);
+                                lcd.printf("Window : %s\n", (buf[6]&0x01 != 0x00) ? "OPEN" : "CLOSE");
+                                */
 
-                     lastbit=1;
-                     //state=11;
-                     state=21;
-                  }
-                  bcnt=0;
+                                // insert buf into message
+                                new_message.cnt = buf[1];
+                                new_message.len = buf[2];
+                                new_message.adr = buf[3]<<16 | buf[4]<<8 | buf[5];
+                                new_message.cmd = buf[6];
+                                new_message.data = buf[7];
+                                new_message.xdata = 0;
+                                new_message.crc = swapped;
+
+                                //is the new message different from the old message?
+                                if (new_message.cnt != last_message.cnt) {
+                                    last_message = new_message;
+                                    message_received = true;
+                                }
+
+                            } //crc_ok
+                        } //block_length = 9
+                    } //j==blocklength
+                } //for
 
 
-              }
-              if(bcnt==5)state=22;
+                //start receive from beginning
+                buffer_cnt=0;
+                bit_cnt=0;
+                startbit=0;
+                state=0;
+                //pc.printf("\n\r-----------------------------\n\r");
+                //clear the buffer
+                for (i=0;i<1023;i++)buf[i]=0;
+                *rxLED = 0;           //turn off receive led
+            } //buffer_cnt >8
+            //////////////////////////////////////////////////////////////////////////////////////////////////////////
+            //
+        }
+    }
 
-              if(bit_cnt>7){                                // wait for 8 bits
-                  buf[buffer_cnt]=rbyte;                    // save value into buffer
-                  if(buffer_cnt<1020){
-                      buffer_cnt++;
-                  };
-                  pack_ok=1;                                // set receiveflag
-                  bit_cnt=0;                                // clear bitcounter
-                  led3= !led3;                              //show received byte
-                  
-                  //
-              };
-      };
-      
 }
 
 
--- a/eth_comfort.h	Wed Mar 02 20:46:57 2011 +0000
+++ b/eth_comfort.h	Thu Apr 07 19:54:09 2011 +0000
@@ -1,45 +1,98 @@
 #ifndef ETH_COMFORT_H
 #define ETH_COMFORT_H
 
+/*!
+ * \file       eth_comfort.h
+ * \brief      Read the messages from the ETH-Radio-Shutter
+ * \author     Karl Zweimüller 
+ */
+
+
 #include "mbed.h"
 
+#include "rfm12b.h"
+
+// a message from the eth-Device
+struct eth_message {
+    uint8_t    cnt;                //message-counter
+    uint8_t    len;                //message-length
+    uint32_t   adr;                // unique address of device
+    uint8_t    cmd;                // the command
+    uint8_t    data;               // optional data
+    uint8_t    xdata;              // optional extra data
+    uint16_t   crc;                // crc fro the message
+};
+
+/**
+  * Class for the ETH-Window shutter by ELV(R)
+  * Uses the rfm12B to receive the signals sent by the radio-shutter
+  *
+ */
+class eth_comfort {
+
+public:
+
+    /**
+     * Constructor.
+    *
+    * @param mosi SPI-Interface. One of the 2 PSI-Interfaces of mbed. Pin p5 or p11
+    * @param miso SPI-Interface. One of the 2 PSI-Interfaces of mbed. Pin p6 or p12
+    * @param sclk SPI-Interface. One of the 2 PSI-Interfaces of mbed. Pin p7 or p13
+    * @param nsel Chip-Select.   A Digial Output of mbed
+    * @param rxdata  Data-Pin for received data. A DigitalIn of mbed
+    * @param rxled   LED1 - LED4 for showing received bytes
+    */
+    eth_comfort(PinName mosi, PinName miso, PinName sclk, PinName nsel, PinName rxdata, PinName rxled);
+
+
+// initialize eth_comfort-receiver
+    void init();
+
+// is a new message readable - non blocking
+    bool readable();
+
+// read a eth-messsage - non blocking, shows the old message if no new is available
+    eth_message getMessage();
 
 
 
-extern volatile uint8_t transmit,start,phase,bit_cnt,data;
-extern volatile uint16_t buffer_cnt;
-
-
-extern volatile unsigned char old ;
+private:
 
-extern volatile uint8_t rbyte;
-
-extern volatile uint8_t buf[1024];
-extern volatile uint8_t pack_ok,startbit;
-extern volatile uint8_t decode,bcnt,lastbit;
-extern volatile uint8_t state;
+// Interrupt Routine
+    void ISR();
 
-struct eth_message{
-    uint8_t    cnt;
-    uint8_t    len;
-    uint32_t   adr;
-    uint8_t    cmd;
-    uint8_t    data;
-    uint8_t    xdata;
-    uint16_t   crc;
-};
+// the last received message
+    eth_message last_message;
 
-// led3 shows received bits
-extern DigitalOut led3;
+// new meeesage
+    eth_message new_message;
+
+// is a new message in the buffer?
+    bool message_received;
 
 // calcualte the crc for eth
-uint16_t calcCRC16r( uint16_t c,uint16_t crc, uint16_t mask);
+    uint16_t calcCRC16r( uint16_t c,uint16_t crc, uint16_t mask);
+
+    volatile uint8_t bit_cnt;
+    volatile uint16_t buffer_cnt;
+
+    volatile uint8_t rbyte;
 
-// initialize eth_comfort-receiver
-void eth_init();
+    volatile uint8_t buf[1024];
+    volatile uint8_t pack_ok,startbit;
+    volatile uint8_t decode,bcnt,lastbit;
+    volatile uint8_t state;
+    volatile uint16_t b;
+    volatile uint8_t blocklength;
+    int i,j,k;
+    bool  crc_ok;
+    uint16_t crc, swapped;
 
-// interupt-routine for received data
-void ISR();
+    rfm12b *rfm12b_spi;
+
+    DigitalOut *rxLED;
+
+};
 
 #endif
 
--- a/main.cpp	Wed Mar 02 20:46:57 2011 +0000
+++ b/main.cpp	Thu Apr 07 19:54:09 2011 +0000
@@ -2,141 +2,63 @@
 
 #include "TextLCD.h"
 
-TextLCD lcd(p30, p29, p28, p27, p26, p25, TextLCD::LCD16x2); // rs, e, d0-d3
-
 #include "eth_comfort.h"
 #include "rfm.h"
 #include "rfm12b.h"
 
-rfm12b rfm12b_spi(p11, p12, p13, p14, p18); // mosi, miso, sclk, cs, rxdata
+/*!
+ * \file       main.cpp
+ * \brief      Show the messages from ETH-Radio-Shutters on serial port and lcd
+ * \author     Karl Zweimüller
+ */
 
+TextLCD lcd(p30, p29, p28, p27, p26, p25, TextLCD::LCD16x2); // rs, e, d0-d3
+
+eth_comfort eth_comf(p11, p12, p13, p14, p18, LED4); // mosi, miso, sclk, cs, rxdata, rxled
 
 Serial pc(USBTX, USBRX); // tx, rx
 
 // mbed LEDs
+/*
 DigitalOut led1(LED1);
 DigitalOut led2(LED2);
 DigitalOut led3(LED3);
 DigitalOut led4(LED4);
-
-
-
-//---------------------------------------------------------------------
-
-void init(void)
-{
-
-  
-      rbyte=0;
-      bit_cnt=0;
-      buffer_cnt=0;
-
-      decode=0;
-      
-      pack_ok=0;           // this will be set by ISR, when byte was received
-      
-    
-      // init the eth_receiver
-      eth_init();
-      
-      // Interrupt on every bit-change
-      rfm12b_spi.attachISR(&ISR);
-      
-      // Init the RFM12B
-      rfm12b_spi.RFM_init();
-      
-}
+*/
 
 //---------------------------------------------------------------------
 //
 //---------------------------------------------------------------------
 
-int main()
-{
-uint8_t blocklength=0;
-unsigned int i,j=0,k;
-unsigned long timeout=0;
-unsigned long tick=0;
-uint16_t crc, swapped;
-bool  crc_ok = false;
+int main() {
+
+    eth_message message;
 
-  pc.baud(115200);
-
-  pc.printf("\n\rConnected to mbed\n\r");
-  lcd.printf("Hello!\n");
+    pc.baud(115200);
 
-  init();
-  
-                                                               // state =start
-  startbit=0;
-  do{
+    pc.printf("\n\rConnected to mbed\n\r");
+    lcd.printf("Hello!\n");
 
-      if (pack_ok==1){
-            timeout=0;
-            pack_ok=0;
-            j=0;
-      };
-      if(timeout<10000){
-            timeout++;
-      }
-      else if(timeout==10000){
-                  if(buffer_cnt>8){
-                        if     (buf[2]==0x10) blocklength=10;
-                        else if(buf[2]==0x20) blocklength=9;
-                        else                  blocklength=99;
-                        j=0;
-                        crc_ok = false;
-                        for(i=0;i<=buffer_cnt;i++){
-                              pc.printf("%02X ",buf[i]);
-                              j++;
-                              if(j==blocklength){
-                                    //check crc
-                                    if(blocklength==9){
-                                       crc=0xbdb7;
-                                       for(k=0;k<7;k++){                           // crc over first 7 byte
-                                           crc=calcCRC16r(buf[k],crc,0x8408);
-                                       }
-                                       //swap the two crc-bytes
-                                       swapped = ((crc >> 8) & 0xff) | ((crc << 8) & 0xff00);
-                                       pc.printf("CRC: %04X ",swapped);
-                                       if (((buf[7]<<8) | buf[8]) == swapped) crc_ok = true;
-                                       else crc_ok = false;
-                                       pc.printf("%s", (crc_ok==true) ? "OK" : "Not OK");
-                                       if (crc_ok) {
-                                          pc.printf("\n\rCounter: %02X\n\r",buf[1]);
-                                          pc.printf(    " Dev-ID: %02X %02X %02X\n\r",buf[3],buf[4],buf[5]);
-                                          //pc.printf(    "Battery: %s\n\r", (buf[6]&0x80 != 0x00) ? "WEAK" : "GOOD");
-                                          pc.printf(    "Window : %s\n\r\n\r", (buf[6]&0x01 != 0x00) ? "OPEN" : "CLOSE");
-                                          lcd.cls();
-                                          lcd.printf("#:%02X ID: %02X%02X%02X\n",buf[1],buf[3],buf[4],buf[5]);
-                                          lcd.printf("Window : %s\n", (buf[6]&0x01 != 0x00) ? "OPEN" : "CLOSE");
-                                       }
-                                    }
-                                    pc.printf("\n\r");
-                              }
-                         }
-                        
-                        
-                        //start receive from beginning
-                        buffer_cnt=0;
-                        bit_cnt=0;
-                        timeout++;
-                        startbit=0;
-                        state=0;
+    do {
+        // anything new?
+        if (eth_comf.readable()) {
+            // read the new message and display
+            message = eth_comf.getMessage();
+            pc.printf("\n\rCounter: %02X\n\r",message.cnt);
+            pc.printf(    " Dev-ID: %06X\n\r",message.adr);
+            pc.printf(    "    cmd: %0X\n\r",message.cmd);
+            //pc.printf(    "cmd&0x80: %0X\n\r",message.cmd&0x80);
+            // why doesn't work the following??????????????
+            //pc.printf(    "Battery: ");
+            //if (message.cmd&0x80 == 0x00) pc.printf("GOOD\n\r"); else pc.printf("WEAK\n\r");
 
-                        pc.printf("\n\r-----------------------------\n\r");
-                        for(i=0;i<1023;i++)buf[i]=0;
-                  };
-                  timeout = 0;
-      };
-      tick++;
-     //delay_ms(100);
-     if(tick>=2000000){
-            tick=0;
-            led1= !led1;
-            led3=0;               // reset receive-led
-      };
-}while(1==1);
+            pc.printf(    "Window : %s\n\r\n\r", (message.cmd&0x01 != 0x00) ? "OPEN" : "CLOSE");
+            lcd.cls();
+            lcd.printf("#:%02X ID: %06X\n",message.cnt,message.adr);
+            lcd.printf("Window : %s\n", (message.cmd&0x01 != 0x00) ? "OPEN" : "CLOSE");
+            pc.printf("\n\r");
+        }
+    } while (1==1);
 
 }
 
--- a/rfm12b.cpp	Wed Mar 02 20:46:57 2011 +0000
+++ b/rfm12b.cpp	Thu Apr 07 19:54:09 2011 +0000
@@ -2,39 +2,45 @@
 #include "rfm12b.h"
 #include "rfm.h"
 
+/*!
+ * \file       rfm12b.cpp
+ * \brief      class for rfm2b in rawmode - only receive part implemented
+ * \author     Karl Zweimüller based on code from WED 6.9.2009
+ */
+
+
 /** Class rfm12b for RFM12B transceiver module
   http://www.hoperf.com/rf_fsk/rfm12b.htm
 */
 
 /** rfm12b object
 */
-rfm12b::rfm12b(PinName mosi, PinName miso, PinName sclk, PinName nsel, PinName rxdata){
-  
-  rfm12b_spi  = new SPI(mosi, miso, sclk);   // mosi, miso, sclk
-  cs          = new DigitalOut(nsel);        // nsel for chipselect
-  m_pinRXData = new InterruptIn(rxdata);     // rxData- generates interrupts
+rfm12b::rfm12b(PinName mosi, PinName miso, PinName sclk, PinName nsel, PinName rxdata) {
 
-  init_spi();            // init the spi-device
+    rfm12b_spi  = new SPI(mosi, miso, sclk);   // mosi, miso, sclk
+    cs          = new DigitalOut(nsel);        // nsel for chipselect
+    m_pinRXData = new InterruptIn(rxdata);     // rxData- generates interrupts
+
+    init_spi();            // init the spi-device
 }
 
- /** init the spi-communication
- */
-void rfm12b::init_spi(){
+/** init the spi-communication
+*/
+void rfm12b::init_spi() {
     // Setup the spi for 16 bit data : 1RW-bit 7 adressbit, 8 databit
     // second edge capture, with a 5MHz clock rate
     rfm12b_spi->format(16,0);
     rfm12b_spi->frequency(5000000);
 }
- 
+
 ///////////////////////////////////////////////////////////////////////////////
 //
 // Initialise RF module
 // This are parameters for ETH Comfort by ELV
 ///////////////////////////////////////////////////////////////////////////////
-void rfm12b::RFM_init(void)
-{
+void rfm12b::RFM_init(void) {
 
-      // 0. Init the SPI backend
+    // 0. Init the SPI backend
     //RFM_TESTPIN_INIT;
 
     //RFM_READ_STATUS();
@@ -45,7 +51,7 @@
         //RFM_CONFIG_EF           |
         RFM_CONFIG_BAND_868     |
         RFM_CONFIG_X_11_0pf
-     );
+    );
 
     // 2. Power Management Command
     //RFM_SPI_16(
@@ -56,10 +62,10 @@
     RFM_SPI_16(
         RFM_FREQUENCY            |
         RFM_FREQ_868Band(868.30)
-     );
+    );
 
     // 4. Data Rate Command
-        RFM_SPI_16(RFM_DATA_RATE_9600);
+    RFM_SPI_16(RFM_DATA_RATE_9600);
 
     // 5. Receiver Control Command
     RFM_SPI_16(
@@ -69,7 +75,7 @@
         RFM_RX_CONTROL_BW_134 |
         RFM_RX_CONTROL_GAIN_0   |
         RFM_RX_CONTROL_RSSI_73
-     );
+    );
 
     // 6. Data Filter Command
     RFM_SPI_16(
@@ -77,13 +83,13 @@
         //RFM_DATA_FILTER_ML      |
         //RFM_DATA_FILTER_DQD(3)
         RFM_DATA_FILTER_ANALOG
-     );
+    );
 
     // 7. FIFO and Reset Mode Command
     RFM_SPI_16(
         RFM_FIFO_IT(8) |
         RFM_FIFO_DR
-     );
+    );
 
     // 8. Receiver FIFO Read
 
@@ -94,13 +100,13 @@
         RFM_AFC_EN              |
         RFM_AFC_OE              |
         RFM_AFC_FI
-     );
+    );
 
     // 10. TX Configuration Control Command
     RFM_SPI_16(
         RFM_TX_CONTROL_MOD_30 |
         RFM_TX_CONTROL_POW_0
-     );
+    );
 
     // 11. Transmitter Register Write Command
 
@@ -116,18 +122,18 @@
     //     );
 
     // 15. Status Read Command
-        //RFM_SPI_16(RFM_TX_ON());
-       RFM_SPI_16(RFM_RX_ON());
+    //RFM_SPI_16(RFM_TX_ON());
+    RFM_SPI_16(RFM_RX_ON());
 
 }
 
 ///////////////////////////////////////////////////////////////////////////////
 
-   
+
 
 /** write and read 16 bit to device
 */
-uint16_t rfm12b::rfm_spi16(uint16_t outval){
+uint16_t rfm12b::rfm_spi16(uint16_t outval) {
 
     uint16_t    readval;
     // Select the device by seting chip select low
@@ -138,7 +144,7 @@
     // Deselect the device
     cs->write(1);
     wait_ms(1);               // wait before going on
-    return(readval);   
+    return(readval);
 }
 
 
--- a/rfm12b.h	Wed Mar 02 20:46:57 2011 +0000
+++ b/rfm12b.h	Thu Apr 07 19:54:09 2011 +0000
@@ -3,14 +3,19 @@
 
 #include <mbed.h>
 
+/*!
+ * \file       rfm12b.h
+ * \brief      class for rfm2b in rawmode - only receive part implemented
+ * \author     Karl Zweimüller based on code from WED 6.9.2009
+ */
+
 typedef unsigned char Byte;    // used to be uint8_t : something a byte wide, whatever ....
 
 /** This Class handles a rfm12b transceiver
  * see http://www.hoperf.com/rf_fsk/rfm12b.htm
- * 
+ *
 */
-class rfm12b
-{
+class rfm12b {
 public:
     /** Create a rfm12b object
     *
@@ -21,15 +26,15 @@
     * @param rxdata  Data-Pin for received data. A DigitalIn of mbed
     */
     rfm12b(PinName mosi, PinName miso, PinName sclk, PinName nsel, PinName rxdata);
-    
+
     /** init the spi-interface
     */
     void init_spi();
-    
+
     /** initialize the device
     */
     void RFM_init(void);
-    
+
     /** write and read 16 bit
     */
     uint16_t rfm_spi16(uint16_t outval);
@@ -45,14 +50,29 @@
         m_pinRXData->rise(fptr);
     }
 
+    template<typename T>
+    /** attach an object member function to be called when the data-pin changes from 0->1 and from 1->0
+    *
+    * @param tptr pointer to object
+    * @param mprt pointer ro member function
+    *
+    */
+    void attachISR(T* tptr, void (T::*mptr)(void)) {
+        if ((mptr != NULL) && (tptr != NULL)) {
+            m_pinRXData->fall(tptr, mptr);
+            m_pinRXData->rise(tptr, mptr);
+        }
+    }
+
+
 
 private:
 
-  
+
     DigitalOut    *cs;          //chipselect
     InterruptIn   *m_pinRXData; //rx data pin
     SPI           *rfm12b_spi;  //spi-interface
-  
+
 
 };