Exemple #1
0
/**
 * 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;
}
Exemple #2
0
/**
 * 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();
}
Exemple #3
0
/**
 * 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;
}
Exemple #4
0
/**
 * 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;
}
Exemple #5
0
/**
 * 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();
}