Subversion Repositories HomeAutomation

Rev

Rev 1810 | Rev 1812 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 1810 Rev 1811
Line 45... Line 45...
45
#endif
45
#endif
46
 
46
 
47
uint16_t    buf[IR_SUPPORTED_NUM_CHANNELS][MAX_NR_TIMES];
47
uint16_t    buf[IR_SUPPORTED_NUM_CHANNELS][MAX_NR_TIMES];
48
 
48
 
49
StdCan_Msg_t        irTxMsg;
49
StdCan_Msg_t        irTxMsg;
50
 
-
 
51
#ifndef sns_irTransceive_PRONTO_SUPPORT
-
 
52
#define sns_irTransceive_PRONTO_SUPPORT 1
-
 
53
#endif
-
 
54
 
50
 
55
#if (sns_irTransceive_SEND_DEBUG==1)
51
#if (sns_irTransceive_SEND_DEBUG==1)
56
void send_debug(uint16_t *buffer, uint8_t len) {
52
void send_debug(uint16_t *buffer, uint8_t len) {
57
    StdCan_Msg_t dbgIrTxMsg;
53
    StdCan_Msg_t dbgIrTxMsg;
58
    /* the protocol is unknown so the raw ir-data is sent, makes it easier to develop a new protocol */
54
    /* the protocol is unknown so the raw ir-data is sent, makes it easier to develop a new protocol */
Line 61... Line 57...
61
    StdCan_Set_direction(dbgIrTxMsg.Header, DIRECTIONFLAG_FROM_OWNER);
57
    StdCan_Set_direction(dbgIrTxMsg.Header, DIRECTIONFLAG_FROM_OWNER);
62
    dbgIrTxMsg.Length = 8;
58
    dbgIrTxMsg.Length = 8;
63
    dbgIrTxMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_IRTRANSCEIVE;
59
    dbgIrTxMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_IRTRANSCEIVE;
64
    dbgIrTxMsg.Header.ModuleId = sns_irTransceive_ID;
60
    dbgIrTxMsg.Header.ModuleId = sns_irTransceive_ID;
65
    dbgIrTxMsg.Header.Command = CAN_MODULE_CMD_IRTRANSCEIVE_IRRAW;
61
    dbgIrTxMsg.Header.Command = CAN_MODULE_CMD_IRTRANSCEIVE_IRRAW;
66
    for (uint8_t i = 0; i < len>>2; i++) {
62
    for (uint8_t i = 0; i < len>>2; i++) {
67
        uint8_t index = i<<2;
63
        uint8_t index = i<<2;
68
 
64
 
69
        dbgIrTxMsg.Data[0] = (buffer[index]>>8)&0xff;
65
        dbgIrTxMsg.Data[0] = (buffer[index]>>8)&0xff;
70
        dbgIrTxMsg.Data[1] = (buffer[index]>>0)&0xff;
66
        dbgIrTxMsg.Data[1] = (buffer[index]>>0)&0xff;
71
        dbgIrTxMsg.Data[2] = (buffer[index+1]>>8)&0xff;
67
        dbgIrTxMsg.Data[2] = (buffer[index+1]>>8)&0xff;
72
        dbgIrTxMsg.Data[3] = (buffer[index+1]>>0)&0xff;
68
        dbgIrTxMsg.Data[3] = (buffer[index+1]>>0)&0xff;
73
        dbgIrTxMsg.Data[4] = (buffer[index+2]>>8)&0xff;
69
        dbgIrTxMsg.Data[4] = (buffer[index+2]>>8)&0xff;
74
        dbgIrTxMsg.Data[5] = (buffer[index+2]>>0)&0xff;
70
        dbgIrTxMsg.Data[5] = (buffer[index+2]>>0)&0xff;
75
        dbgIrTxMsg.Data[6] = (buffer[index+3]>>8)&0xff;
71
        dbgIrTxMsg.Data[6] = (buffer[index+3]>>8)&0xff;
76
        dbgIrTxMsg.Data[7] = (buffer[index+3]>>0)&0xff;
72
        dbgIrTxMsg.Data[7] = (buffer[index+3]>>0)&0xff;
77
               
73
               
78
        /* buffers will be filled when sending more than 2-3 messages, so retry until sent */
74
        /* buffers will be filled when sending more than 2-3 messages, so retry until sent */
79
        while (StdCan_Put(&dbgIrTxMsg) != StdCan_Ret_OK) {}
75
        while (StdCan_Put(&dbgIrTxMsg) != StdCan_Ret_OK) {}
80
        _delay_ms(1);
76
        _delay_ms(1);
81
    }
77
    }
82
   
78
   
83
    uint8_t lastpacketcnt = len&0x03;
79
    uint8_t lastpacketcnt = len&0x03;
84
    if (lastpacketcnt > 0) {
80
    if (lastpacketcnt > 0) {
85
        dbgIrTxMsg.Length = lastpacketcnt<<1;
81
        dbgIrTxMsg.Length = lastpacketcnt<<1;
86
        for (uint8_t i = 0; i < lastpacketcnt; i++) {
82
        for (uint8_t i = 0; i < lastpacketcnt; i++) {
87
            dbgIrTxMsg.Data[i<<1] = (buffer[(len&0xfc)|i]>>8)&0xff;
83
            dbgIrTxMsg.Data[i<<1] = (buffer[(len&0xfc)|i]>>8)&0xff;
88
            dbgIrTxMsg.Data[(i<<1)+1] = (buffer[(len&0xfc)|i]>>0)&0xff;
84
            dbgIrTxMsg.Data[(i<<1)+1] = (buffer[(len&0xfc)|i]>>0)&0xff;
89
        }
85
        }
90
        /* buffers will be filled when sending more than 2-3 messages, so retry until sent */
86
        /* buffers will be filled when sending more than 2-3 messages, so retry until sent */
91
        while (StdCan_Put(&dbgIrTxMsg) != StdCan_Ret_OK) {}
87
        while (StdCan_Put(&dbgIrTxMsg) != StdCan_Ret_OK) {}
92
        _delay_ms(1);
88
        _delay_ms(1);
93
    }
89
    }
94
 
90
 
95
}
91
}
-
 
