Library to read 433MHz codes with decoder HT6P20

Dependents:   Gateway_Cotosys Gateway_Cotosys_os5

Revision:
0:bcd4927f951a
Child:
1:adf26c4f20cd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RFDecoder.cpp	Sun Jun 02 19:56:03 2019 +0000
@@ -0,0 +1,123 @@
+/*
+   RFDecoder - Ported from the Lucas Maziero Arduino libary to decode RF controls based on chip HT6P20
+  Copyright (c) 2011 Miguel Maldonado.  All right reserved.
+  
+  Project home: https://github.com/lucasmaziero/RF_HT6P20
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+*/
+
+#include "RFDecoder.h"
+#include "mbed.h"
+#include <Pulse.h>
+
+
+/** Class constructor.
+ * The constructor assigns the specified pinout, attatches 
+ * an Interrupt to the receive pin. 
+ * @param tx Transmitter pin of the RF module.
+ * @param rx Receiver pin of the RF module.
+ */
+ 
+ RFDecoder::RFDecoder(PinName tx, PinName rx) : _tx(DigitalOut(tx)), _rx(PulseInOut(rx)){
+     RFDecoder::addressFull = NULL;     
+     
+     }
+ 
+unsigned long RFDecoder::getCode(){
+    return(addressFull);
+} 
+
+bool RFDecoder::available(){
+     static bool startbit=0;          //checks if start bit was identified
+     static int counter;            //received bits counter: 20 of Address + 4 of Data + 4 of EndCode (Anti-Code)
+     static unsigned long buffer;   //buffer for received data storage
+     
+     int dur0, dur1;                // pulses durations (auxiliary)
+        
+     if (!startbit) {               // Check the PILOT CODE until START BIT;
+     dur0 = _rx.read_low_us();
+/*    
+     if(dur0>50){
+         addressFull = dur0;
+         return true;      
+     }else{
+         return false;
+     }
+}
+*/
+     
+        //If time at "0" is between 5359 us (23 cycles of 233us) and 9959 us (23 cycles of 433 us).
+        if((dur0 > 5000) && (dur0 < 13000) && !startbit){
+            //calculate wave length - lambda
+            lambda_RX = (dur0 / 23);
+            
+            //Reset variables
+            dur0 = 0;
+            buffer = 0;
+            counter = 0;
+
+            startbit = true;    
+        }
+     }
+     
+     //If Start Bit is OK, then starts measure os how long the signal is level "1" and check is value is into acceptable range.
+     if (startbit && counter < 28){
+         ++counter;
+
+         dur1 = _rx.read_high_us();
+
+        if((dur1 > 0.5 * lambda_RX) && (dur1 < (1.5 * lambda_RX))){  //If pulse width at "1" is between "0.5 and 1.5 lambda", means that pulse is only one lambda, so the data is "1".     
+          buffer = (buffer << 1) + 1;   // add "1" on data buffer
+        }
+        else if((dur1 > 1.5 * lambda_RX) && (dur1 < (2.5 * lambda_RX))){  //If pulse width at "1" is between "1.5 and 2.5 lambda", means that pulse is two lambdas, so the data is "0".
+          buffer = (buffer << 1);       // add "0" on data buffer
+        }
+        else{
+          startbit = false; //Reset the loop
+        }
+      }
+      
+      //Check if all 28 bits were received (20 of Address + 4 of Data + 4 of Anti-Code)
+      if (counter==28) 
+      { 
+      
+        // Check if Anti-Code is OK (last 4 bits of buffer equal "0101")
+        if ((bitRead(buffer, 0) == 1) && (bitRead(buffer, 1) == 0) && (bitRead(buffer, 2) == 1) && (bitRead(buffer, 3) == 0)){     
+          counter = 0;
+          startbit = false;
+    
+          //Get ADDRESS COMPLETO from Buffer
+          addressFull = buffer;
+          
+          //If a valid data is received, return OK
+          return true;
+        }
+        else
+        {
+          //Reset the loop
+          startbit = false;
+        }
+    
+      }
+      
+      //If none valid data is received, return NULL and FALSE values 
+      addressFull = 0; 
+      return false;       
+}
+
+bool RFDecoder::bitRead( int N, int pos)
+   {                            // pos = 7 6 5 4 3 2 1 0
+       int b = N >> pos ;       // Shift bits
+       b = b & 1 ;              // get only the last bit
+       return b ;
+   }   
+     
\ No newline at end of file