Subversion Repositories HomeAutomation

Rev

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