Subversion Repositories HomeAutomation

Rev

Rev 2200 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
1922 arune 1
 
2
#include "sns_rfTransceive.h"
3
 
1996 arune 4
#if IR_RX_ENABLE==1
1922 arune 5
StdCan_Msg_t        rfTxMsg;
6
uint8_t rfRxChannel_newData;
2199 arune 7
uint8_t rfRxChannel_len;
8
uint8_t rfRxChannel_index;
1922 arune 9
uint8_t rfRxChannel_state;
10
Ir_Protocol_Data_t  rfRxChannel_proto;
1927 arune 11
uint16_t    rfRxChannel_buf[MAX_NR_TIMES];
1922 arune 12
 
2198 arune 13
void sns_rfTransceive_RX_done_callback(uint8_t channel, uint16_t *buffer, uint8_t len, uint8_t index)
1922 arune 14
{
2198 arune 15
#if IR_RX_CONTINUOUS_MODE==0
1922 arune 16
    rfRxChannel_newData = TRUE;
2199 arune 17
    rfRxChannel_len = len;
2198 arune 18
#else
19
    if (len > sns_rfTransceive_MIN_NUM_PULSES)
20
    {
21
        rfRxChannel_newData = TRUE;
2199 arune 22
        rfRxChannel_len = len;
23
        rfRxChannel_index = index;
2200 arune 24
//gpio_set_pin(EXP_B);
2198 arune 25
    }
26
#endif
1922 arune 27
}
28
#endif
29
 
30
 
31
#if IR_TX_ENABLE==1
1927 arune 32
uint8_t rfTxChannel_sendComplete;
33
uint8_t rfTxChannel_state;
2199 arune 34
uint8_t rfTxChannel_len;
1927 arune 35
Ir_Protocol_Data_t  rfTxChannel_proto;
36
uint16_t    rfTxChannel_buf[MAX_NR_TIMES];
37
uint8_t rfTxChannel_repeatCount;
38
uint8_t rfTxChannel_stopSend;
39
 
1922 arune 40
void sns_rfTransceive_TX_done_callback(uint8_t channel)
41
{
42
    rfTxChannel_sendComplete = TRUE;
43
}
44
#endif
45
 
46
void sns_rfTransceive_Init(void)
47
{
1996 arune 48
#if IR_RX_ENABLE==1
1922 arune 49
    StdCan_Set_class(rfTxMsg.Header, CAN_MODULE_CLASS_SNS);
50
    StdCan_Set_direction(rfTxMsg.Header, DIRECTIONFLAG_FROM_OWNER);
51
    rfTxMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_RFTRANSCEIVE;
52
    rfTxMsg.Header.ModuleId = sns_rfTransceive_ID;
1996 arune 53
    rfTxMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_IR;
1922 arune 54
    rfTxMsg.Length = 8;
55
 
56
    rfRxChannel_newData = FALSE;
2199 arune 57
    rfRxChannel_len = 0;
1922 arune 58
    rfRxChannel_proto.timeout=0;
59
    rfRxChannel_proto.data=0;
60
    rfRxChannel_proto.repeats=0;
61
    rfRxChannel_proto.protocol=0;
1927 arune 62
#endif
63
 
64
#if IR_TX_ENABLE==1
1922 arune 65
    rfTxChannel_sendComplete = FALSE;
2199 arune 66
    rfTxChannel_len = 0;
1922 arune 67
    rfTxChannel_proto.data=0;
68
    rfTxChannel_proto.repeats=0;
69
    rfTxChannel_proto.framecnt=0;
70
    rfTxChannel_proto.protocol=0;
71
    rfTxChannel_repeatCount = 0;
1927 arune 72
#endif
1922 arune 73
 
74
    IrTransceiver_Init();
75
    /* TX-pin must be set in case transmitter is nexa */
76
    gpio_set_out(sns_rfTransceive_TX_PIN);
77
#if IR_TX_ACTIVE_LOW==1
78
    gpio_set_pin(sns_rfTransceive_TX_PIN);
79
#else
80
    gpio_clr_pin(sns_rfTransceive_TX_PIN);
81
#endif
82
 
1923 arune 83
#if IR_RX_ENABLE==1
1927 arune 84
    IrTransceiver_InitRxChannel(0, rfRxChannel_buf, sns_rfTransceive_RX_done_callback, sns_rfTransceive_RX_PCINT, sns_rfTransceive_RX_PIN);
1922 arune 85
    rfRxChannel_state = sns_rfTransceive_STATE_RECEIVING;
1923 arune 86
#endif
1922 arune 87
 
1923 arune 88
#if IR_TX_ENABLE==1
1922 arune 89
    IrTransceiver_InitTxChannel(0, sns_rfTransceive_TX_done_callback, sns_rfTransceive_TX_PIN);
90
    rfTxChannel_state = sns_rfTransceive_STATE_IDLE;
1923 arune 91
#endif
1922 arune 92
}
93
 
