/** * init * * Initialize panStamp board * * 'freq' New carrier frequency */ void PANSTAMP::init(byte freq) { int i; // Calibrate internal RC oscillator rtcCrystal = false; //rcOscCalibrate(); // Intialize registers for(i=0 ; i<regTableSize ; i++) regTable[i]->init(); // Setup CC1101 cc1101.init(freq); // Security disabled by default security = 0; delayMicroseconds(50); // Enter RX state cc1101.setRxState(); // Attach callback function for GDO0 (INT0) enableIRQ_GDO0(); // Default values nonce = 0; systemState = SYSTATE_RXON; }
/** * radioISR * * Radio interrupt routine */ void radioISR(void) { // Disable interrupt disableIRQ_GDO0(); if (panstamp.radio.rfState == RFSTATE_RX) { static CCPACKET ccPacket; bool eval = true; // Any packet waiting to be read? if (panstamp.radio.receiveData(&ccPacket) > 0) { // Is CRC OK? if (ccPacket.crc_ok) { if (panstamp.ccPacketReceived != NULL) panstamp.ccPacketReceived(&ccPacket); } } } // Enable interrupt enableIRQ_GDO0(); }
/** * init * * Initialize panStamp board */ void PANSTAMP::init() { int i; // Calibrate internal RC oscillator //rtcCrystal = rcOscCalibrate(); // Intialize registers for(i=0 ; i<regTableSize ; i++) regTable[i]->init(); // Setup CC1101 cc1101.init(); // Security disabled by default security = 0; #ifdef SWAP_EXTENDED_ADDRESS /* // Read extended device address from EEPROM swapAddress = EEPROM.read(EEPROM_DEVICE_ADDR); swapAddress <<= 8; swapAddress = EEPROM.read(EEPROM_DEVICE_ADDR + 1); */ #endif /* // Read periodic Tx interval from EEPROM txInterval[0] = EEPROM.read(EEPROM_TX_INTERVAL); txInterval[1] = EEPROM.read(EEPROM_TX_INTERVAL + 1); */ delayMicroseconds(50); // Enter RX state cc1101.setRxState(); // Attach callback function for GDO0 (INT0) enableIRQ_GDO0(); // Default values nonce = 0; systemState = SYSTATE_RXON; }
/** * init * * Initialize panStamp board * * @param freq Carrier frequency * @param mode Working mode (speed, ...) */ void PANSTAMP::init(uint8_t freq, uint8_t mode) { // Calibrate internal RC oscillator rcOscCalibrate(); // Setup CC1101 radio.init(freq, mode); delayMicroseconds(50); // Enter RX state radio.setRxState(); // Attach callback function for GDO0 (INT0) enableIRQ_GDO0(); // Default values state = RXON; }
/** * isrGDO0event * * Event on GDO0 pin (INT0) */ void isrGDO0event(void) { // Disable interrupt disableIRQ_GDO0(); if (panstamp.cc1101.rfState == RFSTATE_RX) { static CCPACKET ccPacket; static SWPACKET swPacket; REGISTER *reg; bool eval = true; if (panstamp.cc1101.receiveData(&ccPacket) > 0) { if (ccPacket.crc_ok) { swPacket = SWPACKET(ccPacket); #ifdef SWAP_EXTENDED_ADDRESS if (swPacket.addrType == SWAPADDR_EXTENDED) #else if (swPacket.addrType == SWAPADDR_SIMPLE) #endif { // Repeater enabled? if (panstamp.repeater != NULL) panstamp.repeater->packetHandler(&swPacket); // Smart encryption locally enabled? if (panstamp.security & 0x02) { // OK, then incoming packets must be encrypted too if (!(swPacket.security & 0x02)) eval = false; } } else eval = false; if (eval) { // Function switch(swPacket.function) { case SWAPFUNCT_CMD: // Command not addressed to us? if (swPacket.destAddr != panstamp.swapAddress) break; // Current version does not support data recording mode // so destination address and register address must be the same if (swPacket.destAddr != swPacket.regAddr) break; // Valid register? if ((reg = getRegister(swPacket.regId)) == NULL) break; // Anti-playback security enabled? if (panstamp.security & 0x01) { // Check received nonce if (panstamp.nonce != swPacket.nonce) { // Nonce missmatch. Transmit correct nonce. reg = getRegister(REGI_SECUNONCE); reg->sendSwapStatus(); break; } } // Filter incorrect data lengths if (swPacket.value.length == reg->length) reg->setData(swPacket.value.data); else reg->sendSwapStatus(); break; case SWAPFUNCT_QRY: // Only Product Code can be broadcasted if (swPacket.destAddr == SWAP_BCAST_ADDR) { if (swPacket.regId != REGI_PRODUCTCODE) break; } // Query not addressed to us? else if (swPacket.destAddr != panstamp.swapAddress) break; // Current version does not support data recording mode // so destination address and register address must be the same if (swPacket.destAddr != swPacket.regAddr) break; // Valid register? if ((reg = getRegister(swPacket.regId)) == NULL) break; reg->getData(); break; case SWAPFUNCT_STA: // User callback function declared? if (panstamp.statusReceived != NULL) panstamp.statusReceived(&swPacket); break; default: break; } } } } } // Enable interrupt enableIRQ_GDO0(); }