EVOG2-Spiffs-Avery/RF.ino

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;
}
}