2198 arune 94
 
95
///////////// DEBUG!!!!
2236 linlun 96
#if (sns_rfTransceive_SEND_DEBUG==1)
2198 arune 97
StdCan_Msg_t irTxMsg;
2236 linlun 98
void send_debug(uint16_t *buffer, uint8_t startindex, uint8_t endindex) {
2198 arune 99
 
100
    /* the protocol is unknown so the raw ir-data is sent, makes it easier to develop a new protocol */
101
 
102
    StdCan_Set_class(irTxMsg.Header, CAN_MODULE_CLASS_SNS);
103
    StdCan_Set_direction(irTxMsg.Header, DIRECTIONFLAG_FROM_OWNER);
104
    irTxMsg.Length = 8;
2236 linlun 105
    irTxMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_RFTRANSCEIVE;
2198 arune 106
    irTxMsg.Header.ModuleId = 0;
107
    irTxMsg.Header.Command = CAN_MODULE_CMD_IRRECEIVE_IRRAW;
2236 linlun 108
    while (StdCan_Put(&irTxMsg) != StdCan_Ret_OK) {}
109
      _delay_ms(1);
110
    //_------------------
111
    uint8_t i= startindex;
112
    while(i != endindex) {
113
      irTxMsg.Length = 2;
114
      irTxMsg.Data[0] = (buffer[i]>>8)&0xff;
115
      irTxMsg.Data[1] = (buffer[i]>>0)&0xff;
116
      i++;
117
      if (i == MAX_NR_TIMES) {
118
        i=0;
119
      }
120
      if(i != endindex) {
121
        irTxMsg.Length = 4;
122
        irTxMsg.Data[2] = (buffer[i]>>8)&0xff;
123
        irTxMsg.Data[3] = (buffer[i]>>0)&0xff;
124
        i++;
125
        if (i == MAX_NR_TIMES) {
126
          i=0;
127
        }
128
        if(i != endindex) {
129
          irTxMsg.Length = 6;
130
          irTxMsg.Data[4] = (buffer[i]>>8)&0xff;
131
          irTxMsg.Data[5] = (buffer[i]>>0)&0xff;
132
          i++;
133
          if (i == MAX_NR_TIMES) {
134
        i=0;
135
          }
136
          if(i != endindex) {
137
        irTxMsg.Length = 8;
138
        irTxMsg.Data[6] = (buffer[i]>>8)&0xff;
139
        irTxMsg.Data[7] = (buffer[i]>>0)&0xff;
140
        i++;
141
        if (i == MAX_NR_TIMES) {
142
          i=0;
2198 arune 143
        }
2236 linlun 144
          }
145
        }
146
      }
147
      /* buffers will be filled when sending more than 2-3 messages, so retry until sent */
148
      while (StdCan_Put(&irTxMsg) != StdCan_Ret_OK) {}
149
      _delay_ms(1);
2198 arune 150
    }
151
}
152
#endif
153
 
