Rev 246 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 246 | Rev 249 | ||
|---|---|---|---|
| 1 | /** |
1 | /** |
| 2 | * CanBlinds. |
2 | * CanBlinds. |
| 3 | * Takes incomming packages and adjusts PWM output. |
3 | * Takes incomming packages and adjusts PWM output. |
| 4 | * Input: -128 to +127 |
4 | * Input: -128 to +127 |
| 5 | * Position msg: <byte0 BLINDS_CMD> <byte1 position> |
5 | * Position msg: <byte0 BLINDS_CMD> <byte1 position> <byte2 servo number> |
| 6 | * Turning msg: <byte0 START/STOP> <byte 1 direction> |
6 | * Turning msg: <byte0 START/STOP> <byte 1 direction> <byte2 servo number> |
| 7 | * |
7 | * |
| 8 | * @date 2001-01-01 |
8 | * @date 2001-01-01 |
| 9 | * @author Erik Larsson |
9 | * @author Erik Larsson |
| - | 10 | * |
|
| - | 11 | * TODO fixa en ordentlig failsafe som kan bryta matningen till servona |
|
| 10 | */ |
12 | */ |
| 11 | 13 | ||
| 12 | #define DEBUG 0 /* Prints debug messages to uart */ |
- | |
| 13 | #define TWO_BUTTON_MODE 0 /* If using two (or just one but nothing more) auxiliary buttons */ |
14 | #define TWO_BUTTON_MODE 0 /* If using two (or just one but nothing more) auxiliary buttons */ |
| 14 | 15 | ||
| 15 | /*----------------------------------------------------------------------------- |
16 | /*----------------------------------------------------------------------------- |
| 16 | * Includes |
17 | * Includes |
| 17 | *---------------------------------------------------------------------------*/ |
18 | *---------------------------------------------------------------------------*/ |
| 18 | /* system files */ |
19 | /* system files */ |
| 19 | #include <avr/io.h> |
20 | #include <avr/io.h> |
| 20 | #include <avr/interrupt.h> |
21 | #include <avr/interrupt.h> |
| 21 | #include <avr/wdt.h> |
22 | #include <avr/wdt.h> |
| 22 | #include <stdio.h> |
23 | #include <stdio.h> |
| 23 | /* lib files */ |
24 | /* lib files */ |
| 24 | #include <can.h> |
25 | #include <can.h> |
| 25 | #if DEBUG |
- | |
| 26 | #include <serial.h> |
- | |
| 27 | #endif |
- | |
| 28 | #include <timebase.h> |
26 | #include <timebase.h> |
| 29 | 27 | ||
| 30 | #include <tc1047.h> |
28 | #include <tc1047.h> |
| 31 | #include <rc_servo.h> |
29 | #include <rc_servo.h> |
| 32 | 30 | ||
| 33 | /* defines */ |
31 | /* defines */ |
| 34 | #define FAILSAFE_MODE 0x0F |
32 | #define FAILSAFE_MODE 0x0F |
| 35 | #define FAILSAFE_TRESHOLD 60 /* Degrees celcius when nodeBlinds goes into failsafe mode */ |
33 | #define FAILSAFE_TRESHOLD 60 /* Degrees celcius when nodeBlinds goes into failsafe mode */ |
| 36 | 34 | ||
| 37 | #define BLINDS_CMD_GET 0x1300 |
35 | #define BLINDS_CMD_GET 0x1300 |
| 38 | #define BLINDS_CMD_SEND 0x1301 |
36 | #define BLINDS_CMD_SEND 0x1301 |
| 39 | 37 | ||
| 40 | #define BLINDS_CMD_ABS 0x01 /* Absolute position */ |
38 | #define BLINDS_CMD_ABS 0x01 /* Absolute position */ |
| 41 | #define BLINDS_CMD_REL 0x02 /* Relative position */ |
39 | #define BLINDS_CMD_REL 0x02 /* Relative position */ |
| 42 | #define BLINDS_CMD_START 0x03 /* Start turning RC-servo */ |
40 | #define BLINDS_CMD_START 0x03 /* Start turning RC-servo */ |
| 43 | #define BLINDS_CMD_STOP 0x04 /* Stop turning RC-servo */ |
41 | #define BLINDS_CMD_STOP 0x04 /* Stop turning RC-servo */ |
| 44 | #define BLINDS_CMD_RESET 0x05 |
42 | #define BLINDS_CMD_RESET 0x05 |
| 45 | #define BLINDS_CMD_STATUS 0x06 |
43 | #define BLINDS_CMD_STATUS 0x06 |
| 46 | 44 | ||
| 47 | #define BLINDS_TURN_STOP 0x00 |
45 | #define BLINDS_TURN_STOP 0x00 |
| 48 | #define BLINDS_TURN_LEFT 0x01 |
46 | #define BLINDS_TURN_LEFT 0x01 |
| 49 | #define BLINDS_TURN_RIGHT 0x02 |
47 | #define BLINDS_TURN_RIGHT 0x02 |
| 50 | 48 | ||
| 51 | #define STEPS_PER_TURN_PERIOD 10 /* number of steps for each adjustment */ |
49 | #define STEPS_PER_TURN_PERIOD 10 /* number of steps for each adjustment */ |
| 52 | #define TURN_PERIOD 100 /* milliseconds */ |
50 | #define TURN_PERIOD 100 /* milliseconds */ |
| 53 | #define STATUS_SEND_PERIOD 10000 /* milliseconds */ |
51 | #define STATUS_SEND_PERIOD 10000 /* milliseconds */ |
| 54 | #define FAILSAFE_SEND_PERIOD 10000 /* milliseconds */ |
52 | #define FAILSAFE_SEND_PERIOD 10000 /* milliseconds */ |
| 55 | #define BOUNCE_TIME 10 /* milliseconds */ |
53 | #define BOUNCE_TIME 10 /* milliseconds */ |
| 56 | #define BUTTON_ID 0x1202 |
54 | #define BUTTON_ID 0x1202 |
| 57 | #define BUTTON1 1 |
55 | #define BUTTON1 1 |
| 58 | #define BUTTON2 2 |
56 | #define BUTTON2 2 |
| 59 | 57 | ||
| 60 | /*------------------------------------------------------------------------- |
58 | /*------------------------------------------------------------------------- |
| 61 | * Global variables |
59 | * Global variables |
| 62 | * -----------------------------------------------------------------------*/ |
60 | * -----------------------------------------------------------------------*/ |
| 63 | #if TWO_BUTTON_MODE |
61 | #if TWO_BUTTON_MODE |
| 64 | Can_Message_t txMsg_Button; |
62 | Can_Message_t txMsg_Button; |
| 65 | #endif |
63 | #endif |
| 66 | 64 | ||
| 67 | /*---------------------------------------------------------------------------- |
65 | /*---------------------------------------------------------------------------- |
| 68 | * Functions |
66 | * Functions |
| 69 | * -------------------------------------------------------------------------*/ |
67 | * -------------------------------------------------------------------------*/ |
| 70 | void blindsFailsafe(); |
68 | void blindsFailsafe(); |
| 71 | 69 | ||
| 72 | /*---------------------------------------------------------------------------- |
70 | /*---------------------------------------------------------------------------- |
| 73 | * Interrupt routines |
71 | * Interrupt routines |
| 74 | * -------------------------------------------------------------------------*/ |
72 | * -------------------------------------------------------------------------*/ |
| 75 | #if TWO_BUTTON_MODE |
73 | #if TWO_BUTTON_MODE |
| 76 | ISR( PCINT2_vect ) |
74 | ISR( PCINT2_vect ) |
| 77 | { |
75 | { |
| 78 | /* |
76 | /* |
| 79 | * Auxiliary button pressed and released |
77 | * Auxiliary button pressed and released |
| 80 | * Check time between press and release to eliminate bounces |
78 | * Check time between press and release to eliminate bounces |
| 81 | */ |
79 | */ |
| 82 | static uint32_t buttonTime[2]; |
80 | static uint32_t buttonTime[2]; |
| 83 | 81 | ||
| 84 | txMsg_Button.RemoteFlag = 0; |
82 | txMsg_Button.RemoteFlag = 0; |
| 85 | txMsg_Button.ExtendedFlag = 1; |
83 | txMsg_Button.ExtendedFlag = 1; |
| 86 | 84 | ||
| 87 | if( (PIND & (1<<PD6)) == 0){ |
85 | if( (PIND & (1<<PD6)) == 0){ |
| 88 | /* Button pressed */ |
86 | /* Button pressed */ |
| 89 | buttonTime[0] = Timebase_CurrentTime(); |
87 | buttonTime[0] = Timebase_CurrentTime(); |
| 90 | #if DEBUG |
- | |
| 91 | printf("Button 1 pressed\n"); |
- | |
| 92 | #endif |
- | |
| 93 | }else if( (PIND & (1<<PD6)) == 1){ |
88 | }else if( (PIND & (1<<PD6)) == 1){ |
| 94 | if( Timebase_PassedTimeMillis( buttonTime[0] ) >= BOUNCE_TIME ){ |
89 | if( Timebase_PassedTimeMillis( buttonTime[0] ) >= BOUNCE_TIME ){ |
| 95 | /* No bounce, send message */ |
90 | /* No bounce, send message */ |
| 96 | txMsg_Button.Id = BUTTON_ID; |
91 | txMsg_Button.Id = BUTTON_ID; |
| 97 | txMsg_Button.DataLength = 1; |
92 | txMsg_Button.DataLength = 1; |
| 98 | txMsg_Button.Data.bytes[0] = BUTTON1; |
93 | txMsg_Button.Data.bytes[0] = BUTTON1; |
| 99 | #if DEBUG |
- | |
| 100 | printf("Button 1 pressed: message sent\n"); |
- | |
| 101 | #endif |
- | |
| 102 | return; |
94 | return; |
| 103 | }else{ |
95 | }else{ |
| 104 | /* Just bounces, ignore it */ |
96 | /* Just bounces, ignore it */ |
| 105 | #if DEBUG |
- | |
| 106 | printf("Button 1 just bounced\n"); |
- | |
| 107 | #endif |
- | |
| 108 | return; |
97 | return; |
| 109 | } |
98 | } |
| 110 | } |
99 | } |
| 111 | if( (PIND & (1<<PD7)) == 0){ |
100 | if( (PIND & (1<<PD7)) == 0){ |
| 112 | /* Button pressed */ |
101 | /* Button pressed */ |
| 113 | buttonTime[1] = Timebase_CurrentTime(); |
102 | buttonTime[1] = Timebase_CurrentTime(); |
| 114 | #if DEBUG |
- | |
| 115 | printf("Button 2 pressed\n"); |
- | |
| 116 | #endif |
- | |
| 117 | }else if( (PIND & (1<<PD7)) == 1){ |
103 | }else if( (PIND & (1<<PD7)) == 1){ |
| 118 | if( Timebase_PassedTimeMillis( buttonTime[1] ) >= BOUNCE_TIME ){ |
104 | if( Timebase_PassedTimeMillis( buttonTime[1] ) >= BOUNCE_TIME ){ |
| 119 | /* No bounce, send message */ |
105 | /* No bounce, send message */ |
| 120 | txMsg_Button.Id = BUTTON_ID; |
106 | txMsg_Button.Id = BUTTON_ID; |
| 121 | txMsg_Button.DataLength = 1; |
107 | txMsg_Button.DataLength = 1; |
| 122 | txMsg_Button.Data.bytes[0] = BUTTON2; |
108 | txMsg_Button.Data.bytes[0] = BUTTON2; |
| 123 | #if DEBUG |
- | |
| 124 | printf("Button 2 pressed: message sent\n"); |
- | |
| 125 | #endif |
- | |
| 126 | return; |
109 | return; |
| 127 | }else{ |
110 | }else{ |
| 128 | /* Just bounces, ignore it */ |
111 | /* Just bounces, ignore it */ |
| 129 | #if DEBUG |
- | |
| 130 | printf("Button 2 just bounced\n"); |
- | |
| 131 | #endif |
- | |
| 132 | return; |
112 | return; |
| 133 | } |
113 | } |
| 134 | } |
114 | } |
| 135 | } |
115 | } |
| 136 | #endif |
116 | #endif |
| 137 | 117 | ||
| 138 | /*----------------------------------------------------------------------------- |
118 | /*----------------------------------------------------------------------------- |
| 139 | * Main Program |
119 | * Main Program |
| 140 | *---------------------------------------------------------------------------*/ |
120 | *---------------------------------------------------------------------------*/ |
| 141 | int main(void) { |
121 | int main(void) { |
| 142 | 122 | ||
| 143 | uint8_t blindsStatus, /* Position (-128 to 127) */ |
123 | uint8_t blindsStatus, /* Position (-128 to 127) */ |
| - | 124 | servoToTurn, |
|
| 144 | turnDirection = BLINDS_TURN_STOP; /* Specifies direction to turn or stopped */ |
125 | turnDirection = BLINDS_TURN_STOP; /* Specifies direction to turn or stopped */ |
| 145 | uint32_t boardTemperature = 0; |
126 | uint32_t boardTemperature = 0; |
| 146 | uint32_t timeStamp = 0, timeStampTurn = 0; |
127 | uint32_t timeStamp = 0, timeStampTurn = 0; |
| 147 | 128 | ||
| 148 | adcTemperatureInit(); |
129 | adcTemperatureInit(); |
| 149 | Timebase_Init(); |
130 | Timebase_Init(); |
| 150 | rcServoInit(); |
131 | rcServoInit(); |
| 151 | #if DEBUG |
- | |
| 152 | Serial_Init(); |
- | |
| 153 | #endif |
- | |
| 154 | 132 | ||
| 155 | #if TWO_BUTTON_MODE |
133 | #if TWO_BUTTON_MODE |
| 156 | /* |
134 | /* |
| 157 | * Initialize buttons |
135 | * Initialize buttons |
| 158 | * It is possible to use ie. sensors instead |
136 | * It is possible to use ie. sensors instead |
| 159 | * but then change this |
137 | * but then change this |
| 160 | */ |
138 | */ |
| 161 | /* Set as input and enable pull-up */ |
139 | /* Set as input and enable pull-up */ |
| 162 | DDRD &= ~( (1<<DDD6)|(1<<DDD7) ); |
140 | DDRD &= ~( (1<<DDD6)|(1<<DDD7) ); |
| 163 | PORTD |= (1<<PD6)|(1<<PD7); |
141 | PORTD |= (1<<PD6)|(1<<PD7); |
| 164 | 142 | ||
| 165 | /* Enable IO-pin interrupt */ |
143 | /* Enable IO-pin interrupt */ |
| 166 | PCICR |= (1<<PCIE1); |
144 | PCICR |= (1<<PCIE1); |
| 167 | /* Unmask PD6 and PD7 */ |
145 | /* Unmask PD6 and PD7 */ |
| 168 | PCMSK2 |= (1<<PCINT22) | (1<<PCINT23); |
146 | PCMSK2 |= (1<<PCINT22) | (1<<PCINT23); |
| 169 | #endif |
147 | #endif |
| 170 | sei(); |
148 | sei(); |
| 171 | #if DEBUG |
- | |
| 172 | printf("\n------------------------------------------------------------\n"); |
- | |
| 173 | printf( " CAN: Blinds\n"); |
- | |
| 174 | printf( "------------------------------------------------------------\n"); |
- | |
| 175 | - | ||
| 176 | printf("CanInit..."); |
- | |
| 177 | if (Can_Init() != CAN_OK) { |
- | |
| 178 | printf("FAILED!\n"); |
- | |
| 179 | }else{ |
- | |
| 180 | printf("OK!\n"); |
- | |
| 181 | } |
- | |
| 182 | #else |
- | |
| 183 | Can_Init(); |
149 | Can_Init(); |
| 184 | #endif |
- | |
| 185 | 150 | ||
| 186 | Can_Message_t txMsg; |
151 | Can_Message_t txMsg; |
| 187 | Can_Message_t rxMsg; |
152 | Can_Message_t rxMsg; |
| 188 | txMsg.Id = BLINDS_CMD_SEND; |
153 | txMsg.Id = BLINDS_CMD_SEND; |
| 189 | txMsg.RemoteFlag = 0; |
154 | txMsg.RemoteFlag = 0; |
| 190 | txMsg.ExtendedFlag = 1; |
155 | txMsg.ExtendedFlag = 1; |
| 191 | txMsg.DataLength = 3; |
156 | txMsg.DataLength = 3; |
| 192 | 157 | ||
| 193 | /* main loop */ |
158 | /* main loop */ |
| 194 | while (1) { |
159 | while (1) { |
| 195 | /* service the CAN routines */ |
160 | /* service the CAN routines */ |
| 196 | Can_Service(); |
161 | Can_Service(); |
| 197 | 162 | ||
| 198 | /* check if any messages have been received */ |
163 | /* check if any messages have been received */ |
| 199 | while (Can_Receive(&rxMsg) == CAN_OK) { |
164 | while (Can_Receive(&rxMsg) == CAN_OK) { |
| 200 | /* This node that control a servo is adressed */ |
165 | /* This node that control a servo is adressed */ |
| 201 | if( rxMsg.Id == BLINDS_CMD_GET ){ |
166 | if( rxMsg.Id == BLINDS_CMD_GET ){ |
| 202 | 167 | ||
| 203 | if( rxMsg.Data.bytes[0] == BLINDS_CMD_ABS ){ |
168 | if( rxMsg.Data.bytes[0] == BLINDS_CMD_ABS ){ |
| 204 | /* Set absolute position to servo */ |
169 | /* Set absolute position to servo */ |
| 205 | setPosition( rxMsg.Data.bytes[1] ); |
170 | setPosition( rxMsg.Data.bytes[1], rxMsg.Data.bytes[2] ); |
| 206 | 171 | ||
| 207 | }else if(rxMsg.Data.bytes[0] == BLINDS_CMD_REL){ |
172 | }else if(rxMsg.Data.bytes[0] == BLINDS_CMD_REL){ |
| 208 | /* Set relative position to servo */ |
173 | /* Set relative position to servo */ |
| 209 | alterPosition( rxMsg.Data.bytes[1] ); |
174 | alterPosition( rxMsg.Data.bytes[1], rxMsg.Data.bytes[2] ); |
| 210 | 175 | ||
| 211 | }else if(rxMsg.Data.bytes[0] == BLINDS_CMD_START ){ |
176 | }else if(rxMsg.Data.bytes[0] == BLINDS_CMD_START ){ |
| 212 | /* Start turning the servo */ |
177 | /* Start turning the servo */ |
| 213 | turnDirection = rxMsg.Data.bytes[1]; |
178 | turnDirection = rxMsg.Data.bytes[1]; |
| - | 179 | servoToTurn = rxMsg.Data.bytes[2]; |
|
| 214 | 180 | ||
| 215 | }else if(rxMsg.Data.bytes[0] == BLINDS_CMD_STOP ){ |
181 | }else if(rxMsg.Data.bytes[0] == BLINDS_CMD_STOP ){ |
| 216 | /* Stop turning */ |
182 | /* Stop turning */ |
| 217 | turnDirection = BLINDS_TURN_STOP; |
183 | turnDirection = BLINDS_TURN_STOP; |
| 218 | 184 | ||
| 219 | }else if(rxMsg.Data.bytes[0] == BLINDS_CMD_STATUS){ |
185 | }else if(rxMsg.Data.bytes[0] == BLINDS_CMD_STATUS){ |
| 220 | /* Send blinds status to CAN */ |
186 | /* Send blinds status to CAN */ |
| 221 | boardTemperature = getTC1047temperature(); |
187 | boardTemperature = getTC1047temperature(); |
| 222 | 188 | ||
| 223 | if( (int32_t)boardTemperature >= FAILSAFE_TRESHOLD ){ |
189 | if( (int32_t)boardTemperature >= FAILSAFE_TRESHOLD ){ |
| 224 | blindsFailsafe(); |
190 | blindsFailsafe(); |
| 225 | }else{ |
191 | }else{ |
| 226 | txMsg.Data.bytes[0] = boardTemperature & 0x00FF; |
192 | txMsg.Data.bytes[0] = boardTemperature & 0x00FF; |
| 227 | txMsg.Data.bytes[1] = (boardTemperature & 0xFF00)>>8; |
193 | txMsg.Data.bytes[1] = (boardTemperature & 0xFF00)>>8; |
| - | 194 | txMsg.Data.bytes[2] = 0x00; |
|
| - | 195 | #if NUMBER_OF_RCS >0 |
|
| 228 | txMsg.Data.bytes[ |
196 | txMsg.Data.bytes[3] = getPosition(1); |
| - | 197 | #endif |
|
| - | 198 | #if NUMBER_OF_RCS >1 |
|
| - | 199 | txMsg.Data.bytes[4] = getPosition(2); |
|
| - | 200 | #endif |
|
| - | 201 | #if NUMBER_OF_RCS >2 |
|
| - | 202 | txMsg.Data.bytes[5] = getPosition(3); |
|
| 229 | 203 | #endif |
|
| - | 204 | txMsg.DataLength = NUMBER_OF_RCS+3; |
|
| 230 | Can_Send( &txMsg ); |
205 | Can_Send( &txMsg ); |
| 231 | } |
206 | } |
| 232 | } |
207 | } |
| 233 | } |
208 | } |
| 234 | } |
209 | } |
| 235 | 210 | ||
| 236 | if( Timebase_PassedTimeMillis(timeStamp) >= STATUS_SEND_PERIOD ){ |
211 | if( Timebase_PassedTimeMillis(timeStamp) >= STATUS_SEND_PERIOD ){ |
| 237 | timeStamp = Timebase_CurrentTime(); |
212 | timeStamp = Timebase_CurrentTime(); |
| 238 | /* Send blinds status to CAN */ |
213 | /* Send blinds status to CAN */ |
| 239 | 214 | ||
| 240 | boardTemperature = getTC1047temperature(); |
215 | boardTemperature = getTC1047temperature(); |
| 241 | 216 | ||
| 242 | if( (int32_t)boardTemperature >= FAILSAFE_TRESHOLD ){ |
217 | if( (int32_t)boardTemperature >= FAILSAFE_TRESHOLD ){ |
| 243 | blindsFailsafe(); |
218 | blindsFailsafe(); |
| 244 | }else{ |
219 | }else{ |
| 245 | txMsg.Data.bytes[0] = boardTemperature & 0x00FF; |
220 | txMsg.Data.bytes[0] = boardTemperature & 0x00FF; |
| 246 | txMsg.Data.bytes[1] = (boardTemperature & 0xFF00)>>8; |
221 | txMsg.Data.bytes[1] = (boardTemperature & 0xFF00)>>8; |
| 247 | txMsg.Data.bytes[2] = |
222 | txMsg.Data.bytes[2] = 0x00; |
| 248 | - | ||
| 249 | Can_Send( &txMsg ); |
- | |
| 250 | #if |
223 | #if NUMBER_OF_RCS >0 |
| 251 |
|
224 | txMsg.Data.bytes[3] = getPosition(1); |
| 252 | printf("Temperature: %d\nBlinds status: %u\n", boardTemperature, getPosition()); |
- | |
| 253 | #endif |
225 | #endif |
| - | 226 | #if NUMBER_OF_RCS >1 |
|
| - | 227 | txMsg.Data.bytes[4] = getPosition(2); |
|
| - | 228 | #endif |
|
| - | 229 | #if NUMBER_OF_RCS >2 |
|
| - | 230 | txMsg.Data.bytes[5] = getPosition(3); |
|
| - | 231 | #endif |
|
| - | 232 | txMsg.DataLength = NUMBER_OF_RCS+3; |
|
| - | 233 | ||
| - | 234 | Can_Send( &txMsg ); |
|
| 254 | } |
235 | } |
| 255 | } |
236 | } |
| 256 | /* If start turning servo */ |
237 | /* If start turning servo */ |
| 257 | if( turnDirection ){ |
238 | if( turnDirection ){ |
| 258 | if( Timebase_PassedTimeMillis( timeStampTurn ) >= TURN_PERIOD ){ |
239 | if( Timebase_PassedTimeMillis( timeStampTurn ) >= TURN_PERIOD ){ |
| 259 | timeStampTurn = Timebase_CurrentTime(); |
240 | timeStampTurn = Timebase_CurrentTime(); |
| 260 | /* Clockwise or counterclockwise? */ |
241 | /* Clockwise or counterclockwise? */ |
| 261 | if( turnDirection == BLINDS_TURN_LEFT ){ |
242 | if( turnDirection == BLINDS_TURN_LEFT ){ |
| 262 | alterPosition( -STEPS_PER_TURN_PERIOD ); |
243 | alterPosition( -STEPS_PER_TURN_PERIOD , servoToTurn); |
| 263 | }else if( turnDirection == BLINDS_TURN_RIGHT ){ |
244 | }else if( turnDirection == BLINDS_TURN_RIGHT ){ |
| 264 | alterPosition( STEPS_PER_TURN_PERIOD ); |
245 | alterPosition( STEPS_PER_TURN_PERIOD , servoToTurn); |
| 265 | } |
246 | } |
| 266 | } |
247 | } |
| 267 | } |
248 | } |
| 268 | } |
249 | } |
| 269 | return 0; |
250 | return 0; |
| 270 | } |
251 | } |
| 271 | 252 | ||
| 272 | void blindsFailsafe() // TODO fixa failsafe, vad ska hända med PWM? |
253 | void blindsFailsafe() // TODO fixa failsafe, vad ska hända med PWM? |
| 273 | { |
254 | { |
| 274 | uint8_t relayStatus; |
255 | uint8_t relayStatus; |
| 275 | uint32_t boardTemperature = 0, timeStamp = 0; |
256 | uint32_t boardTemperature = 0, timeStamp = 0; |
| 276 | 257 | ||
| 277 | Can_Message_t txMsg; |
258 | Can_Message_t txMsg; |
| 278 | Can_Message_t rxMsg; |
259 | Can_Message_t rxMsg; |
| 279 | txMsg.Id = BLINDS_CMD_SEND; |
260 | txMsg.Id = BLINDS_CMD_SEND; |
| 280 | txMsg.RemoteFlag = 0; |
261 | txMsg.RemoteFlag = 0; |
| 281 | txMsg.ExtendedFlag = 1; |
262 | txMsg.ExtendedFlag = 1; |
| 282 | txMsg.DataLength = 4; |
263 | txMsg.DataLength = 4; |
| 283 | 264 | ||
| 284 | while(1){ |
265 | while(1){ |
| 285 | /* service the CAN routines */ |
266 | /* service the CAN routines */ |
| 286 | Can_Service(); |
267 | Can_Service(); |
| 287 | 268 | ||
| 288 | /* check if any messages have been received */ |
269 | /* check if any messages have been received */ |
| 289 | while (Can_Receive(&rxMsg) == CAN_OK) { |
270 | while (Can_Receive(&rxMsg) == CAN_OK) { |
| 290 | /* This relay is adressed*/ |
271 | /* This relay is adressed*/ |
| 291 | if( rxMsg.Id == BLINDS_CMD_GET ){ |
272 | if( rxMsg.Id == BLINDS_CMD_GET ){ |
| 292 | if( rxMsg.Data.bytes[0] == BLINDS_CMD_RESET ){ |
273 | if( rxMsg.Data.bytes[0] == BLINDS_CMD_RESET ){ |
| 293 | /* Return from failsafe mode */ |
274 | /* Return from failsafe mode */ |
| 294 | return; |
275 | return; |
| 295 | } |
276 | } |
| 296 | } |
277 | } |
| 297 | } |
278 | } |
| 298 | 279 | ||
| 299 | if( Timebase_PassedTimeMillis(timeStamp) >= FAILSAFE_SEND_PERIOD ){ |
280 | if( Timebase_PassedTimeMillis(timeStamp) >= FAILSAFE_SEND_PERIOD ){ |
| 300 | timeStamp = Timebase_CurrentTime(); |
281 | timeStamp = Timebase_CurrentTime(); |
| 301 | /* Send relay status to CAN */ |
282 | /* Send relay status to CAN */ |
| 302 | #if DEBUG |
- | |
| 303 | printf("Failsafe mode!\n"); |
- | |
| 304 | #endif |
- | |
| 305 | boardTemperature = getTC1047temperature(); |
283 | boardTemperature = getTC1047temperature(); |
| 306 | 284 | ||
| 307 | txMsg.Data.bytes[0] = boardTemperature & 0x00FF; |
285 | txMsg.Data.bytes[0] = boardTemperature & 0x00FF; |
| 308 | txMsg.Data.bytes[1] = (boardTemperature & 0xFF00)>>8; |
286 | txMsg.Data.bytes[1] = (boardTemperature & 0xFF00)>>8; |
| - | 287 | txMsg.Data.bytes[2] = FAILSAFE_MODE; |
|
| - | 288 | #if NUMBER_OF_RCS >0 |
|
| 309 | txMsg.Data.bytes[ |
289 | txMsg.Data.bytes[3] = getPosition(1); |
| - | 290 | #endif |
|
| - | 291 | #if NUMBER_OF_RCS >1 |
|
| - | 292 | txMsg.Data.bytes[4] = getPosition(2); |
|
| - | 293 | #endif |
|
| - | 294 | #if NUMBER_OF_RCS >2 |
|
| 310 | txMsg.Data.bytes[ |
295 | txMsg.Data.bytes[5] = getPosition(3); |
| - | 296 | #endif |
|
| - | 297 | txMsg.DataLength = NUMBER_OF_RCS+3; |
|
| 311 | 298 | ||
| 312 | Can_Send( &txMsg ); |
299 | Can_Send( &txMsg ); |
| 313 | } |
300 | } |
| 314 | } |
301 | } |
| 315 | } |
302 | } |
| 316 | 303 | ||
| 317 | 304 | ||