186 lines
3.8 KiB
C++
186 lines
3.8 KiB
C++
#include "RF_Keys.h"
|
|
enum
|
|
{
|
|
RF_IDLE = 0,
|
|
RF_SETUP = 10,
|
|
RF_PREAMBLE = 20,
|
|
RF_TX_CODE = 30,
|
|
RF_TX_CODE_WAIT = 40,
|
|
RF_TX_DONE = 1000
|
|
};
|
|
|
|
uint16_t rfTxState = RF_IDLE;
|
|
uint8_t *rfKeyPtr;
|
|
uint8_t rfKeyCount;
|
|
uint8_t rfIdx;
|
|
uint32_t rfTime;
|
|
|
|
void initRF()
|
|
{
|
|
initCC1101();
|
|
}
|
|
|
|
void rfSendKey(uint8_t key, uint8_t channel)
|
|
{
|
|
Serial.print("Key - ");
|
|
Serial.print(key);
|
|
Serial.print(" Ch - ");
|
|
Serial.println(channel);
|
|
if (rfKey.key == RF_NO_KEY) // make sure there are no pending keys
|
|
{
|
|
rfKey.key = key;
|
|
rfKey.channel = channel;
|
|
}
|
|
}
|
|
|
|
/*******************************************************************************
|
|
|
|
*******************************************************************************/
|
|
void rfTask()
|
|
{
|
|
|
|
rfTxTask();
|
|
|
|
switch (rfState)
|
|
{
|
|
case 0:
|
|
if (rfKey.key != RF_NO_KEY)
|
|
rfState = 100;
|
|
break;
|
|
|
|
case 100: // send a key
|
|
if (rfTxState == RF_IDLE)
|
|
rfTxState = RF_SETUP;
|
|
rfState++;
|
|
break;
|
|
|
|
case 101:
|
|
if (rfTxState == RF_IDLE)
|
|
rfState = 0;
|
|
}
|
|
}
|
|
|
|
/********************************************************************************
|
|
This task is to simulate a replicated transmission from a DD2702H transmitter
|
|
|
|
The CC1100 will enter asynchronous transmission mode.
|
|
Then a preamble (0xAA) will be transmitted for approximately 145mS
|
|
The CC1100 will then be put into packet mode.
|
|
A keypacket sequence will be transmitted.
|
|
A down or up key will transmit 7 packets.
|
|
A stop or prog key will transmit 3 packets.
|
|
There is an 82mS delay between each packet.
|
|
|
|
When tranmission is complete, CC1101 will be put into idle mode.
|
|
|
|
|
|
*********************************************************************************/
|
|
void rfTxTask(void)
|
|
{
|
|
long x = 0;
|
|
byte b;
|
|
|
|
switch (rfTxState)
|
|
{
|
|
case RF_IDLE:
|
|
break;
|
|
|
|
case RF_SETUP:
|
|
switch (rfKey.key)
|
|
{
|
|
case RF_KEY_DN:
|
|
rfKeyPtr = &DnKey[0][0] + (rfKey.channel * 9 * 21);
|
|
// Serial.println("RF Down Key");
|
|
// Serial.print("Channel ");Serial.println(rfKey.channel);
|
|
// Serial.println("Dn Key ");Serial.println((long unsigned int)&DnKey[0][0],HEX);
|
|
// Serial.print("rfKeyPtr ");Serial.println((long unsigned int)rfKeyPtr,HEX);
|
|
rfKeyCount = 9;
|
|
break;
|
|
|
|
case RF_KEY_UP:
|
|
rfKeyPtr = &UpKey[0][0] + (rfKey.channel * 9 * 21);
|
|
// Serial.println("RF Up Key");
|
|
rfKeyCount = 9;
|
|
break;
|
|
|
|
case RF_KEY_STOP:
|
|
rfKeyPtr = &StopKey[0][0] + (rfKey.channel * 3 * 21);
|
|
// Serial.println("RF Stop Key");
|
|
rfKeyCount = 3;
|
|
break;
|
|
|
|
case RF_KEY_PROG:
|
|
rfKeyPtr = &ProgKey[0][0] + (rfKey.channel * 3 * 21);
|
|
// Serial.println("RF Prog Key");
|
|
rfKeyCount = 3;
|
|
break;
|
|
}
|
|
rfTxState = RF_PREAMBLE;
|
|
break;
|
|
|
|
case RF_PREAMBLE:
|
|
// async mode will be used to send a 140ms preamble
|
|
SendCCData(0x08, 0x30); // async mode
|
|
ccTxOn();
|
|
ccTx.write(0x2d);
|
|
ccTx.write(0xd4);
|
|
ccTx.write(0x2d);
|
|
ccTx.write(0xd4);
|
|
while (++x < 500)
|
|
{
|
|
ccTx.write(0xAA);
|
|
}
|
|
// switch to packet mode to send key codes.
|
|
// this will allow CC1100 to calculate the CRC and append to packet
|
|
SendCCData(0x08, 0x04); // packet mode, fixed length, crc enabled
|
|
rfIdx = 0;
|
|
rfTxState = RF_TX_CODE;
|
|
break;
|
|
|
|
case RF_TX_CODE:
|
|
SendCCCommand(CC_CMD_TX_FLUSH); // flush Tx FIFO
|
|
for (b = 0; b < 21; b++)
|
|
{
|
|
RFTXArray[b] = *rfKeyPtr++;
|
|
// Serial.print(RFTXArray[b],HEX);Serial.print(" ");
|
|
}
|
|
// Serial.println(" ");
|
|
SendCCDataBurst(CC_CMD_FIFO, RFTXArray, 21);
|
|
ccTxOn();
|
|
rfTime = millis();
|
|
while (GetCCData(CC_STATUS_MSTATE) != 1)
|
|
{
|
|
if (millis() - rfTime > 20)
|
|
{
|
|
// Serial.println("RF Timeout");
|
|
rfTxState = RF_IDLE;
|
|
break;
|
|
}
|
|
}
|
|
rfIdx++;
|
|
rfTime = millis();
|
|
rfTxState = RF_TX_CODE_WAIT;
|
|
break;
|
|
|
|
case RF_TX_CODE_WAIT:
|
|
if (rfIdx >= rfKeyCount)
|
|
{
|
|
rfTxState = RF_TX_DONE;
|
|
}
|
|
else
|
|
{
|
|
if ((millis() - rfTime) > 82)
|
|
{
|
|
rfTxState = RF_TX_CODE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case RF_TX_DONE:
|
|
rfKey.key = RF_NO_KEY;
|
|
rfKey.channel = 0;
|
|
rfTxState = RF_IDLE;
|
|
break;
|
|
}
|
|
}
|