#define BUILDNR 0x07 // shown in version #define REVNR 0x33 // shown in version and startup string #define MIN_RAW_PULSES 20 // =8 bits. Minimal number of bits*2 that need to have been received before we spend CPU time on decoding the signal. #define RAWSIGNAL_SAMPLE_RATE 30 // Sample width / resolution in uSec for raw RF pulses. #define MIN_PULSE_LENGTH 25 // Pulses shorter than this value in uSec. will be seen as garbage and not taken as actual pulses. #define SIGNAL_TIMEOUT 7 // Timeout, after this time in mSec. the RF signal will be considered to have stopped. #define SIGNAL_REPEAT_TIME 500 // Time in mSec. in which the same RF signal should not be accepted again. Filters out retransmits. #define BAUD 57600 // Baudrate for serial communication. #define TRANSMITTER_STABLE_DELAY 500 // delay to let the transmitter become stable (Note: Aurel RTX MID needs 500µS/0,5ms). #define RAW_BUFFER_SIZE 512 // Maximum number of pulses that is received in one go. #define PLUGIN_MAX 55 // Maximum number of Receive plugins #define PLUGIN_TX_MAX 26 // Maximum number of Transmit plugins #define SCAN_HIGH_TIME 50 // tijdsinterval in ms. voor achtergrondtaken snelle verwerking #define FOCUS_TIME 50 // Duration in mSec. that, after receiving serial data from USB only the serial port is checked. #define INPUT_COMMAND_SIZE 60 // Maximum number of characters that a command via serial can be. #define PRINT_BUFFER_SIZE 60 // Maximum number of characters that a command should print in one go via the print buffer. // to include Config_xx.c files: #define stringify(x) #x #define CONFIGFILE2(a, b) stringify(a/Config/b) #define CONFIGFILE(a, b) CONFIGFILE2(a, b) #define CONFIG_FILE Config_01.c #include CONFIGFILE(SKETCH_PATH,CONFIG_FILE) #define VALUE_PAIR 44 #define VALUE_ALLOFF 55 #define VALUE_OFF 74 #define VALUE_ON 75 #define VALUE_DIM 76 #define VALUE_BRIGHT 77 #define VALUE_UP 78 #define VALUE_DOWN 79 #define VALUE_STOP 80 #define VALUE_CONFIRM 81 #define VALUE_LIMIT 82 #define VALUE_ALLON 141 // PIN Definition #define PIN_BSF_0 22 // Board Specific Function lijn-0 #define PIN_BSF_1 23 // Board Specific Function lijn-1 #define PIN_BSF_2 24 // Board Specific Function lijn-2 #define PIN_BSF_3 25 // Board Specific Function lijn-3 #define PIN_RF_TX_VCC 15 // +5 volt / Vcc power to the transmitter on this pin #define PIN_RF_TX_DATA 14 // Data to the 433Mhz transmitter on this pin #define PIN_RF_RX_VCC 16 // Power to the receiver on this pin #define PIN_RF_RX_DATA 19 // On this input, the 433Mhz-RF signal is received. LOW when no signal. //**************************************************************************************************************************************** byte dummy=1; // get the linker going. Bug in Arduino. (old versions?) void(*Reboot)(void)=0; // reset function on adres 0. byte PKSequenceNumber=0; // 1 byte packet counter boolean RFDebug=false; // debug RF signals with plugin 001 boolean RFUDebug=false; // debug RF signals with plugin 254 boolean QRFDebug=false; // debug RF signals with plugin 254 but no multiplication uint8_t RFbit,RFport; // for processing RF signals. char pbuffer[PRINT_BUFFER_SIZE]; // Buffer for printing data char InputBuffer_Serial[INPUT_COMMAND_SIZE]; // Buffer for Seriel data // Van alle devices die worden mee gecompileerd, worden in een tabel de adressen opgeslagen zodat hier naar toe gesprongen kan worden void PluginInit(void); void PluginTXInit(void); boolean (*Plugin_ptr[PLUGIN_MAX])(byte, char*); // Receive plugins byte Plugin_id[PLUGIN_MAX]; boolean (*PluginTX_ptr[PLUGIN_TX_MAX])(byte, char*); // Transmit plugins byte PluginTX_id[PLUGIN_TX_MAX]; void PrintHex8(uint8_t *data, uint8_t length); // prototype void PrintHexByte(uint8_t data); // prototype byte reverseBits(byte data); // prototype void RFLinkHW( void ); // prototype struct RawSignalStruct // Raw signal variabelen places in a struct { int Number; // Number of pulses, times two as every pulse has a mark and a space. byte Repeats; // Number of re-transmits on transmit actions. byte Delay; // Delay in ms. after transmit of a single RF pulse packet byte Multiply; // Pulses[] * Multiply is the real pulse time in microseconds unsigned long Time; // Timestamp indicating when the signal was received (millis()) byte Pulses[RAW_BUFFER_SIZE+2]; // Table with the measured pulses in microseconds divided by RawSignal.Multiply. (halves RAM usage) // First pulse is located in element 1. Element 0 is used for special purposes, like signalling the use of a specific plugin } RawSignal={0,0,0,0,0,0L}; // =============================================================================== unsigned long RepeatingTimer=0L; unsigned long SignalCRC=0L; // holds the bitstream value for some plugins to identify RF repeats unsigned long SignalHash=0L; // holds the processed plugin number unsigned long SignalHashPrevious=0L; // holds the last processed plugin number void setup() { Serial.begin(BAUD); // Initialise the serial port pinMode(PIN_RF_RX_DATA, INPUT); // Initialise in/output ports pinMode(PIN_RF_TX_DATA, OUTPUT); // Initialise in/output ports pinMode(PIN_RF_TX_VCC, OUTPUT); // Initialise in/output ports pinMode(PIN_RF_RX_VCC, OUTPUT); // Initialise in/output ports digitalWrite(PIN_RF_RX_VCC,HIGH); // turn VCC to RF receiver ON digitalWrite(PIN_RF_RX_DATA,INPUT_PULLUP); // pull-up resister on (to prevent garbage) pinMode(PIN_BSF_0,OUTPUT); // rflink board switch signal digitalWrite(PIN_BSF_0,HIGH); // rflink board switch signal RFbit=digitalPinToBitMask(PIN_RF_RX_DATA); RFport=digitalPinToPort(PIN_RF_RX_DATA); Serial.print(F("20;00;Nodo RadioFrequencyLink - RFLink Gateway V1.1 - ")); sprintf(InputBuffer_Serial,"R%02x;",REVNR); Serial.println(InputBuffer_Serial); PKSequenceNumber++; PluginInit(); PluginTXInit(); } void loop() { byte SerialInByte=0; // incoming character value int SerialInByteCounter=0; // number of bytes counter byte ValidCommand=0; unsigned long FocusTimer=0L; // Timer to keep focus on the task during communication InputBuffer_Serial[0]=0; // erase serial buffer string while(true) { ScanEvent(); // Scan for RF events // SERIAL: *************** kijk of er data klaar staat op de seriele poort ********************** if(Serial.available()) { FocusTimer=millis()+FOCUS_TIME; while(FocusTimer>millis()) { // standby if(Serial.available()) { SerialInByte=Serial.read(); if(isprint(SerialInByte)) if(SerialInByteCounter<(INPUT_COMMAND_SIZE-1)) InputBuffer_Serial[SerialInByteCounter++]=SerialInByte; if(SerialInByte=='\n') { // new line character InputBuffer_Serial[SerialInByteCounter]=0; // serieel data is complete //Serial.print("20;incoming;"); //Serial.println(InputBuffer_Serial); if (strlen(InputBuffer_Serial) > 7){ // need to see minimal 8 characters on the serial port // 10;....;..;ON; if (strncmp (InputBuffer_Serial,"10;",3) == 0) { // Command from Master to RFLink // ------------------------------------------------------- // Handle Device Management Commands // ------------------------------------------------------- if (strcasecmp(InputBuffer_Serial+3,"PING;")==0) { sprintf(InputBuffer_Serial,"20;%02X;PONG;",PKSequenceNumber++); Serial.println(InputBuffer_Serial); } else if (strcasecmp(InputBuffer_Serial+3,"REBOOT;")==0) { strcpy(InputBuffer_Serial,"reboot"); Reboot(); } else if (strncasecmp(InputBuffer_Serial+3,"RFDEBUG=O",9) == 0) { if (InputBuffer_Serial[12] == 'N' || InputBuffer_Serial[12] == 'n' ) { RFDebug=true; // full debug on RFUDebug=false; // undecoded debug off QRFDebug=false; // undecoded debug off sprintf(InputBuffer_Serial,"20;%02X;RFDEBUG=ON;",PKSequenceNumber++); } else { RFDebug=false; // full debug off sprintf(InputBuffer_Serial,"20;%02X;RFDEBUG=OFF;",PKSequenceNumber++); } Serial.println(InputBuffer_Serial); } else if (strncasecmp(InputBuffer_Serial+3,"RFUDEBUG=O",10) == 0) { if (InputBuffer_Serial[13] == 'N' || InputBuffer_Serial[13] == 'n') { RFUDebug=true; // undecoded debug on QRFDebug=false; // undecoded debug off RFDebug=false; // full debug off sprintf(InputBuffer_Serial,"20;%02X;RFUDEBUG=ON;",PKSequenceNumber++); } else { RFUDebug=false; // undecoded debug off sprintf(InputBuffer_Serial,"20;%02X;RFUDEBUG=OFF;",PKSequenceNumber++); } Serial.println(InputBuffer_Serial); } else if (strncasecmp(InputBuffer_Serial+3,"QRFDEBUG=O",10) == 0) { if (InputBuffer_Serial[13] == 'N' || InputBuffer_Serial[13] == 'n') { QRFDebug=true; // undecoded debug on RFUDebug=false; // undecoded debug off RFDebug=false; // full debug off sprintf(InputBuffer_Serial,"20;%02X;QRFDEBUG=ON;",PKSequenceNumber++); } else { QRFDebug=false; // undecoded debug off sprintf(InputBuffer_Serial,"20;%02X;QRFDEBUG=OFF;",PKSequenceNumber++); } Serial.println(InputBuffer_Serial); } else if (strncasecmp(InputBuffer_Serial+3,"VERSION",7) == 0) { sprintf(InputBuffer_Serial,"20;%02X;VER=1.1;REV=%02x;BUILD=%02x;",PKSequenceNumber++,REVNR, BUILDNR); Serial.println(InputBuffer_Serial); } else { // ------------------------------------------------------- // Handle Generic Commands / Translate protocol data into Nodo text commands // ------------------------------------------------------- // check plugins if (InputBuffer_Serial[SerialInByteCounter-1]==';') InputBuffer_Serial[SerialInByteCounter-1]=0; // remove last ";" char if(PluginTXCall(0, InputBuffer_Serial)) { ValidCommand=1; } else { // Answer that an invalid command was received? ValidCommand=2; } } } } // if > 7 if (ValidCommand != 0) { if (ValidCommand==1) { sprintf(InputBuffer_Serial,"20;%02X;OK;",PKSequenceNumber++); Serial.println( InputBuffer_Serial ); } else { sprintf(InputBuffer_Serial, "20;%02X;CMD UNKNOWN;", PKSequenceNumber++); // Node and packet number Serial.println( InputBuffer_Serial ); } } SerialInByteCounter=0; InputBuffer_Serial[0]=0; // serial data has been processed. ValidCommand=0; FocusTimer=millis()+FOCUS_TIME; }// if(SerialInByte }// if(Serial.available()) }// while }// if(Serial.available()) }// while } // void /*********************************************************************************************/