1922 arune 154
void sns_rfTransceive_Process(void)
155
{
156
#if IR_RX_ENABLE==1
157
        switch (rfRxChannel_state)
158
        {
159
        case sns_rfTransceive_STATE_IDLE:
160
        {
1931 arune 161
            /* If known protocol and timeout is not 0 (0 means burst) */
162
            if (rfRxChannel_proto.protocol != IR_PROTO_UNKNOWN && rfRxChannel_proto.timeout != 0) {
1922 arune 163
                /* Send button release command on CAN */
1996 arune 164
                rfTxMsg.Data[0] = CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_RELEASED;
1922 arune 165
                rfTxMsg.Data[1] = rfRxChannel_proto.protocol;
2040 arune 166
                /* Data content is kept from last transmit (pressed) */
1922 arune 167
 
168
                StdCan_Put(&rfTxMsg);
169
            }
170
            rfRxChannel_state = sns_rfTransceive_STATE_START_RECEIVE;
171
            break;
172
        }
173
 
174
        case sns_rfTransceive_STATE_START_RECEIVE:
175
            cli();
176
            rfRxChannel_newData = FALSE;
177
            sei();
178
            rfRxChannel_state = sns_rfTransceive_STATE_RECEIVING;
179
 
180
            break;
181
 
182
        case sns_rfTransceive_STATE_RECEIVING:
183
            if (rfRxChannel_newData == TRUE) {
184
                cli();
185
                rfRxChannel_newData = FALSE;
186
                sei();
187
                /* Let protocol driver parse and then send on CAN */
2199 arune 188
                uint8_t res2 = parseProtocol(rfRxChannel_buf, rfRxChannel_len, rfRxChannel_index, &rfRxChannel_proto);
2200 arune 189
                if (res2 == IR_OK && rfRxChannel_proto.protocol != IR_PROTO_UNKNOWN)
190
                {
191
//gpio_clr_pin(EXP_B);
2199 arune 192
                    //send_debug(rfRxChannel_buf, rfRxChannel_len);
1931 arune 193
                    /* If timeout is 0, protocol is burst protocol */
194
                    if (rfRxChannel_proto.timeout > 0)
195
                    {
1996 arune 196
                        rfTxMsg.Data[0] = CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED;
1931 arune 197
                        rfRxChannel_state = sns_rfTransceive_STATE_START_PAUSE;
198
                    }
199
                    else
200
                    {
1996 arune 201
                        rfTxMsg.Data[0] = CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_BURST;
1931 arune 202
                        rfRxChannel_state = sns_rfTransceive_STATE_START_RECEIVE;
203
                    }
1922 arune 204
                    rfTxMsg.Data[1] = rfRxChannel_proto.protocol;
205
                    rfTxMsg.Data[2] = (rfRxChannel_proto.data>>40)&0xff;
206
                    rfTxMsg.Data[3] = (rfRxChannel_proto.data>>32)&0xff;
207
                    rfTxMsg.Data[4] = (rfRxChannel_proto.data>>24)&0xff;
208
                    rfTxMsg.Data[5] = (rfRxChannel_proto.data>>16)&0xff;
209
                    rfTxMsg.Data[6] = (rfRxChannel_proto.data>>8)&0xff;
210
                    rfTxMsg.Data[7] = rfRxChannel_proto.data&0xff;
211
 
212
                    StdCan_Put(&rfTxMsg);
213
                }
214
                else if (rfRxChannel_proto.protocol == IR_PROTO_UNKNOWN)
215
                {
216
#if (sns_rfTransceive_SEND_DEBUG==1)
2199 arune 217
                    //send_debug(rfRxChannel_buf, rfRxChannel_len);
1922 arune 218
                    //rfRxChannel_proto.timeout=300;
219
#endif
220
                    rfRxChannel_state = sns_rfTransceive_STATE_START_RECEIVE;
221
                }
2236 linlun 222
#if (sns_rfTransceive_SEND_DEBUG==1)
223
                else if (res2 == IR_SEND_DEBUG)
224
                {
225
                    send_debug(rfRxChannel_buf, rfRxChannel_proto.data & 0xFFu, rfRxChannel_index);
226
                    rfRxChannel_state = sns_rfTransceive_STATE_START_RECEIVE;
227
                }
228
#endif
1922 arune 229
            }
230
            break;
231
 
232
        case sns_rfTransceive_STATE_START_PAUSE:
233
            /* set a timer so we can send release button event when no new RF is arriving */
234
            Timer_SetTimeout(sns_rfTransceive_RX_REPEATE_TIMER, rfRxChannel_proto.timeout, TimerTypeOneShot, 0);
235
            rfRxChannel_state = sns_rfTransceive_STATE_PAUSING;
236
            break;
237
 
238
        case sns_rfTransceive_STATE_PAUSING:
239
            /* reset timer if new IR arrived */
240
            if (rfRxChannel_newData == TRUE) {
241
                cli();
242
                rfRxChannel_newData = FALSE;
243
                sei();
244
 
245
                Ir_Protocol_Data_t  protoDummy;
2199 arune 246
                if (parseProtocol(rfRxChannel_buf, rfRxChannel_len, rfRxChannel_index, &protoDummy) == IR_OK) {
1922 arune 247
                    if (protoDummy.protocol == rfRxChannel_proto.protocol) {
248
                        /* re-set timer so we can send release button event when no new RF is arriving */
249
                        Timer_SetTimeout(sns_rfTransceive_RX_REPEATE_TIMER, rfRxChannel_proto.timeout, TimerTypeOneShot, 0);
250
                    }
251
                }
252
            }
253
 
254
            if (Timer_Expired(sns_rfTransceive_RX_REPEATE_TIMER)) {
255
                rfRxChannel_state = sns_rfTransceive_STATE_IDLE;
256
            }
257
            break;
258
 
259
        default:
260
            break;
261
        }
262
#endif
263
 
1927 arune 264
#if IR_TX_ENABLE==1
265
        switch (rfTxChannel_state)
1922 arune 266
        {
1927 arune 267
        case sns_rfTransceive_STATE_IDLE:
1922 arune 268
        {
269
            /* transmission is started when a command is received on can */
1927 arune 270
            rfTxChannel_stopSend = FALSE;
271
            rfTxChannel_repeatCount = 0;
272
            rfTxChannel_proto.framecnt = 0;
1922 arune 273
            break;
274
        }
275
 
1927 arune 276
        case sns_rfTransceive_STATE_START_TRANSMIT:
1922 arune 277
        {
278
            /* Expand protocol. */
2199 arune 279
            if (expandProtocol(rfTxChannel_buf, &rfTxChannel_len, &rfTxChannel_proto) != IR_OK) {
1922 arune 280
                /* Failed to expand protocol -> enter idle state. */
1927 arune 281
                rfTxChannel_state = sns_rfTransceive_STATE_IDLE;
1922 arune 282
                break;
283
            }
284
 
1927 arune 285
            /* Start RF transmission. */
2199 arune 286
            IrTransceiver_Transmit(0, rfTxChannel_buf, 0, rfTxChannel_len, rfTxChannel_proto.modfreq);
1922 arune 287
 
288
            /* Enter transmitting state. */
1927 arune 289
            rfTxChannel_state = sns_rfTransceive_STATE_TRANSMITTING;
1922 arune 290
            break;
291
        }
292
 
1927 arune 293
        case sns_rfTransceive_STATE_TRANSMITTING:
1922 arune 294
        {
1927 arune 295
            if (rfTxChannel_sendComplete == TRUE)
1922 arune 296
            {
297
                cli();
1927 arune 298
                rfTxChannel_sendComplete = FALSE;
1922 arune 299
                sei();
300
 
1927 arune 301
                rfTxChannel_state = sns_rfTransceive_STATE_START_PAUSE;
1922 arune 302
            }
303
            break;
304
        }
305
 
1927 arune 306
        case sns_rfTransceive_STATE_START_PAUSE:
1922 arune 307
        {
1927 arune 308
            if (rfTxChannel_repeatCount < rfTxChannel_proto.repeats)
1922 arune 309
            {
1927 arune 310
                rfTxChannel_repeatCount++;
1922 arune 311
            }
312
 
1927 arune 313
            Timer_SetTimeout(sns_rfTransceive_TX_REPEATE_TIMER, rfTxChannel_proto.timeout, TimerTypeOneShot, 0);
1922 arune 314
 
1927 arune 315
            if (rfTxChannel_proto.framecnt != 255)
1922 arune 316
            {
1927 arune 317
                rfTxChannel_proto.framecnt++;
1922 arune 318
            }
319
 
1927 arune 320
            rfTxChannel_state = sns_rfTransceive_STATE_PAUSING;
1922 arune 321
            break;
322
        }
323
 
1927 arune 324
        case sns_rfTransceive_STATE_PAUSING:
1922 arune 325
        {
1927 arune 326
            if (Timer_Expired(sns_rfTransceive_TX_REPEATE_TIMER))
1922 arune 327
            {
1927 arune 328
                rfTxChannel_state = sns_rfTransceive_STATE_START_TRANSMIT;
1922 arune 329
            }
330
 
331
            /* Transmission is stopped when such command is recevied on can */
1927 arune 332
            if (rfTxChannel_stopSend == TRUE && rfTxChannel_repeatCount >= rfTxChannel_proto.repeats)
1922 arune 333
            {
1927 arune 334
                rfTxChannel_state = sns_rfTransceive_STATE_IDLE;
1922 arune 335
            }
336
            break;
337
        }
338
        default:
339
            break;
340
        }
341
#endif
342
}
343
 