92
#endif
-
 
93
 
-
 
94
#ifndef sns_irTransceive_PRONTO_SUPPORT
-
 
95
#define sns_irTransceive_PRONTO_SUPPORT 0
-
 
96
#endif
-
 
97
 
96
#if sns_irTransceive_PRONTO_SUPPORT==1
98
#if sns_irTransceive_PRONTO_SUPPORT==1
97
 
-
 
-
 
99
#define BaseFrq (4145146ULL)
98
/* TODO configurable divider parameter */
100
/* TODO configurable divider parameter */
99
#define BaseFrq (4145146ULL)
-
 
100
#define wFrqDiv (0x6d)
101
#define wFrqDiv (0x6d)
101
#define divider (1000000ULL*wFrqDiv/BaseFrq)
102
#define divider (1000000ULL*wFrqDiv/BaseFrq)
102
 
103
 
103
void send_pronto(uint16_t *buffer, uint8_t len) {
104
void send_pronto(uint16_t *buffer, uint8_t len) {
104
    StdCan_Msg_t msg;
105
    StdCan_Msg_t msg;
Line 113... Line 114...
113
    msg.Data[0] = 0x00; /* Prontoformat 0x0000 */
114
    msg.Data[0] = 0x00; /* Prontoformat 0x0000 */
114
    msg.Data[1] = 0x00;
115
    msg.Data[1] = 0x00;
115
    msg.Data[2] = 0x00; /* Freq divider, 38kHz => 0x006d TODO: configurable */
116
    msg.Data[2] = 0x00; /* Freq divider, 38kHz => 0x006d TODO: configurable */
116
    msg.Data[3] = wFrqDiv;
117
    msg.Data[3] = wFrqDiv;
117
    msg.Data[4] = 0x00; /* Once seq length, first byte always 0 */
118
    msg.Data[4] = 0x00; /* Once seq length, first byte always 0 */
118
    msg.Data[5] = len/2;
119
    msg.Data[5] = len/2; /* TODO not correct if any byte overflows */
119
    msg.Data[6] = 0x00; /* Repeat seq length, always 0 for ir receive */
120
    msg.Data[6] = 0x00; /* Repeat seq length, always 0 for ir receive */
120
    msg.Data[7] = 0x00;
121
    msg.Data[7] = 0x00;
121
   
122
   
122
    while (StdCan_Put(&msg) != StdCan_Ret_OK) {}
123
    while (StdCan_Put(&msg) != StdCan_Ret_OK) {}
123
    _delay_ms(1);
124
    _delay_ms(1);
124
   
-
 
125
    /* TODO Add more prontodata commands -> 32 */
-
 
126
   
125
   
127
    msg.Header.Command = CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA1;
126
    msg.Header.Command = CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA1;
128
    for (uint8_t i = 0; i < len>>2; i++) {
127
    for (uint8_t i = 0; i < len>>3; i++) {
129
        uint8_t index = i<<2;
128
        uint8_t index = i<<3;
130
 
129
 
131
        msg.Data[0] = ((buffer[index]/divider)>>8)&0xff;
-
 
132
        msg.Data[1] = ((buffer[index]/divider)>>0)&0xff;
130
        for (uint8_t j = 0; j < 8; j += 2)
-
 
131
        {
133
        msg.Data[2] = ((buffer[index+1]/divider)>>8)&0xff;
132
            msg.Data[j] = (buffer[index+j]/divider)&0xff;
134
        msg.Data[3] = ((buffer[index+1]/divider)>>0)&0xff;
133
            msg.Data[j+1] = (buffer[index+j+1]/divider)&0xff;
135
        msg.Data[4] = ((buffer[index+2]/divider)>>8)&0xff;
-
 
136
        msg.Data[5] = ((buffer[index+2]/divider)>>0)&0xff;
-
 
137
        msg.Data[6] = ((buffer[index+3]/divider)>>8)&0xff;
-
 
138
        msg.Data[7] = ((buffer[index+3]/divider)>>0)&0xff;
-
 
-
 
134
        }
139
               
135
 
140
        /* buffers will be filled when sending more than 2-3 messages, so retry until sent */
136
        /* buffers will be filled when sending more than 2-3 messages, so retry until sent */
141
        while (StdCan_Put(&msg) != StdCan_Ret_OK) {}
137
        while (StdCan_Put(&msg) != StdCan_Ret_OK) {}
142
        _delay_ms(1);
138
        _delay_ms(1);
143
       
139
       
144
        msg.Header.Command++;
140
        msg.Header.Command++;
145
    }
141
    }
146
   
142
   
147
    uint8_t lastpacketcnt = len&0x03;
143
    uint8_t lastpacketcnt = len&0x03;
148
    /* msg command kept from for loop, but increase 16 */
144
    /* msg command kept from for loop, but increase 16 */
149
    msg.Header.Command+=32;
145
    msg.Header.Command+=16;
150
    msg.Length = lastpacketcnt<<1;
146
    msg.Length = lastpacketcnt<<1;
151
    for (uint8_t i = 0; i < lastpacketcnt; i++) {
147
    for (uint8_t i = 0; i < lastpacketcnt; i++) {
152
        msg.Data[i<<1] = ((buffer[(len&0xfc)|i]/divider)>>8)&0xff;
148
        msg.Data[i<<1] = ((buffer[(len&0xfc)|i]/divider)>>8)&0xff;
153
        msg.Data[(i<<1)+1] = ((buffer[(len&0xfc)|i]/divider)>>0)&0xff;
149
        msg.Data[(i<<1)+1] = ((buffer[(len&0xfc)|i]/divider)>>0)&0xff;
154
    }
150
    }
155
    /* buffers will be filled when sending more than 2-3 messages, so retry until sent */
151
    /* buffers will be filled when sending more than 2-3 messages, so retry until sent */
156
    while (StdCan_Put(&msg) != StdCan_Ret_OK) {}
152
    while (StdCan_Put(&msg) != StdCan_Ret_OK) {}
157
    _delay_ms(1);
153
    _delay_ms(1);
158
}
154
}
159
#endif
-
 
160
#endif
155
#endif
161
 
156
 
162
 
157
 
163
#if IR_RX_ENABLE==1
158
#if IR_RX_ENABLE==1
164
void sns_irTransceive_RX_done_callback(uint8_t channel, uint16_t *buffer, uint8_t len)
159
void sns_irTransceive_RX_done_callback(uint8_t channel, uint16_t *buffer, uint8_t len)