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>> |
127 | for (uint8_t i = 0; i < len>>3; i++) { |
| 129 | uint8_t index = i<< |
128 | uint8_t index = i<<3; |
| 130 | 129 | ||
| 131 | msg.Data[0] = ((buffer[index]/divider)>>8)&0xff; |
- | |
| 132 |
|
130 | for (uint8_t j = 0; j < 8; j += 2) |
| - | 131 | { |
|
| 133 | msg.Data |
132 | msg.Data[j] = (buffer[index+j]/divider)&0xff; |
| 134 | msg.Data |
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+= |
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) |