344
void sns_rfTransceive_HandleMessage(StdCan_Msg_t *rxMsg)
345
{
346
    if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS &&
347
        StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER &&
348
        rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_RFTRANSCEIVE &&
349
        rxMsg->Header.ModuleId == sns_rfTransceive_ID)
350
    {
351
        switch (rxMsg->Header.Command)
352
        {
353
#if IR_TX_ENABLE==1
1996 arune 354
            case CAN_MODULE_CMD_PHYSICAL_IR:
1927 arune 355
            {
2040 arune 356
                if (rfTxChannel_state == sns_rfTransceive_STATE_IDLE &&
1996 arune 357
                    (rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED ||
358
                    rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_BURST))
359
                {
360
                    rfTxChannel_stopSend = (uint8_t)(rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_BURST);
1927 arune 361
 
1996 arune 362
                    rfTxChannel_proto.protocol = rxMsg->Data[1];
363
                    rfTxChannel_proto.data = rxMsg->Data[2];
364
                    rfTxChannel_proto.data = rfTxChannel_proto.data<<8;
365
                    rfTxChannel_proto.data |= rxMsg->Data[3];
366
                    rfTxChannel_proto.data = rfTxChannel_proto.data<<8;
367
                    rfTxChannel_proto.data |= rxMsg->Data[4];
368
                    rfTxChannel_proto.data = rfTxChannel_proto.data<<8;
369
                    rfTxChannel_proto.data |= rxMsg->Data[5];
370
                    rfTxChannel_proto.data = rfTxChannel_proto.data<<8;
371
                    rfTxChannel_proto.data |= rxMsg->Data[6];
372
                    rfTxChannel_proto.data = rfTxChannel_proto.data<<8;
373
                    rfTxChannel_proto.data |= rxMsg->Data[7];
374
 
375
                    rfTxChannel_state = sns_rfTransceive_STATE_START_TRANSMIT;
376
                }
377
                else if (rfTxChannel_state != sns_rfTransceive_STATE_IDLE && rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_RELEASED)
378
                {
379
                    rfTxChannel_stopSend = TRUE;
380
                }
1927 arune 381
            }
1922 arune 382
#endif
383
        }
384
    }
385
}
386
 
387
void sns_rfTransceive_List(uint8_t ModuleSequenceNumber)
388
{
389
    StdCan_Msg_t txMsg;
390
 
391
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS);
392
    StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
393
    txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_RFTRANSCEIVE;
394
    txMsg.Header.ModuleId = sns_rfTransceive_ID;
395
    txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
396
    txMsg.Length = 6;
397
 
1927 arune 398
    uint32_t HwId=BIOS_GetHwId();
399
    txMsg.Data[0] = HwId&0xff;
400
    txMsg.Data[1] = (HwId>>8)&0xff;
401
    txMsg.Data[2] = (HwId>>16)&0xff;
402
    txMsg.Data[3] = (HwId>>24)&0xff;
1922 arune 403
 
404
    txMsg.Data[4] = NUMBER_OF_MODULES;
405
    txMsg.Data[5] = ModuleSequenceNumber;
406
 
407
    while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
408
}