00001
00061
00062
#include <chipcon/reg1010.h>
00063
00064
00065
00066
00067
#include <chipcon/partCboard.h>
00068
00069
#include <chipcon/hal.h>
00070
#include <chipcon/sdccutils.h>
00071
#include "../acltypes.h"
00072
#include <chipcon/partCStack.h>
00073
00074 data byte i;
00075
00078
00079
00080
00085 #define DEBUG_USE_UART1_FOR_DUMPING
00086
00091
00092
00097 #define DEBUG_DUMP_RF_STATE
00098
00103
00104
00109
00110
00112
00113
00117
00118
00119
00120
00125
#ifdef DEBUG_ARBITRATION_TEST_PATTERN
00126
#define DEBUG_ARBITRATION_TEST_ACTIVE
00127
#endif
00128
#ifdef DEBUG_ARBITRATION_TEST_COUNT
00129
#define DEBUG_ARBITRATION_TEST_ACTIVE
00130
#endif
00131
#ifdef DEBUG_ARBITRATION_TEST_0
00132
#define DEBUG_ARBITRATION_TEST_ACTIVE
00133
#endif
00134
00136
00139
00145 #define RF_STATE_MASTER BIN(00000001)
00146
00151 #define RF_STATE_ALONE BIN(00000010)
00152
00157 #define RF_STATE_IN_SYNC BIN(00000100)
00158
00164 #define RF_STATE_TRAFFIC_GROUP BIN(00001000)
00165
00170 #define RF_STATE_LONG_SEARCH_FOR_MASTER BIN(00010000)
00171
00178 #define RF_STATE_MASTER_RIVAL_TEST BIN(00100000)
00179
00181 #define RF_STATE_RUNNING BIN(10000000)
00182
00202 data
volatile byte
rfState= 0;
00203
00204
#ifdef DEBUG_USE_UART
00205
#ifdef DEBUG_DUMP_RF_STATE
00206
data
volatile byte rfStateOld= 0xFF;
00207
#endif
00208
#endif
00209
00214 #define RF_SYNC_MAX_SLOT_COUNT 10
00215
00220
00221
00226 #define RF_ALONE_TEST_FAILED_THRESHOLD 167
00227
00239 #define RF_ALONE_DEEP_SLEEP
00240
00242 #define RF_PREAMBLE_LENGTH_TX 20
00243
00245 #define RF_PREAMBLE_LENGTH_RX 20
00246
00254 #define RF_MAX_SYNC_JITTER 5769ul
00255
00260 #define RF_SLOT_LENGTH_IN_US 36865ul
00261
00267 #define RF_MASTER_SEARCH_SLOTS_STARTUP 50
00268
00272 #define RF_MASTER_SEARCH_SLOTS_AFTER_ALONE 167
00273
00281 #define RF_MAX_FAILED_SYNC_COUNT 6
00282
00287 #define RF_MASTER_RIVAL_TEST_SYNC_COUNT 30
00288
00297 #define RF_SYNC_ADDITIONAL_OFFSET 0x89B3
00298
00312 #define RF_ARBITRATION_RSSI_THRESHOLD 0x64
00313
00321 #define RF_ALONE_TEST_RSSI_THRESHOLD 0xC0
00322
00328 #define RF_RENDEZVOUS_SYNC_START_HI 0x7C
00329
#define RF_RENDEZVOUS_SYNC_START_LO 0xC8
00330
00337 #define RF_RENDEZVOUS_DATA_PACKET_START_HI 0x93
00338
#define RF_RENDEZVOUS_DATA_PACKET_START_LO 0x12
00339
00345 #define RF_RENDEZVOUS_ARBITRATION_START_HI 0x71
00346
#define RF_RENDEZVOUS_ARBITRATION_START_LO 0x88
00347
00357 #define RF_ARBITRATION_TIMER_TICS_OTHER_PERIODS 0x390
00358
00359
00360
00364 #define RF_BUFFER_SIZE 64
00365
00372
00373
00378 #define RF_RENDEZVOUS_TRAFFIC_INDICATION_HI 0x92
00379
#define RF_RENDEZVOUS_TRAFFIC_INDICATION_LO 0x60
00380
00385 #define RF_RENDEZVOUS_ALONE_TEST_HI 0x8C
00386
#define RF_RENDEZVOUS_ALONE_TEST_LO 0xBA
00387
00389
static byte rfSlotCount= 0;
00390
00392
static byte rfSyncCount= 0;
00393
00395
static byte rfFailedSyncCount= 0;
00396
00401 data byte
rfScramblerReg=
BIN(01101100);
00402
00404 data
unsigned long randomNumberReg;
00405
00411 unsigned short rfSlotsWithoutSignalReceived= 0;
00412
00418 data
unsigned short tEndAvg= 0;
00420
00421
00423 xdata TIMER_DATA
periodDataSlot;
00424 xdata TIMER_DATA periodDataSyncByteReceiveTimeout;
00425
00427 xdata
signed short moduloTimer0;
00428
00429
#ifdef DEBUG_USE_UART
00430
#ifdef DEBUG_DUMP_RSSI_SAMPLES
00431
00432 xdata byte
rssiSamples[16];
00434
unsigned short arbitrationGood= 0;
00436
unsigned short arbitrationBad= 0;
00437
#endif
00438
#endif
00439
00453 RF_RXTXPAIR_SETTINGS code
RF_SETTINGS = {
00454 0xA0, 0x2F, 0x52,
00455 0x76, 0x00, 0x00,
00456 0x58, 0x7A, 0x8D,
00457 0x01, 0xAB,
00458 0x40,
00459 0x30,
00460 0x6C,
00461 0xF3,
00462 0x32,
00463 0x0F,
00464 0x00,
00465 0x00,
00466 };
00468 xdata RF_RXTXPAIR_CALDATA
RF_CALDATA;
00469
00480 xdata byte
rfFieldStrength;
00481
00482
#ifdef RF_USE_ALONE_DETECTION
00483
#ifndef RF_ALONE_DEEP_SLEEP
00484
00490 xdata
unsigned short rfSlotsInAloneModeLeft;
00491
#endif
00492
#endif
00493
00494
00495
00498
00499 #define LL_PROTOCOL_VERSION 4
00500
#define LL_HEADER_SIZE 12
00501
#define LL_PAYLOAD_SIZE 64
00502
#define LL_TAIL_SIZE 2
00503
#define LL_FRAME_MAX_SIZE (LL_HEADER_SIZE+LL_PAYLOAD_SIZE+LL_TAIL_SIZE)
00504
00505 #define LL_CRC16_POLY 0x1021
00506
00508 #define LL_CRC16_INIT 0xFFFF
00509
00511 #define LL_CRC_OK 0
00512
00514 xdata byte
LL_sequence_no;
00515
00516 byte LL_slots_left;
00517
00519 #define LL_STATE_SEND_SUCCESS BIN(00000001)
00520
00521 #define LL_STATE_CTRL_MESSAGE_INSERTED BIN(00000010)
00522
00526 #define LL_STATE_NEED_TO_SEND BIN(00000100)
00527
00528 #define LL_STATE_RECEIVE_BUFFER_LOCKED BIN(00001000)
00529
00530 #define LL_STATE_NEW_DATA BIN(00010000)
00531
00532 #define LL_STATE_PACKET_JUST_SENT BIN(00100000)
00533
00534 #define LL_STATE_PACKET_JUST_RECEIVED BIN(01000000)
00535
00536 #define LL_STATE_RUNNING BIN(10000000)
00537
00557 data
volatile byte
llState= 0;
00558 data
static byte llStateOld= 0xFF;
00559
00560 code
nodeAddrType llEpromAddress= {10, 1, 0, 1, 10, 1, 2, 0};
00562
00565
00567 #define ACL_SUBSCRIPTIONLIST_LENGTH 8
00568
00570 #define ACL_CONTROL_MESSAGES_TIMEOUT 30
00571
00573 #define ACL_TYPE_ACM_H ACL_TYPE_ACM_HI
00574
00575 #define ACL_TYPE_ACM_L ACL_TYPE_ACM_LO
00576
00577
00578 xdata byte ACL_subscriptions[
ACL_SUBSCRIPTIONLIST_LENGTH][2];
00579 xdata
boolean ACL_send_buffer_locked;
00580 xdata
boolean ACL_subscribe_all;
00581 xdata
boolean ACL_ACM_answers;
00582 xdata byte ACL_write_position;
00583
00584 xdata
boolean ACL_ignore_control_messages;
00585 xdata
boolean ACL_pass_control_messages;
00587
00593
00594
00595 xdata byte
LL_header_received[LL_HEADER_SIZE];
00597 xdata byte
LL_payload_received[LL_PAYLOAD_SIZE];
00599 xdata byte
LL_payload_received_length;
00601 xdata byte
LL_tail_received[LL_TAIL_SIZE];
00603
00610
00611
00612 volatile xdata byte
LL_header_receivebuffer[LL_HEADER_SIZE];
00614 volatile xdata byte
LL_payload_receivebuffer[LL_PAYLOAD_SIZE];
00616 volatile xdata byte
LL_payload_receivebuffer_length;
00618 volatile xdata byte
LL_tail_receivebuffer[LL_TAIL_SIZE];
00620
00627
00628
00629 xdata byte
LL_payload_send[LL_PAYLOAD_SIZE];
00631 xdata byte
LL_payload_send_length;
00633
00640
00641
00642 xdata byte
LL_header_sendbuffer[LL_HEADER_SIZE];
00644 xdata byte
LL_payload_sendbuffer[LL_PAYLOAD_SIZE];
00646 xdata byte
LL_payload_sendbuffer_length;
00648 xdata byte
LL_tail_sendbuffer[LL_TAIL_SIZE];
00650
00653
00654 xdata
unsigned long statsRfSlotsInSync;
00655
00657 xdata
unsigned long statsRfSlotsNeedToSend;
00659 xdata
unsigned long statsRfArbitrationWon;
00660
00661
00662
00664
00665
00667
00669
00670
00672 xdata
unsigned long statsRfDataPacketsReceivedNotNeedingToSend;
00674
00677
#ifdef DEBUG_USE_UART
00678
#ifdef DEBUG_DUMP_RF_STATE
00679
00682
void DebugDumpRfState() {
00683
if (
rfState != rfStateOld ||
llState != llStateOld) {
00684
putchar((
rfState &
RF_STATE_RUNNING) ?
'R' :
'S');
00685
putchar(
'-');
00686
putchar((
rfState &
RF_STATE_MASTER_RIVAL_TEST) ?
'R' :
'-');
00687
putchar((
rfState &
RF_STATE_LONG_SEARCH_FOR_MASTER) ?
'L' :
'-');
00688
putchar((
rfState &
RF_STATE_TRAFFIC_GROUP) ?
'T' :
'-');
00689
putchar((
rfState &
RF_STATE_IN_SYNC) ?
'Y' :
'-');
00690
putchar((
rfState &
RF_STATE_ALONE) ?
'A' :
'-');
00691
putchar((
rfState &
RF_STATE_MASTER) ?
'M' :
'S');
00692 DEBUG_SPACE;
00693 rfStateOld=
rfState;
00694
putchar((
llState &
LL_STATE_RUNNING) ?
'R' :
'-');
00695
putchar((
llState &
LL_STATE_PACKET_JUST_RECEIVED) ?
'J' :
'-');
00696
putchar((
llState &
LL_STATE_PACKET_JUST_SENT) ?
'J' :
'-');
00697
putchar((
llState &
LL_STATE_NEW_DATA) ?
'N' :
'-');
00698
putchar((
llState &
LL_STATE_RECEIVE_BUFFER_LOCKED) ?
'L' :
'-');
00699
putchar((
llState &
LL_STATE_NEED_TO_SEND) ?
'S' :
'-');
00700
putchar((
llState &
LL_STATE_CTRL_MESSAGE_INSERTED) ?
'C' :
'-');
00701
putchar((
llState &
LL_STATE_SEND_SUCCESS) ?
'S' :
'-');
00702 DEBUG_NEWLINE;
00703 llStateOld=
llState;
00704 }
00705 }
00706
#endif
00707
#endif
00708
00713
#ifdef DEBUG_USE_UART
00714
void DebugDumpReceivedAclPacket() {
00715
int i, dataEnd;
00716
00717
ACLLockReceiveBuffer();
00718
00719
00720
putchar(
'A');
00721
putchar(
':');
00722 sendByteToUart(LL_header_received[3+7]);
00723 DEBUG_SPACE;
00724
00725
for (i=0; i <
LL_payload_received_length;) {
00726 sendByteToUart(LL_payload_received[i++]);
00727 sendByteToUart(LL_payload_received[i++]);
00728 dataEnd= i +
LL_payload_received[i++];
00729
putchar(
':');
00730
while (i < dataEnd && i <
LL_payload_received_length)
00731 sendByteToUart(LL_payload_received[i++]);
00732 DEBUG_SPACE;
00733 }
00734 DEBUG_NEWLINE;
00735 }
00736
00737
#endif
00738
00743 void putchar(
char c) {
00744
#ifdef DEBUG_USE_UART
00745
#ifdef DEBUG_USE_UART1_FOR_DUMPING
00746
UART1_WAIT_AND_SEND(c);
00747
#else
00748
UART0_WAIT_AND_SEND(c);
00749
#endif
00750
#endif
00751
}
00752
00756 void DebugBuildTestPacketACL() {
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779 }
00780
00781
00782
#ifdef DEBUG_VERIFY_SCRAMBLING
00783
bool DebugScrambleAndDescrambleTest() {
00784 byte b, j;
00785 byte scrReg;
00786
00787
00788 j=0;
00789
00790
do {
00791 b= j;
00792
00793
00794
00795 scrReg=
rfScramblerReg;
00796 b=
RFScramble(j);
00797
00798
00799
rfScramblerReg= scrReg;
00800 b=
RFDescramble(b);
00801
00802
if (b != j) {
00803
00804
return FALSE;
00805 }
00806
00807
rfScramblerReg= scrReg;
00808 }
while (++j);
00809
00810
return TRUE;
00811 }
00812
#endif
00813
00814
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
#ifdef DEBUG_USE_UART
00832
#ifdef DEBUG_DUMP_RF_STATISTICS
00833
00837
void DebugResetStats() {
00838
statsRfSlotsInSync= 0;
00839
00840
statsRfSlotsNeedToSend= 0;
00841
statsRfArbitrationWon= 0;
00842
00843
statsRfDataPacketsReceivedNotNeedingToSend= 0;
00844 }
00845
00849
void DebugDumpStats() {
00850
00851
00852 sendUlongToUart(statsRfSlotsNeedToSend);
00853
putchar(
':');
00854 sendUlongToUart(statsRfArbitrationWon);
00855
putchar(
':');
00856 sendUlongToUart(statsRfDataPacketsReceivedNotNeedingToSend);
00857 DEBUG_NEWLINE;
00858 }
00859
#endif
00860
#endif
00861
00862
00863
00869
00870 void ParticleInit() {
00871
#ifdef DEBUG_USE_UART
00872
byte i;
00873
#endif
00874
00875
00876
00877
00878
00879 WDT= 0x13;
00880 WDT= 0x13;
00881
00882
00883 MEM_NO_WAIT_STATES();
00884 FLASH_SET_POWER_MODE(FLASH_STANDBY_BETWEEN_READS);
00885
00886
00887 RLED_OE(TRUE);
00888 YLED_OE(TRUE);
00889 GLED_OE(TRUE);
00890 BLED_OE(TRUE);
00891 RLED= YLED= GLED= BLED= LED_OFF;
00892
00893 TIMER0_RUN(FALSE);
00894
00895
00896
00897
RFInitRandom();
00898
00899
#ifdef DEBUG_VERIFY_SCRAMBLING
00900
00901
if (!DebugScrambleAndDescrambleTest()) {
00902 RLED= LED_ON;
00903
while (1);
00904 }
00905
#endif
00906
00907
#ifdef DEBUG_USE_UART
00908
#ifdef DEBUG_DUMP_RSSI_SAMPLES
00909
for (i=0; i<3*8; i++) {
00910
rssiSamples[i]= 0;
00911 }
00912
#endif
00913
#endif
00914
00915
#ifdef DEBUG_USE_UART
00916
00917
#ifdef DEBUG_USE_UART1_FOR_DUMPING
00918
UART1_SETUP(57600, CC1010EB_CLKFREQ, UART_NO_PARITY | UART_TX_ONLY | UART_POLLED);
00919
#else
00920
UART0_SETUP(57600, CC1010EB_CLKFREQ, UART_NO_PARITY | UART_TX_ONLY | UART_POLLED);
00921
#endif
00922
00923 DEBUG_CLEAR_SCREEN;
00924 sendStringToUart(
"Welcome to the CC1010 Particle Sensor Node!\r\nOn this console you will see debug information. Have Fun!\r\n\r\nSync method: master slave\r\n\r\nRandom numbers:\r\n");
00925
00926
for (i=0; i<10; i++) {
00927 sendByteToUart(
RF_NEW_RANDOM_BYTE());
00928 DEBUG_SPACE;
00929 }
00930 DEBUG_NEWLINE;
00931
#endif
00932
00933
00934 X32_INPUT_SOURCE(X32_USING_CRYSTAL);
00935 X32_ENABLE(TRUE);
00936 }
00937
00938 byte AppSelfTest(
char* result) {
00939
int i;
00940
00941
for (i=0; i<10; i++) {
00942 result[i]=
RF_NEW_RANDOM_BYTE();
00943 }
00944
00945
return TRUE;
00946 }
00948
00951
00953 void RFInit() {
00954 ulong tmp;
00955
00956
00957
00958
00959
00960 halCalcTimerPeriod(
RF_SLOT_LENGTH_IN_US, CC1010EB_CLKFREQ, &
periodDataSlot);
00961 halCalcTimerPeriod(
RF_MAX_SYNC_JITTER, CC1010EB_CLKFREQ, &periodDataSyncByteReceiveTimeout);
00962
00963
00964 TIMER0_RUN(FALSE);
00965 tmp= halConfigTimer01(TIMER0|TIMER01_INT_TIMER,
RF_SLOT_LENGTH_IN_US, CC1010EB_CLKFREQ, &
moduloTimer0);
00966
#ifdef DEBUG_USE_UART
00967
sendStringToUart(
"\r\nTimer start val:\r\n");
00968 sendUshortToUart(
moduloTimer0);
00969 DEBUG_NEWLINE;
00970
#endif
00971
00972
00973 INT_GLOBAL_ENABLE(INT_ON);
00974 INT_ENABLE(INUM_TIMER0, INT_ON);
00975 INT_ENABLE(INUM_TIMER2, INT_OFF);
00976 PA_POW= 0;
00977
00978
00979
rfFieldStrength=
RF_SETTINGS.pa_pow;
00980
00981
00982 halWait(200, CC1010EB_CLKFREQ);
00983 halRFCalib(&
RF_SETTINGS, &
RF_CALDATA);
00984
00985
00986
00987 halRFSetRxTxOff(RF_RX, &
RF_SETTINGS, &
RF_CALDATA);
00988 halWait(200, CC1010EB_CLKFREQ);
00989 halRFSetRxTxOff(RF_TX, &
RF_SETTINGS, &
RF_CALDATA);
00990 halWait(200, CC1010EB_CLKFREQ);
00991 halRFSetRxTxOff(RF_OFF, &
RF_SETTINGS, &
RF_CALDATA);
00992 halWait(200, CC1010EB_CLKFREQ);
00993
00994
00995 halRFReadRSSIlevel(RSSI_MODE_INIT);
00996 ADC_POWER(FALSE);
00997
00998 }
00999
01001 void RFStart() {
01002 PA_POW= 0;
01003
01004
01005
rfState=
RF_STATE_RUNNING |
RF_STATE_LONG_SEARCH_FOR_MASTER;
01006
#ifndef RF_USE_TRAFFIC_INDICATION
01007
01008
01009
rfState|=
RF_STATE_TRAFFIC_GROUP;
01010
#endif
01011
01012
#ifdef RF_USE_ALONE_DETECTION
01013
rfSlotsWithoutSignalReceived= 0;
01014
#endif
01015
01016
01017
#ifdef DEBUG_USE_UART
01018
#ifdef DEBUG_DUMP_RF_STATE
01019
DebugDumpRfState();
01020
#endif
01021
#endif
01022
01023
01024 INT_SETFLAG(INUM_TIMER0, INT_CLR);
01025 TIMER0_RUN(TRUE);
01026 }
01027
01029 void RFStop() {
01030
01031
rfState= 0;
01032
01033 TIMER0_RUN(FALSE);
01034
01035
RF_SET_MODE_SLEEP;
01036
01037
01038 }
01039
01044 void RFSetModeTransmit() {
01045 code byte *rfSettingsPtr= (code byte *)&
RF_SETTINGS;
01046
unsigned short i;
01047
01048 PA_POW= 0;
01049
01050
01051 PLL=rfSettingsPtr[12];
01052 RFMAIN=0xF0;
01053 TEST5=0x10 |
RF_CALDATA.vco_ao_tx;
01054 TEST6=0x3B;
01055 CURRENT=rfSettingsPtr[14];
01056
01057
01058
01059
01060
for(i=LOCK_MONITOR_DELAY; i>0; i--);
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
for(i=LOCK_TIMEOUT; !(LOCK&0x01) && (i>0); i--);
01076 PA_POW=
rfFieldStrength;
01077 }
01078
01083 void RFSetModeReceive() {
01084 code byte *rfSettingsPtr= (code byte *)&
RF_SETTINGS;
01085
unsigned short i;
01086
01087
01088 PLL=rfSettingsPtr[11];
01089 RFMAIN=0x30;
01090 TEST5=0x10 |
RF_CALDATA.vco_ao_rx;
01091 TEST6=0x20 |
RF_CALDATA.chp_co_rx;
01092 CURRENT=rfSettingsPtr[13];
01093
01094
01095
01096
01097
01098
01099
for(i=LOCK_MONITOR_DELAY; i>0; i--);
01100
01101
01102
for(i=LOCK_TIMEOUT; !(LOCK&0x01) && (i>0); i--);
01103 }
01104
01106 void RFInitRandom() {
01107 byte a;
01108
01109
randomNumberReg= 0;
01110
do {
01111 halRandomNumberGen(&a, 1);
01112 }
while (
bit_ones(a) < 2 ||
bit_ones(a) > 6);
01113
randomNumberReg= (ulong)a << 24;
01114
do {
01115 halRandomNumberGen(&a, 1);
01116 }
while (
bit_ones(a) < 2 ||
bit_ones(a) > 6);
01117
randomNumberReg|= (ulong)a << 16;
01118
do {
01119 halRandomNumberGen(&a, 1);
01120 }
while (
bit_ones(a) < 2 ||
bit_ones(a) > 6);
01121
randomNumberReg|= (ulong)a << 8;
01122
do {
01123 halRandomNumberGen(&a, 1);
01124 }
while (
bit_ones(a) < 2 ||
bit_ones(a) > 6);
01125
randomNumberReg|= (ulong)a;
01126
01127
for (a=0; a<128; a++)
01128
RF_NEW_RANDOM_BYTE();
01129 }
01130
01136 byte
RFDescramble(byte b) {
01137 byte i, scrReg;
01138
01139 scrReg=
rfScramblerReg;
01140 RF_DESCRAMBLE(b, scrReg, i);
01141
rfScramblerReg= scrReg;
01142
return b;
01143 }
01144
01173 unsigned short RFReceivePacket(xdata TIMER_DATA *timeOutPeriodData,
bool onlyDataPackets) {
01174
bool syncByteReceived, aclMatch;
01175 byte j, tHi, tLo, a, b, length, sync;
01176
unsigned short crc;
01177
01178
01179
RFSetModeReceive();
01180
01181
01182 RFCON|=0x01;
01183 RF_SET_PREAMBLE_COUNT(
RF_PREAMBLE_LENGTH_RX);
01184 RF_SET_SYNC_BYTE(RF_SUITABLE_SYNC_BYTE);
01185 MODEM1=(MODEM1&0x03)|0x24;
01186 INT_ENABLE(INUM_RF, INT_OFF);
01187 INT_SETFLAG(INUM_RF, INT_CLR);
01188
01189
if (onlyDataPackets) {
01190
WAIT_FOR_TIMER0_EXACT(
RF_RENDEZVOUS_DATA_PACKET_START_HI, RF_RENDEZVOUS_DATA_PACKET_START_LO);
01191 }
01192 BLED= LED_ON;
01193 RF_START_RX();
01194
01195
01196 halConfigTimerFast23(TIMER2|TIMER23_NO_INT_TIMER, timeOutPeriodData);
01197
01198 INT_SETFLAG(INUM_TIMER2, INT_CLR);
01199 TIMER2_RUN(TRUE);
01200
01201
01202
01203 syncByteReceived= FALSE;
01204
while (1) {
01205
01206
01207
01208
if (INT_GETFLAG(INUM_TIMER2) || (ET0 == INT_ON && !
RF_SLOT_500_US_LEFT)) {
01209
01210 INT_SETFLAG(INUM_TIMER2, INT_CLR);
01211
01212
break;
01213 }
01214
01215
if (INT_GETFLAG(INUM_RF)) {
01216 INT_SETFLAG(INUM_RF, INT_CLR);
01217 syncByteReceived= TRUE;
01218
break;
01219 }
01220 }
01221
01222
01223
01224 length= 0;
01225
if (syncByteReceived) {
01226
01227
01228
01229
01230
01231 RF_LOCK_AVERAGE_FILTER(TRUE);
01232
01233
01234
01235
01236
01237
RF_SPI_RECEIVE_BYTE(a);
01238 a=
RFDescramble(a);
01239
01240
01241
RF_SPI_RECEIVE_BYTE(a);
01242 a=
RFDescramble(a);
01243
01244
01245 sync= a & 1;
01246
01247
if (sync) {
01248
01249
RF_SPI_RECEIVE_BYTE(tHi);
01250 tHi=
RFDescramble(tHi);
01251
RF_SPI_RECEIVE_BYTE(tLo);
01252 tLo=
RFDescramble(tLo);
01253
01254
RF_SPI_RECEIVE_BYTE(j);
01255 j=
RFDescramble(j);
01256
01257
01258
if (j == tHi ^ tLo) {
01259 TIMER0_RUN(FALSE);
01260 a= TH0;
01261 b= TL0;
01262 TH0= tHi;
01263 TL0= tLo;
01264 TIMER0_RUN(TRUE);
01265
01266
01267
01268
RF_SET_MODE_SLEEP;
01269 length= 1;
01270
01271
#ifdef DEBUG_DUMP_SYNC_VALUES
01272
#ifdef DEBUG_USE_UART
01273
01274 sendByteToUart(tHi);
01275 sendByteToUart(tLo);
01276 DEBUG_SPACE;
01277
01278
01279 sendByteToUart(a);
01280 sendByteToUart(b);
01281 DEBUG_SPACE;
01282
01283
01284 sendSignedByteToUart((
int)tHi-(
int)a,3);
01285 sendSignedByteToUart((
int)tLo-(
int)b,3);
01286 DEBUG_NEWLINE;
01287
#endif
01288
#endif
01289
}
01290 }
else {
01291
01292
RF_SPI_RECEIVE_BYTE(length);
01293 length=
RFDescramble(length);
01294
01295
01296
RF_SPI_RECEIVE_BYTE(a);
01297 a=
RFDescramble(a);
01298
01299
RF_SPI_RECEIVE_BYTE(b);
01300 b=
RFDescramble(b);
01301
01302
01303
if (ACL_subscribe_all) {
01304
01305
RF_SPI_RECEIVE_BYTE(a);
01306
01307
01308
RF_SPI_RECEIVE_BYTE(a);
01309
01310
01311
RF_SPI_RECEIVE_BYTE(a);
01312
01313
01314
RF_SPI_RECEIVE_BYTE(a);
01315
01316
01317 }
else {
01318 aclMatch= FALSE;
01319
01320
for (i=0; i <
ACL_SUBSCRIPTIONLIST_LENGTH; i+=
ACL_SUBSCRIPTIONLIST_LENGTH / 4) {
01321
01322
while(!(EXIF & 0x10)); EXIF&=~0x10;
01323
for (j=i;j < i +
ACL_SUBSCRIPTIONLIST_LENGTH / 4;j++) {
01324
if ((ACL_subscriptions[j][0] == a) && (ACL_subscriptions[j][1] == b))
01325 aclMatch= TRUE;
01326
01327
01328 }
01329 }
01330
if (!aclMatch) {
01331
RF_SET_MODE_SLEEP;
01332
return 0;
01333 }
01334 }
01335
01336
01337
01338
01339
for (j=0; j<12; j++) {
01340
RF_SPI_RECEIVE_BYTE(b);
01341
LL_header_receivebuffer[j]=
RFDescramble(b);
01342 }
01343
01344
01345 length= length-LL_HEADER_SIZE-LL_TAIL_SIZE;
01346
if (length > 64) {
01347
01348
RF_SET_MODE_SLEEP;
01349
return 0;
01350 }
01351
for (j=0; j<length; j++) {
01352
RF_SPI_RECEIVE_BYTE(b);
01353
LL_payload_receivebuffer[j]=
RFDescramble(b);
01354 }
01355
01356
01357
for (j=0; j<LL_TAIL_SIZE; j++) {
01358
RF_SPI_RECEIVE_BYTE(b);
01359
LL_tail_receivebuffer[j]=
RFDescramble(b);
01360 }
01361
01362
RF_SET_MODE_SLEEP;
01363
01364
01365 crc=
LLCalcCRC16(
LL_header_receivebuffer,
LL_payload_receivebuffer, length);
01366
if ((crc >> 8) ==
LL_tail_receivebuffer[0] && (crc & 0xFF) ==
LL_tail_receivebuffer[1]) {
01367
01368
for (i=0; i<LL_HEADER_SIZE; i++) {
01369
LL_header_received[i]=
LL_header_receivebuffer[i];
01370 }
01371
for (i=0; i<length; i++) {
01372
LL_payload_received[i]=
LL_payload_receivebuffer[i];
01373 }
01374
for (i=0; i<LL_TAIL_SIZE; i++) {
01375
LL_tail_received[i]=
LL_tail_receivebuffer[i];
01376 }
01377 }
else {
01378
01379
01380
01381
01382
RF_SET_MODE_SLEEP;
01383
return 0;
01384 }
01385 }
01386 }
01387
01388
01389
01390
01391
01392
01393 RFCON&=~0x01;
01394
01395
01396
01397
01398
01399
01400 INT_SETFLAG(INUM_TIMER2, INT_CLR);
01401 TIMER2_RUN(FALSE);
01402
01403 BLED= LED_OFF;
01404
01405
01406
01407
01408
01409
if (sync && length == 1) {
01410
return 2;
01411 }
else if (!sync && length > 0) {
01412
return 1 + 256 * length;
01413 }
else {
01414
return 0;
01415 }
01416 }
01417
01418
01426 byte
RFArbitrationBit(
bool sendOrListen, byte t0hi, byte t0lo) {
01427 byte i, sample1, paPow;
01428
01429
if (sendOrListen) {
01430
01431
01432 BLED= ~BLED;
01433 BLED= ~BLED;
01434
01435 paPow= PA_POW;
01436 PA_POW= 0xF0;
01437
RFSetModeTransmit();
01438 RFBUF= 0xFF;
01439 BLED= ~BLED;
01440 BLED= ~BLED;
01441
01442 RFBUF= sample1=
BIN(10101010);
01443
01444
01445
WAIT_FOR_TIMER0_EXACT(t0hi, t0lo);
01446 BLED= ~BLED;
01447 RF_START_TX();
01448
for (i=0; i<30; i++) {
01449 sample1= ((sample1 << 1) | (sample1 >> 7));
01450
while(!RF_READY_TO_SEND());
01451 RFBUF= sample1;
01452 }
01453
while(!RF_READY_TO_SEND());
01454 BLED= ~BLED;
01455 BLED= ~BLED;
01456 BLED= ~BLED;
01457 PA_POW= paPow;
01458
01459
01460
01461
return 255;
01462 }
else {
01463
01464
01465 BLED= ~BLED;
01466 BLED= ~BLED;
01467
01468
RFSetModeReceive();
01469 RF_SET_PREAMBLE_COUNT(RF_PREDET_OFF);
01470 RF_START_RX();
01471 BLED= ~BLED;
01472 BLED= ~BLED;
01473
01474
01475
WAIT_FOR_TIMER0_EXACT(t0hi, t0lo-5);
01476
01477
01478
01479 BLED= ~BLED;
01480 ADC_SAMPLE_SINGLE();
01481 ADC_GET_SAMPLE_8BIT();
01482 ADC_SAMPLE_SINGLE();
01483 sample1= ADC_GET_SAMPLE_8BIT();
01484
01485 BLED= ~BLED;
01486
01487
return sample1;
01488 }
01489 }
01490
01498 byte
RFArbitrationBitDebug(
bool sendOrListen, byte t0hi, byte t0lo) {
01499 byte sample1;
01500
01501
if (sendOrListen) {
01502
01503
01504 BLED= ~BLED;
01505 BLED= ~BLED;
01506
RFSetModeTransmit();
01507 RFBUF= 0xFF;
01508 BLED= ~BLED;
01509 BLED= ~BLED;
01510
01511 RFBUF= sample1=
BIN(10101010);
01512
01513 t0hi= TH0;
01514 t0lo= TL0;
01515 }
else {
01516
01517
01518 BLED= ~BLED;
01519 BLED= ~BLED;
01520
01521
RFSetModeReceive();
01522 RF_SET_PREAMBLE_COUNT(RF_PREDET_OFF);
01523 RF_START_RX();
01524 BLED= ~BLED;
01525 BLED= ~BLED;
01526
01527 t0hi= TH0;
01528 t0lo= TL0;
01529 }
01530 sendByteToUart(t0hi);
01531
putchar(
':');
01532 sendByteToUart(t0lo);
01533 DEBUG_NEWLINE;
01534
return 0;
01535 }
01536
01537
#ifdef DEBUG_ARBITRATION_TEST_COUNT
01538
byte arbitrationByteGlob= 0;
01539
#endif
01540
01547 bool RFArbitration(
bool tryToObtainMediaAccess) {
01548
bool success= TRUE;
01549 byte arbitrationByte, j, sample1, syncTimeH, syncTimeL;
01550
01551
01552
01553
01554 BLED= LED_ON;
01555
01556 halConfigADC(ADC_MODE_SINGLE | ADC_REFERENCE_INTERNAL_1_25, CC1010EB_CLKFREQ, 0);
01557 ADC_SELECT_INPUT(ADC_INPUT_AD2);
01558 ADC_POWER(TRUE);
01559
01560
01561
01562
#ifndef DEBUG_ARBITRATION_TEST_ACTIVE
01563
if (tryToObtainMediaAccess) {
01564 arbitrationByte=
RF_NEW_RANDOM_BYTE();
01565
01566
01567
if (!arbitrationByte)
01568 arbitrationByte= 1;
01569 }
else {
01570 arbitrationByte= 0;
01571 }
01572
#endif
01573
01574
01575
#ifdef DEBUG_ARBITRATION_TEST_PATTERN
01576
arbitrationByte=
BIN(10101010);
01577
#endif
01578
#ifdef DEBUG_ARBITRATION_TEST_COUNT
01579
arbitrationByte= arbitrationByteGlob++;
01580
#endif
01581
#ifdef DEBUG_ARBITRATION_TEST_0
01582
arbitrationByte= 0;
01583
#endif
01584
01585
01586
01587
01588
01589
01590
01591
01592
01593
01594
01595
01596 syncTimeH=
RF_RENDEZVOUS_ARBITRATION_START_HI;
01597 syncTimeL= RF_RENDEZVOUS_ARBITRATION_START_LO;
01598
01599 RFCON&=~0x01;
01600
for (j=0; j<8; j++) {
01601
01602 sample1=
RFArbitrationBit(
bit_test(arbitrationByte, j), syncTimeH, syncTimeL);
01603
#ifdef DEBUG_USE_UART
01604
#ifdef DEBUG_DUMP_RSSI_SAMPLES
01605
rssiSamples[j]= sample1;
01606
01607
01608
#endif
01609
#endif
01610
01611
if (sample1 <
RF_ARBITRATION_RSSI_THRESHOLD) {
01612 success= FALSE;
01613
01614
#ifndef DEBUG_ARBITRATION_TEST_ACTIVE
01615
break;
01616
#endif
01617
}
01618
01619
01620 syncTimeH= ((syncTimeH << 8 | syncTimeL) + RF_ARBITRATION_TIMER_TICS_OTHER_PERIODS) >> 8;
01621 syncTimeL+=
RF_ARBITRATION_TIMER_TICS_OTHER_PERIODS;
01622 }
01623
RF_SET_MODE_SLEEP;
01624 ADC_POWER(FALSE);
01625
return sample1;
01626
01627
if (success)
01628 GLED= ~GLED;
01629
else
01630 RLED= ~RLED;
01631
#ifdef DEBUG_USE_UART
01632
#ifdef DEBUG_DUMP_RSSI_SAMPLES
01633
if (success) {
01634
arbitrationGood++;
01635 }
else {
01636
arbitrationBad++;
01637 }
01638 sample1= 0;
01639
for (j=0; j<8; j++) {
01640
01641
01642
01643 sendByteToUart(j);
01644 DEBUG_SPACE;
01645
01646
01647 sendByteToUart(
rssiSamples[j]);
01648
01649
01650
01651
01652
01653
01654
01655
01656
01657 DEBUG_NEWLINE;
01658 }
01659
01660
01661
01662
01663
01664
01665
01666 DEBUG_NEWLINE;
01667
#endif
01668
#endif
01669
BLED= LED_OFF;
01670
return success;
01671 }
01672
01673
01683
#ifdef RF_USE_TRAFFIC_INDICATION
01684
void RFTrafficIndication() {
01685
bool result,tmp;
01686
01687 BLED= LED_ON;
01688 halConfigADC(ADC_MODE_SINGLE | ADC_REFERENCE_INTERNAL_1_25, CC1010EB_CLKFREQ, 0);
01689 ADC_SELECT_INPUT(ADC_INPUT_AD2);
01690 ADC_POWER(TRUE);
01691
01692
if (
llState &
LL_STATE_NEED_TO_SEND) {
01693
RFArbitrationBit(TRUE, RF_RENDEZVOUS_TRAFFIC_INDICATION_HI, RF_RENDEZVOUS_TRAFFIC_INDICATION_LO);
01694 result= TRUE;
01695 }
else {
01696
01697
01698
01699
01700 tmp=
RFArbitrationBit(FALSE, RF_RENDEZVOUS_TRAFFIC_INDICATION_HI, RF_RENDEZVOUS_TRAFFIC_INDICATION_LO);
01701 result= tmp <
RF_ALONE_TEST_RSSI_THRESHOLD;
01702 }
01703
01704
RF_SET_MODE_SLEEP;
01705 ADC_POWER(FALSE);
01706 BLED= LED_OFF;
01707
01708
01709
01710
if (result)
01711
rfState|=
RF_STATE_TRAFFIC_GROUP;
01712
else
01713
rfState&= ~
RF_STATE_TRAFFIC_GROUP;
01714 }
01715
#endif
01716
01725
#ifdef RF_USE_ALONE_DETECTION
01726
bool RFAloneTest() {
01727
bool result;
01728 byte tmp;
01729
01730 BLED= LED_ON;
01731 halConfigADC(ADC_MODE_SINGLE | ADC_REFERENCE_INTERNAL_1_25, CC1010EB_CLKFREQ, 0);
01732 ADC_SELECT_INPUT(ADC_INPUT_AD2);
01733 ADC_POWER(TRUE);
01734 RFCON&=~0x01;
01735
01736
if (
rfState &
RF_STATE_MASTER) {
01737
01738
01739
01740 tmp=
RFArbitrationBit(FALSE, RF_RENDEZVOUS_ALONE_TEST_HI, RF_RENDEZVOUS_ALONE_TEST_LO);
01741 result= tmp <
RF_ALONE_TEST_RSSI_THRESHOLD;
01742
01743
01744
01745
01746 }
else {
01747
01748
RFArbitrationBit(TRUE, RF_RENDEZVOUS_ALONE_TEST_HI, RF_RENDEZVOUS_ALONE_TEST_LO);
01749 result= TRUE;
01750
01751 }
01752
01753
RF_SET_MODE_SLEEP;
01754 ADC_POWER(FALSE);
01755 BLED= LED_OFF;
01756
return result;
01757 }
01758
#endif
01759
01766 byte
RFAloneRandomNumberOfSeconds() {
01767
01768
return 10 + (
RF_NEW_RANDOM_BYTE() >> 4);
01769 }
01770
01778 unsigned short RFAloneRandomNumberOfSlots() {
01779
01780
return 333 + ((
RF_NEW_RANDOM_BYTE() << 8)+
RF_NEW_RANDOM_BYTE()) % 534;
01781 }
01782
01791 void RFLowPowerSleep(byte sleepTime) {
01792 byte i;
01793
01794 sendByteToUart(sleepTime);
01795 DEBUG_NEWLINE;
01796
01797 TIMER0_RUN(FALSE);
01798 RLED= GLED= LED_OFF;
01799 YLED= LED_OFF;
01800
01801
01802
01803
01804 INT_PRIORITY(INUM_TIMER2, INT_HIGH);
01805 halConfigTimer23(TIMER2 | TIMER23_INT_TIMER, 1000000, CC1010EB_LOW_CLKFREQ);
01806
01807 MAIN_CLOCK_SET_SOURCE(CLOCK_X32);
01808 XOSC_ENABLE(FALSE);
01809
01810
01811 INT_SETFLAG(INUM_TIMER2, INT_CLR);
01812 TIMER2_RUN(TRUE);
01813
for (i=0; i<sleepTime; i++) {
01814 RLED= ~RLED;
01815
01816 ENTER_IDLE_MODE();
01817 }
01818 TIMER2_RUN(FALSE);
01819
01820
01821 XOSC_ENABLE(TRUE);
01822 MAIN_CLOCK_SET_SOURCE(CLOCK_XOSC);
01823
01824 INT_ENABLE(INUM_TIMER2, INT_OFF);
01825 INT_PRIORITY(INUM_TIMER2, INT_LOW);
01826 TIMER0_RUN(TRUE);
01827
01828 RLED= LED_OFF;
01829 YLED= LED_ON;
01830 }
01831
01835 void RFLowPowerSleepTillKeyPressed() {
01836 TIMER0_RUN(FALSE);
01837 RLED= GLED= LED_OFF;
01838 YLED= LED_OFF;
01839
01840 INT_EXTERNAL0_TRIGGER_ON_EDGE();
01841 INT_ENABLE(INUM_EXTERNAL0, TRUE);
01842
01843 MAIN_CLOCK_SET_SOURCE(CLOCK_X32);
01844 XOSC_ENABLE(FALSE);
01845
01846
01847 INT_SETFLAG(INUM_EXTERNAL0, INT_CLR);
01848 ENTER_IDLE_MODE();
01849
01850
01851 XOSC_ENABLE(TRUE);
01852 MAIN_CLOCK_SET_SOURCE(CLOCK_XOSC);
01853
01854 INT_ENABLE(INUM_EXTERNAL0, FALSE);
01855 TIMER0_RUN(TRUE);
01856
01857 RLED= LED_OFF;
01858 YLED= LED_ON;
01859
01860 }
01861
01862
01868 byte
RFScramble(byte b) {
01869 byte i, scrReg;
01870
01871 scrReg=
rfScramblerReg;
01872 RF_SCRAMBLE(b, scrReg, i);
01873
rfScramblerReg= scrReg;
01874
01875
return b;
01876 }
01877
01888 bool RFSendPacket(
bool sync) {
01889 byte numPreambles, j, b, currentTHi, currentTLo;
01890
01891
01892
01893 halWait(1, CC1010EB_CLKFREQ);
01894 numPreambles=
RF_PREAMBLE_LENGTH_TX;
01895
01896
01897
RFSetModeTransmit();
01898
01899
01900
01901 RFCON|=0x01;
01902 RF_SEND_BYTE(RF_PREAMBLE_BYTE);
01903
01904
if (sync) {
01905
01906
01907
01908
01909
01910
01911
01912
01913
01914
01915
WAIT_FOR_TIMER0_EXACT(
RF_RENDEZVOUS_SYNC_START_HI, RF_RENDEZVOUS_SYNC_START_LO);
01916 }
else {
01917
01918
01919
01920
01921
01922
01923
01924
01925
01926
01927
WAIT_FOR_TIMER0_EXACT(
RF_RENDEZVOUS_DATA_PACKET_START_HI, RF_RENDEZVOUS_DATA_PACKET_START_LO);
01928 }
01929 BLED= LED_ON;
01930
01931
01932 RF_START_TX();
01933
01934
01935
01936
if (sync) {
01937
01938 currentTHi= TH0;
01939 currentTLo= TL0;
01940 currentTHi= ((currentTHi | currentTLo) +
RF_SYNC_ADDITIONAL_OFFSET) >> 8;
01941 currentTLo= currentTLo +
RF_SYNC_ADDITIONAL_OFFSET;
01942 j= currentTHi ^ currentTLo;
01943 }
01944
01945
01946
while (--numPreambles) {
01947
RF_SPI_SEND_BYTE(RF_PREAMBLE_BYTE);
01948 }
01949
01950
01951
RF_SPI_SEND_BYTE(RF_SUITABLE_SYNC_BYTE);
01952
01953
01954
01955
01956
01957
01958 b=
RFScramble(0xFF);
01959
RF_SPI_SEND_BYTE(b);
01960
01961
01962
01963
if (sync) {
01964
01965
01966 b=
RFScramble(1);
01967
RF_SPI_SEND_BYTE(b);
01968
01969
01970
01971 b=
RFScramble(currentTHi);
01972
RF_SPI_SEND_BYTE(b);
01973 b=
RFScramble(currentTLo);
01974
RF_SPI_SEND_BYTE(b);
01975 b=
RFScramble(j);
01976
RF_SPI_SEND_BYTE(b);
01977
01978
01979
01980
01981
01982
#ifdef DEBUG_USE_UART
01983
#ifdef DEBUG_DUMP_SYNC_VALUES
01984
j= TH0;
01985 b= TL0;
01986 sendByteToUart(currentTHi);
01987 sendByteToUart(currentTLo);
01988 DEBUG_SPACE;
01989 sendByteToUart(j);
01990 sendByteToUart(b);
01991 DEBUG_NEWLINE;
01992
01993
#endif
01994
#endif
01995
}
else {
01996
01997 b=
RFScramble(0);
01998
RF_SPI_SEND_BYTE(b);
01999
02000
if (
LL_payload_sendbuffer_length > 64)
02001
LL_payload_sendbuffer_length= 64;
02002
02003
02004 b=
RFScramble(
LL_payload_sendbuffer_length + LL_HEADER_SIZE + LL_TAIL_SIZE);
02005
RF_SPI_SEND_BYTE(b);
02006
02007 b=
RFScramble(
LL_payload_sendbuffer[0]);
02008
RF_SPI_SEND_BYTE(b);
02009 b=
RFScramble(
LL_payload_sendbuffer[1]);
02010
RF_SPI_SEND_BYTE(b);
02011
02012
02013
02014
RF_SPI_SEND_BYTE(
BIN(11001010));
02015
02016
02017
RF_SPI_SEND_BYTE(
BIN(11001010));
02018
02019
02020
RF_SPI_SEND_BYTE(
BIN(11001010));
02021
02022
02023
RF_SPI_SEND_BYTE(
BIN(11001010));
02024
02025
02026
02027
02028
for (j=0; j<12; j++) {
02029 b=
RFScramble(
LL_header_sendbuffer[j]);
02030
RF_SPI_SEND_BYTE(b);
02031 }
02032
02033
02034
for (j=0; j<
LL_payload_sendbuffer_length; j++) {
02035 b=
RFScramble(
LL_payload_sendbuffer[j]);
02036
RF_SPI_SEND_BYTE(b);
02037 }
02038
02039
02040
for (j=0; j<LL_TAIL_SIZE; j++) {
02041 b=
RFScramble(
LL_tail_sendbuffer[j]);
02042
RF_SPI_SEND_BYTE(b);
02043 }
02044 }
02045
02046
RF_SPI_SEND_BYTE(0);
02047
RF_SPI_SEND_BYTE(0);
02048
02049
02050
02051
02052
02053
RF_SET_MODE_SLEEP;
02054 RFCON&=~0x01;
02055
02056
02057
02058
02059
02060
02061
02062
02063
02064
02065
02066
02067
02068
02069
02070
02071
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081
02082
02083
02084
02085
02086
02087
02088 BLED= LED_OFF;
02089
return TRUE;
02090 }
02091
02099 bool RFLongSearchForMaster(
unsigned short numTries) {
02100
bool success= FALSE;
02101
02102
02103 INT_ENABLE(INUM_TIMER0, INT_OFF);
02104
02105
while (numTries-- > 0) {
02106
02107
02108
02109
02110
if (
RFReceivePacket(&
periodDataSlot, FALSE) == 2) {
02111 success= TRUE;
02112
break;
02113 }
02114 }
02115
02116
02117 INT_ENABLE(INUM_TIMER0, INT_ON);
02118
02119 INT_SETFLAG(INUM_TIMER0, INT_CLR);
02120
02121
02122
return success;
02123 }
02124
02130 bool RFMasterRivalTest() {
02131
bool success= FALSE;
02132
02133
02134
02135
02136 success= (
RFReceivePacket(&
periodDataSlot, FALSE) == 2);
02137
02138
02139
return success;
02140 }
02141
02143
02144
02145
02151 byte
LLGetIDFromHardware() {
02152
for (i=0;i<=7;i++) {
02153
LL_header_sendbuffer[3+0]= llEpromAddress.
a1;
02154
LL_header_sendbuffer[3+1]= llEpromAddress.
a2;
02155
LL_header_sendbuffer[3+2]= llEpromAddress.
a3;
02156
LL_header_sendbuffer[3+3]= llEpromAddress.
a4;
02157
LL_header_sendbuffer[3+4]= llEpromAddress.
a5;
02158
LL_header_sendbuffer[3+5]= llEpromAddress.
a6;
02159
LL_header_sendbuffer[3+6]= llEpromAddress.
a7;
02160
LL_header_sendbuffer[3+7]=
RF_NEW_RANDOM_BYTE();
02161 }
02162
02163
return 1;
02164 }
02165
02169 void LLInit() {
02170
LL_sequence_no=0;
02171
02172
LL_header_sendbuffer[0]=
LL_PROTOCOL_VERSION;
02173
02174
LL_payload_send_length=0;
02175
LL_payload_received_length= 0;
02176
llState=
LL_STATE_RUNNING;
02177
LL_sequence_no= 0;
02178
02179
LLGetIDFromHardware();
02180
02181
#ifdef DEBUG_USE_UART
02182
sendStringToUart(
"Particle ID:\r\n");
02183 sendByteToUart(
LL_header_sendbuffer[3+0]);
02184
putchar(
'.');
02185 sendByteToUart(
LL_header_sendbuffer[3+1]);
02186
putchar(
'.');
02187 sendByteToUart(
LL_header_sendbuffer[3+2]);
02188
putchar(
'.');
02189 sendByteToUart(
LL_header_sendbuffer[3+3]);
02190
putchar(
'.');
02191 sendByteToUart(
LL_header_sendbuffer[3+4]);
02192
putchar(
'.');
02193 sendByteToUart(
LL_header_sendbuffer[3+5]);
02194
putchar(
'.');
02195 sendByteToUart(
LL_header_sendbuffer[3+6]);
02196
putchar(
'.');
02197 sendByteToUart(
LL_header_sendbuffer[3+7]);
02198 DEBUG_NEWLINE;
02199
#endif
02200
02201
RFInit();
02202 }
02203
02204
02208 void LLStart() {
02209
RFStart();
02210 }
02211
02212
02216 void LLStop() {
02217
RFStop();
02218 }
02219
02225 void LLSlotEnd() {
02226
02227 }
02228
02229
02233 void LLAbortSending() {
02234
if (
LLSendingBusy()) {
02235
if (
llState &
LL_STATE_CTRL_MESSAGE_INSERTED) {
02236
llState&= ~
LL_STATE_CTRL_MESSAGE_INSERTED;
02237 }
else {
02238
llState&= ~
LL_STATE_SEND_SUCCESS;
02239 }
02240
02241
llState&= ~(
LL_STATE_SEND_SUCCESS|
LL_STATE_NEED_TO_SEND);
02242 }
02243 }
02244
02248 void LLSetSendingSuccess() {
02249
02250
if (
llState &
LL_STATE_CTRL_MESSAGE_INSERTED) {
02251
02252
llState&= ~
LL_STATE_CTRL_MESSAGE_INSERTED;
02253 }
else {
02254
llState|=
LL_STATE_SEND_SUCCESS;
02255 }
02256
llState&= ~
LL_STATE_NEED_TO_SEND;
02257
LL_payload_send_length=0;
02258 }
02259
02263 byte
LLSendingBusy() {
02264
return ((
llState &
LL_STATE_NEED_TO_SEND) != 0);
02265 }
02266
02271 byte
LLGetSendSuccess() {
02272
return ((
llState &
LL_STATE_SEND_SUCCESS) != 0);
02273 }
02274
02278 byte
LLIsActive() {
02279
return ((
llState &
LL_STATE_RUNNING) != 0);
02280 }
02281
02285 void LLSetDataToOld() {
02286
llState&= ~
LL_STATE_NEW_DATA;
02287 }
02288
02293 void LLLockReceiveBuffer() {
02294
llState|=
LL_STATE_RECEIVE_BUFFER_LOCKED;
02295
LLSetDataToOld();
02296 }
02297
02301 byte
LLReceiveBufferLocked() {
02302
return ((
llState &
LL_STATE_RECEIVE_BUFFER_LOCKED) != 0);
02303 }
02304
02308 void LLReleaseReceiveBuffer() {
02309
llState&= ~
LL_STATE_RECEIVE_BUFFER_LOCKED;
02310
LLSetDataToOld();
02311 }
02312
02316 void LLSetDataToNew() {
02317
llState|=
LL_STATE_NEW_DATA;
02318 }
02319
02320
02325 byte
LLDataIsNew() {
02326
return ((
llState &
LL_STATE_NEW_DATA) != 0);
02327 }
02328
02332 byte
LLGetFieldStrength() {
02333
return rfFieldStrength;
02334 }
02335
02339 void LLSetFieldStrength(byte value) {
02340
rfFieldStrength= value;
02341 }
02342
02343
02351 unsigned short LLCalcCRC16(byte *header_data, byte *payload_data, byte payload_size) {
02352
02353 byte hb,lb,i,tmp;
02354 lb=0;
02355 hb=0;
02356
02357
for(i=0;i<LL_HEADER_SIZE;i++) {
02358 tmp = lb;
02359 lb = hb;
02360 hb = tmp;
02361 lb ^= header_data[i];
02362 lb ^= lb >> 4;
02363 hb ^= lb << 4;
02364 hb ^= lb >> 3;
02365 lb ^= (lb << 4) << 1;
02366 }
02367
02368
02369
for(i=0;i<payload_size;i++) {
02370 tmp = lb;
02371 lb = hb;
02372 hb = tmp;
02373 lb ^= payload_data[i];
02374 lb ^= lb >> 4;
02375 hb ^= lb << 4;
02376 hb ^= lb >> 3;
02377 lb ^= (lb << 4) << 1;
02378 }
02379
02380
return hb*256+lb;
02381 }
02382
02383
02388 byte
LLSendPacket(byte slot_limit) {
02389
unsigned short crc;
02390
02391
if (slot_limit==0) slot_limit=1;
02392
02393
02394
if (!(
rfState &
RF_STATE_RUNNING))
return 0;
02395
02396
if (
llState &
LL_STATE_NEED_TO_SEND)
return 0;
02397
02398
02399
02400
02401
02402
if (
LL_payload_send_length > 64)
02403
LL_payload_send_length= 64;
02404
LL_payload_sendbuffer_length=
LL_payload_send_length;
02405
for (i=0; i<
LL_payload_send_length; i++)
02406
LL_payload_sendbuffer[i]=
LL_payload_send[i];
02407
02408
LL_header_sendbuffer[1]=
LL_payload_sendbuffer_length;
02409
LL_header_sendbuffer[2]=
rfFieldStrength;
02410
LL_header_sendbuffer[11]=
LL_sequence_no;
02411
02412 crc=
LLCalcCRC16(
LL_header_sendbuffer,
LL_payload_sendbuffer,
LL_payload_sendbuffer_length);
02413
02414
LL_tail_sendbuffer[0]= (crc>>8);
02415
LL_tail_sendbuffer[1]= crc & 0xFF;
02416
02417 LL_slots_left= slot_limit;
02418
LL_sequence_no++;
02419
02420
llState|=
LL_STATE_NEED_TO_SEND;
02421
02422
LL_payload_send_length= 0;
02423
02424
return 1;
02425 }
02426
02427
02431 byte
LLGetRemainingPayloadSpace() {
02432
return (LL_PAYLOAD_SIZE-
LL_payload_send_length);
02433 }
02434
02435
02439 byte
LLSentPacketInThisSlot() {
02440
return ((
llState &
LL_STATE_PACKET_JUST_SENT) != 0);
02441 }
02442
02444
02445
02448
02449 void ACLStartUp() {
02450 xdata byte result[10];
02451 byte selftest_result,i;
02452
02453 selftest_result= AppSelfTest(result);
02454
02455 GLED= LED_OFF;
02456 RLED= LED_OFF;
02457 halWait(100, CC1010EB_CLKFREQ);
02458
02459
ACLInit();
02460
02461
02462
02463
#ifdef DEBUG_DUMP_RF_STATISTICS
02464
02465 DebugResetStats();
02466
#endif
02467
02468
if(selftest_result) {
02469
02470
for(i=0;i<10;i++) {
02471
02472
ACLAddNewType(ACL_TYPE_CST_HI,ACL_TYPE_CST_LO);
02473
ACLAddData(result[0]);
02474
ACLAddData(result[1]);
02475
ACLAddData(result[2]);
02476
ACLAddData(result[3]);
02477
ACLAddData(result[4]);
02478
ACLAddData(result[5]);
02479
ACLAddData(result[9]);
02480
02481
ACLSendPacket(10);
02482
while(
ACLSendingBusy());
02483 }
02484 }
02485 }
02486
02487
02489 void ACLInit() {
02490
ACLFlushSubscriptions();
02491 ACL_send_buffer_locked=
false;
02492 ACL_write_position=0;
02493 ACL_subscribe_all=
false;
02494 ACL_ACM_answers=
true;
02495 ACL_ignore_control_messages=
false;
02496 ACL_pass_control_messages=
false;
02497
02498
LL_payload_send_length=0;
02499 ACL_write_position=0;
02500
02501
02502
02503
LLInit();
02504
ACLStart();
02505 }
02506
02507
02514 byte
ACLSubscribe(byte LL_type_h, byte LL_type_l) {
02515 byte i;
02516
02517
for (i=0;i<
ACL_SUBSCRIPTIONLIST_LENGTH;i++) {
02518
if ((ACL_subscriptions[i][0]==LL_type_h) && (ACL_subscriptions[i][1]==LL_type_l))
return 1;
02519 }
02520
02521
for (i=0;i<
ACL_SUBSCRIPTIONLIST_LENGTH;i++) {
02522
if ((ACL_subscriptions[i][0]==0) && (ACL_subscriptions[i][1]==0)) {
02523 ACL_subscriptions[i][0]=LL_type_h;
02524 ACL_subscriptions[i][1]=LL_type_l;
02525
return 1;
02526 }
02527 }
02528
return 0;
02529 }
02530
02537 byte
ACLUnsubscribe(byte LL_type_h, byte LL_type_l) {
02538 byte i;
02539
02540
for (i=0;i<
ACL_SUBSCRIPTIONLIST_LENGTH;i++) {
02541
if ((ACL_subscriptions[i][0]==LL_type_h) && (ACL_subscriptions[i][1]==LL_type_l)) {
02542 ACL_subscriptions[i][0]=0;
02543 ACL_subscriptions[i][1]=0;
02544
return 1;
02545 }
02546 }
02547
return 0;
02548 }
02549
02550
02552 void ACLFlushSubscriptions() {
02553 byte i;
02554
02555
for (i=0;i<
ACL_SUBSCRIPTIONLIST_LENGTH;i++) {
02556 ACL_subscriptions[i][0]=0;
02557 ACL_subscriptions[i][1]=0;
02558 }
02559
02560 ACL_subscribe_all=
false;
02561
ACLSubscribeDefault();
02562
return;
02563 }
02564
02566 void ACLSubscribeAll() {
02567 ACL_subscribe_all=
true;
02568 }
02569
02571 void ACLAnswerOnACM() {
02572 ACL_ACM_answers=
true;
02573 }
02574
02576 void ACLNoAnswerOnACM() {
02577 ACL_ACM_answers=
false;
02578 }
02579
02581 byte
ACLSubscribeDefault() {
02582 byte result;
02583 result=
ACLSubscribe(
ACL_TYPE_ACM_H,
ACL_TYPE_ACM_L);
02584
return result;
02585 }
02586
02593 byte
ACLVerifySubscription(byte type_h,byte type_l) {
02594 byte i;
02595
02596
for (i=0;i<
ACL_SUBSCRIPTIONLIST_LENGTH;i++) {
02597
if ((ACL_subscriptions[i][0]==type_h) && (ACL_subscriptions[i][1]==type_l))
return 1;
02598 }
02599
return 0;
02600 }
02601
02602
02607 byte
ACLProcessControlMessages() {
02608
02609
if ((
LL_payload_receivebuffer[0]==
ACL_TYPE_ACM_H) && (
LL_payload_receivebuffer[1]==
ACL_TYPE_ACM_L)) {
02610
02611
02612
02613
02614
if ((
LL_payload_receivebuffer[3]==172) && (
LL_payload_receivebuffer[4]==224)) {
02615
if (
ACLMatchesMyIP(
LL_payload_receivebuffer,6)) {
02616
return 4;
02617 }
02618 }
02619
02620
02621
if ((
LL_payload_receivebuffer[3]==198) && (
LL_payload_receivebuffer[4]==208)) {
02622
02623 }
02624
02625
02626
if ((
LL_payload_receivebuffer[3]==159) && (
LL_payload_receivebuffer[4]==192)) {
02627
02628 }
02629
02630
02631
if ((
LL_payload_receivebuffer[3]==204) && (
LL_payload_receivebuffer[4]==232)) {
02632
RFStop();
02633 }
02634
02635
02636
if ((
LL_payload_receivebuffer[3]==1) && (
LL_payload_receivebuffer[4]==1)) {
02637 }
02638
02639
02640
if ((
LL_payload_receivebuffer[3]==198) && (
LL_payload_receivebuffer[4]==88)) {
02641
02642 }
02643
02644
02645
if ((
LL_payload_receivebuffer[3]==ACL_TYPE_CID_HI) && (
LL_payload_receivebuffer[4]==ACL_TYPE_CID_LO) ) {
02646
02647 }
02648
02649
02650
if (ACL_ACM_answers==
false)
return 0;
02651
02652
02653
if ((
LL_payload_receivebuffer[3]==115) && (
LL_payload_receivebuffer[4]==216)) {
02654
if (
ACLMatchesMyIP(
LL_payload_receivebuffer,6)) {
02655
if (
LLSendingBusy())
ACLAbortSending();
02656
02657
02658
LL_payload_send[0]=
ACL_TYPE_ACM_H;
02659
LL_payload_send[1]=
ACL_TYPE_ACM_L;
02660
LL_payload_send[2]=0;
02661
02662
LL_payload_send[3]=134;
02663
LL_payload_send[4]=32;
02664
02665
LL_payload_send[5]=8;
02666
LL_payload_send[6]=
LL_header_receivebuffer[3];
02667
LL_payload_send[7]=
LL_header_receivebuffer[4];
02668
LL_payload_send[8]=
LL_header_receivebuffer[5];
02669
LL_payload_send[9]=
LL_header_receivebuffer[6];
02670
LL_payload_send[10]=
LL_header_receivebuffer[7];
02671
LL_payload_send[11]=
LL_header_receivebuffer[8];
02672
LL_payload_send[12]=
LL_header_receivebuffer[9];
02673
LL_payload_send[13]=
LL_header_receivebuffer[10];
02674
LL_payload_send_length=14;
02675
02676
if (
LLSendPacket(
ACL_CONTROL_MESSAGES_TIMEOUT)) {
02677
llState|=
LL_STATE_CTRL_MESSAGE_INSERTED;
02678 }
02679 }
02680 }
02681
02682
return 1;
02683 }
02684
return 0;
02685 }
02686
02688 void ACLSetFieldStrength(byte power) {
02689
LLSetFieldStrength(power);
02690 }
02691
02693 byte
ACLSendingBusy() {
02694
return LLSendingBusy();
02695 }
02696
02702 byte
ACLGetSendSuccess() {
02703
return LLGetSendSuccess();
02704 }
02705
02712 byte
ACLMatchesMyIP(
char *buffer,byte start) {
02713 byte i;
02714
bool res;
02715
02716
02717 res= TRUE;
02718
for (i=0;i<8;i++) {
02719
if (buffer[start+i] !=
LL_header_sendbuffer[3+i]) {
02720 res= FALSE;
02721
break;
02722 }
02723 }
02724
if (res)
return 1;
02725
02726
02727 res= TRUE;
02728
for (i=0;i<8;i++) {
02729
if (buffer[start+i]!=255) {
02730 res= FALSE;
02731
break;
02732 }
02733 }
02734
if (res)
return 1;
02735
02736
return 0;
02737 }
02738
02739
02745 byte
ACLSendPacket(byte slot_timeout) {
02746
return LLSendPacket(slot_timeout);
02747 }
02748
02750 void ACLAbortSending() {
02751 ACL_send_buffer_locked=
false;
02752 ACL_write_position=0;
02753
LLAbortSending();
02754 }
02755
02757 byte
ACLClearSendData() {
02758 byte i;
02759
if (
LLSendingBusy())
return 0;
02760
if (ACL_send_buffer_locked==
true)
return 0;
02761
02762
for(i=0;i<LL_PAYLOAD_SIZE;i++)
02763
LL_payload_send[i]=0;
02764
LL_payload_send_length=0;
02765 ACL_write_position=0;
02766
02767
return 1;
02768 }
02769
02770
02775 bool ACLAddNewType(byte type_h, byte type_l) {
02776
02777
if ((LL_PAYLOAD_SIZE-
LL_payload_send_length)<3) {
02778
return 1;
02779 }
else {
02780
02781
LL_payload_send[
LL_payload_send_length]=type_h;
02782
LL_payload_send[
LL_payload_send_length+1]=type_l;
02783
LL_payload_send[
LL_payload_send_length+2]=0;
02784 ACL_write_position=
LL_payload_send_length+2;
02785
LL_payload_send_length+=3;
02786
return 0;
02787 }
02788 }
02789
02795 byte
ACLAddData(byte newByte) {
02796
02797
if ((LL_PAYLOAD_SIZE-
LL_payload_send_length)<1) {
02798
return 1;
02799 }
else {
02800
LL_payload_send[ACL_write_position]++;
02801
LL_payload_send[
LL_payload_send_length]= newByte;
02802
LL_payload_send_length+=1;
02803
return 0;
02804 }
02805 }
02806
02811 byte
ACLGetRemainingPayloadSpace() {
02812
return LLGetRemainingPayloadSpace();
02813 }
02814
02819 byte
ACLGetReceivedPayloadLength() {
02820
return LL_header_received[1];
02821 }
02822
02827 signed char ACLGetReceivedDataLength(byte type_h, byte type_l) {
02828 byte i;
02829
02830
for (i=0; i<=
LL_header_received[1]-2; i++) {
02831
if ((
LL_payload_received[i]==type_h) && (
LL_payload_received[i+1]==type_l)) {
02832
return (
LL_payload_received[i+2]);
02833 }
02834 }
02835
return -1;
02836 }
02837
02838
02842 char*
ACLGetReceivedData(byte type_h, byte type_l) {
02843 byte i;
02844
02845
for (i=0;i<=
LL_header_received[1]-2;i++) {
02846
if ((
LL_payload_received[i]==type_h) && (
LL_payload_received[i+1]==type_l)) {
02847
if (
LL_payload_received[i+2]!=0) {
02848
return (&(
LL_payload_received[i+3]));
02849 }
02850 }
02851 }
02852
return NULL;
02853 }
02854
02855
02860 char ACLGetReceivedByte(byte type_h, byte type_l, byte position) {
02861 byte i;
02862
02863
for (i=0;i<=
LL_header_received[1]-2;i++) {
02864
if ((
LL_payload_received[i]==type_h) && (
LL_payload_received[i+1]==type_l)) {
02865
if (
LL_payload_received[i+2]!=0) {
02866
return (
LL_payload_received[i+3+position]);
02867 }
02868
02869 }
02870 }
02871
02872
return 0;
02873
02874 }
02875
02881 byte
ACLFoundReceivedType(byte type_h, byte type_l) {
02882
return (
ACLGetReceivedDataLength(type_h,type_l) != -1);
02883 }
02884
02892 void ACLSetControlMessagesBehaviour(
boolean ignore,
boolean pass) {
02893 ACL_ignore_control_messages= ignore;
02894 ACL_pass_control_messages= pass;
02895 }
02896
02897
02901 byte
ACLSentPacketInThisSlot() {
02902
return (
LLSentPacketInThisSlot());
02903 }
02904
02906 void ACLStart() {
02907
LLStart();
02908 }
02909
02911 void ACLStop() {
02912
LLStop();
02913 }
02914
02916 void ACLLockReceiveBuffer() {
02917
LLLockReceiveBuffer();
02918 }
02919
02923 byte
ACLReceiveBufferLocked() {
02924
return LLReceiveBufferLocked();
02925 }
02926
02928 void ACLReleaseReceiveBuffer() {
02929
LLReleaseReceiveBuffer();
02930 }
02931
02933 void ACLSetDataToOld() {
02934
LLSetDataToOld();
02935 }
02936
02938 void ACLSetDataToNew() {
02939
LLSetDataToNew();
02940 }
02941
02945 byte
ACLDataIsNew() {
02946
return LLDataIsNew();
02947 }
02948
02952 byte
ACLDataReceivedInThisSlot() {
02953
return LLSentPacketInThisSlot();
02954 }
02955
02956
02958 byte
ACLDataIsNewNow() {
02959
return ACLDataReceivedInThisSlot();
02960 }
02961
02962
02966 byte
ACLAdressedDataIsNew() {
02967
if (!
ACLDataIsNew())
return 0;
02968
02969
if (
ACLFoundReceivedType(ACL_TYPE_CAD_HI,ACL_TYPE_CAD_LO)) {
02970
if (
ACLMatchesMyIP(
ACLGetReceivedData( ACL_TYPE_CAD_HI, ACL_TYPE_CAD_LO), 0 ))
02971
return 1;
02972 }
02973
return 0;
02974 }
02975
02979 byte
ACLAdressedDataIsNewNow() {
02980
if (!
ACLDataIsNewNow())
return 0;
02981
02982
if (
ACLFoundReceivedType(ACL_TYPE_CAD_HI,ACL_TYPE_CAD_LO)) {
02983
if (
ACLMatchesMyIP(
ACLGetReceivedData( ACL_TYPE_CAD_HI, ACL_TYPE_CAD_LO), 0 ))
02984
return 1;
02985 }
02986
return 0;
02987 }
02988
02989
02995 byte
ACLSendPacketAdressed(
nodeAddrType *address, byte timeout) {
02996
02997
if (
ACLGetRemainingPayloadSpace()<11)
02998
return 0;
02999
03000
ACLAddNewType(ACL_TYPE_CAD_HI,ACL_TYPE_CAD_LO);
03001
ACLAddData(address->
a1);
03002
ACLAddData(address->
a2);
03003
ACLAddData(address->
a3);
03004
ACLAddData(address->
a4);
03005
ACLAddData(address->
a5);
03006
ACLAddData(address->
a6);
03007
ACLAddData(address->
a7);
03008
ACLAddData(address->
a8);
03009
03010
if (
ACLSendPacket(timeout))
return 1;
03011
return 0;
03012 }
03014
03015
03016
03021 void isr_timer0() interrupt INUM_TIMER0 {
03022 byte length;
03023
bool arbitrationResult, recResult;
03024
unsigned short receiveResult;
03025
03026 ISR_TIMER0_ADJUST(
moduloTimer0);
03027 INT_SETFLAG(INUM_TIMER0, INT_CLR);
03028
03029
03030
03031
03032
03033
03034
03035
llState&= ~(
LL_STATE_PACKET_JUST_RECEIVED |
LL_STATE_PACKET_JUST_SENT);
03036
03037
if (!(
rfState &
RF_STATE_RUNNING)) {
03038 TIMER0_RUN(FALSE);
03039
return;
03040 }
03041
03042
03043
03044 rfSlotCount++;
03045
rfSlotsWithoutSignalReceived++;
03046
03047
03048
03049
if (rfSlotCount >=
RF_SYNC_MAX_SLOT_COUNT) {
03050
03051
03052
03053
if (!(
rfState &
RF_STATE_ALONE)) {
03054
if (
rfState &
RF_STATE_MASTER) {
03055
03056
RFSendPacket(TRUE);
03057
#ifdef RF_USE_ALONE_DETECTION
03058
03059
if (
RFAloneTest())
03060
rfSlotsWithoutSignalReceived= 0;
03061
#endif
03062
#ifdef RF_USE_TRAFFIC_INDICATION
03063
RFTrafficIndication();
03064
#endif
03065
if (++rfSyncCount ==
RF_MASTER_RIVAL_TEST_SYNC_COUNT) {
03066
03067 rfSyncCount= 0;
03068
#ifndef DEBUG_ARBITRATION_TEST_ACTIVE
03069
rfState|=
RF_STATE_MASTER_RIVAL_TEST;
03070
if (
RFMasterRivalTest()) {
03071
03072
rfState&= ~(
RF_STATE_MASTER_RIVAL_TEST|
RF_STATE_MASTER);
03073 rfFailedSyncCount= 0;
03074
rfSlotsWithoutSignalReceived= 0;
03075 }
03076
#endif
03077
}
else {
03078
rfState&= ~
RF_STATE_MASTER_RIVAL_TEST;
03079 }
03080 }
else {
03081
03082 recResult=
RFReceivePacket(&periodDataSyncByteReceiveTimeout, FALSE);
03083
if (recResult == 2) {
03084
#ifdef RF_USE_ALONE_DETECTION
03085
RFAloneTest();
03086
#endif
03087
#ifdef RF_USE_TRAFFIC_INDICATION
03088
RFTrafficIndication();
03089
#endif
03090
rfFailedSyncCount= 0;
03091
rfState|=
RF_STATE_IN_SYNC;
03092
putchar(
'R');
03093 DEBUG_NEWLINE;
03094
03095 }
else {
03096
rfState&= ~
RF_STATE_IN_SYNC;
03097
03098
if (++rfFailedSyncCount >=
RF_MAX_FAILED_SYNC_COUNT) {
03099
rfState|=
RF_STATE_LONG_SEARCH_FOR_MASTER;
03100 rfFailedSyncCount= 0;
03101 }
03102
03103 }
03104 }
03105 }
03106 rfSlotCount= 0;
03107 }
else {
03108
03109
03110
if (
rfState &
RF_STATE_ALONE) {
03111
#ifdef RF_USE_ALONE_DETECTION
03112
#ifdef RF_ALONE_DEEP_SLEEP
03113
03114
03115
RFLowPowerSleep(
RFAloneRandomNumberOfSeconds());
03116
rfState&= ~
RF_STATE_ALONE;
03117
if (
RFLongSearchForMaster(
RF_MASTER_SEARCH_SLOTS_AFTER_ALONE)) {
03118
rfState&= ~
RF_STATE_MASTER;
03119 }
else {
03120
rfState|=
RF_STATE_MASTER;
03121 }
03122
03123 rfFailedSyncCount= rfSlotCount=
rfSlotsWithoutSignalReceived= 0;
03124
#else
03125
03126
if (( (rfSlotsInAloneModeLeft & 0xFF) % 32 ) == 0)
03127 RLED= ~RLED;
03128
03129
03130
03131
if (rfSlotsInAloneModeLeft-- == 0) {
03132
rfState&= ~
RF_STATE_ALONE;
03133
if (
RFLongSearchForMaster(
RF_MASTER_SEARCH_SLOTS_AFTER_ALONE)) {
03134
rfState&= ~
RF_STATE_MASTER;
03135 }
else {
03136
rfState|=
RF_STATE_MASTER;
03137 }
03138
03139 rfFailedSyncCount= rfSlotCount=
rfSlotsWithoutSignalReceived= 0;
03140 }
03141
#endif
03142
#endif
03143
}
else if (
rfState &
RF_STATE_LONG_SEARCH_FOR_MASTER) {
03144
03145
03146
03147
if (
RFLongSearchForMaster(10)) {
03148
rfState&= ~
RF_STATE_MASTER;
03149
#ifdef RF_USE_ALONE_DETECTION
03150
RFAloneTest();
03151
#endif
03152
}
else {
03153
03154
rfState|=
RF_STATE_MASTER;
03155 }
03156
rfState&= ~
RF_STATE_LONG_SEARCH_FOR_MASTER;
03157
03158 rfFailedSyncCount= rfSlotCount= 0;
03159 }
else if (
rfState &
RF_STATE_MASTER_RIVAL_TEST) {
03160
03161
if (
RFMasterRivalTest()) {
03162
rfState&= ~
RF_STATE_MASTER;
03163
rfState&= ~
RF_STATE_MASTER_RIVAL_TEST;
03164 rfFailedSyncCount= rfSlotCount= 0;
03165 }
03166 }
else if (
rfState & (
RF_STATE_IN_SYNC |
RF_STATE_MASTER)) {
03167
03168
03169
03170
03171
03172
03173
03174
03175
03176 arbitrationResult= ((
rfState &
RF_STATE_ALONE) || !(
rfState &
RF_STATE_TRAFFIC_GROUP)) ?
03177 TRUE :
RFArbitration(
llState &
LL_STATE_NEED_TO_SEND);
03178
03179
if (
llState &
LL_STATE_NEED_TO_SEND)
03180
statsRfSlotsNeedToSend++;
03181
if (arbitrationResult && (
llState &
LL_STATE_NEED_TO_SEND)) {
03182
statsRfArbitrationWon++;
03183
03184
03185
if ((
rfState &
RF_STATE_TRAFFIC_GROUP) && !(
rfState &
RF_STATE_ALONE))
03186
RFSendPacket(FALSE);
03187
if (
rfState &
RF_STATE_TRAFFIC_GROUP) {
03188
llState&= ~(
LL_STATE_NEED_TO_SEND);
03189
llState|=
LL_STATE_SEND_SUCCESS |
LL_STATE_PACKET_JUST_SENT;
03190 }
03191
putchar((
llState &
LL_STATE_NEED_TO_SEND) ?
'n' :
'y');
03192 }
else {
03193
03194
03195
if ( !(arbitrationResult || (
llState &
LL_STATE_RECEIVE_BUFFER_LOCKED)) ) {
03196
03197
03198 receiveResult= (
rfState &
RF_STATE_ALONE) ? 0 :
RFReceivePacket(&periodDataSyncByteReceiveTimeout, TRUE);
03199
03200
03201
03202
if ((receiveResult & 0xFF) == 1) {
03203 length= receiveResult >> 8;
03204
03205
03206
03207
03208
LL_payload_received_length= length;
03209
statsRfDataPacketsReceivedNotNeedingToSend++;
03210
llState|=
LL_STATE_NEW_DATA |
LL_STATE_PACKET_JUST_RECEIVED;
03211
rfSlotsWithoutSignalReceived= 0;
03212 }
03213 }
03214 }
03215
statsRfSlotsInSync++;
03216 }
else {
03217
03218
03219
if ( !(
llState &
LL_STATE_RECEIVE_BUFFER_LOCKED) ) {
03220
03221
03222 receiveResult= (
rfState &
RF_STATE_ALONE) ? 0 :
RFReceivePacket(&periodDataSyncByteReceiveTimeout, TRUE);
03223
03224
03225
03226
if ((receiveResult & 0xFF) == 1) {
03227 length= receiveResult >> 8;
03228
03229
03230
03231
03232
LL_payload_received_length= length;
03233
llState|=
LL_STATE_NEW_DATA |
LL_STATE_PACKET_JUST_RECEIVED;
03234
rfSlotsWithoutSignalReceived= 0;
03235 }
03236 }
03237 }
03238 }
03239
03240
putchar((arbitrationResult) ?
'w' :
'l');
03241 DEBUG_NEWLINE;
03242
03243
03244
03245
if ((
llState &
LL_STATE_NEED_TO_SEND)) {
03246
if (--LL_slots_left == 0) {
03247
03248
if (
llState &
LL_STATE_CTRL_MESSAGE_INSERTED) {
03249
llState&= ~
LL_STATE_CTRL_MESSAGE_INSERTED;
03250 }
else {
03251
llState&= ~
LL_STATE_SEND_SUCCESS;
03252 }
03253
03254
llState&= ~
LL_STATE_NEED_TO_SEND;
03255
LL_payload_sendbuffer_length= 0;
03256 }
03257 }
03258
03259
#ifdef RF_USE_ALONE_DETECTION
03260
if (
rfSlotsWithoutSignalReceived >
RF_ALONE_TEST_FAILED_THRESHOLD && !(
rfState &
RF_STATE_ALONE)) {
03261
rfState|=
RF_STATE_ALONE;
03262
#ifndef RF_ALONE_DEEP_SLEEP
03263
rfSlotsInAloneModeLeft=
RFAloneRandomNumberOfSlots();
03264
#endif
03265
}
03266
#endif
03267
03268
#ifdef DEBUG_USE_UART
03269
#ifdef DEBUG_DUMP_RF_STATISTICS
03270
DebugDumpStats();
03271
#endif
03272
#ifdef DEBUG_DUMP_RF_STATE
03273
DebugDumpRfState();
03274
#endif
03275
#endif
03276
03277
03278
03279
03280 }
03281
03282
03287 void isr_timer2() interrupt INUM_TIMER2 {
03288 INT_SETFLAG(INUM_TIMER2, INT_CLR);
03289 }
03290
03295 void isr_externalInterrupt() interrupt INUM_EXTERNAL0 {
03296 INT_SETFLAG(INUM_EXTERNAL0, INT_CLR);
03297 }
03298
03299
03300
03301
03302
03307 void main(
void) {
03308 data
unsigned long count=0;
03309
03310
03311
ParticleInit();
03312
03313
03314
ACLStartUp();
03315
03316
03317
while (TRUE) {
03318
if (!(
rfState &
RF_STATE_MASTER)) {
03319
rfState|=
RF_STATE_IN_SYNC;
03320
03321
03322 count++;
03323
ACLAddNewType(ACL_TYPE_ASM_HI, ACL_TYPE_ASM_LO);
03324
ACLAddData(count >> 24);
03325
ACLAddData(count >> 16);
03326
ACLAddData(count >> 8);
03327
ACLAddData(count & 0xFF);
03328
03329
03330
ACLSendPacket(1);
03331
03332
03333
while (
ACLSendingBusy())
03334
RF_LOW_POWER_SLEEP_UNTIL_NEXT_SLOT();
03335
03336 RLED= GLED= LED_OFF;
03337
03338
03339
03340
03341 }
03342
03343
LLStop();
03344
03345
RFLowPowerSleep(5);
03346
03347
LLStart();
03348
RF_LOW_POWER_SLEEP_UNTIL_NEXT_SLOT();
03349 }
03350 }