Details | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 275 | johboh | 1 | /********************************************************************* |
| 129 | johboh | 2 | * |
| 3 | * Main application |
||
| 4 | * |
||
| 5 | ********************************************************************* |
||
| 6 | * FileName: $HeadURL: https://svn.auml.se/svn/HomeAutomation/trunk/EmbeddedSoftware/PIC/canTemp/Source/Main.c $ |
||
| 7 | * Last changed: $LastChangedDate: 2007-03-13 18:29:20 +0100 (Tue, 13 Mar 2007) $ |
||
| 8 | * By: $LastChangedBy: johboh $ |
||
| 9 | * Revision: $Revision: 363 $ |
||
| 10 | ********************************************************************/ |
||
| 11 | |||
| 12 | #include <compiler.h> |
||
| 13 | #include <stackTasks.h> |
||
| 14 | #include <Tick.h> |
||
| 15 | #include <funcdefs.h> |
||
| 260 | johboh | 16 | #include <CAN.h> |
| 339 | johboh | 17 | #include "..\canBoot\Include\boot.h" |
| 129 | johboh | 18 | |
| 139 | johboh | 19 | #ifdef USE_ADC |
| 20 | #include <adc.h> |
||
| 21 | #endif |
||
| 22 | |||
| 275 | johboh | 23 | #ifdef USE_BLINDS |
| 24 | #include <blinds.h> |
||
| 25 | #endif |
||
| 26 | |||
| 129 | johboh | 27 | static void mainInit(void); |
| 28 | |||
| 29 | void main() |
||
| 30 | { |
||
| 31 | // Inits |
||
| 32 | mainInit(); |
||
| 275 | johboh | 33 | |
| 260 | johboh | 34 | canInit(); |
| 129 | johboh | 35 | |
| 139 | johboh | 36 | #ifdef USE_ADC |
| 37 | adcInit(TRUE,0b1011); |
||
| 38 | #endif |
||
| 39 | |||
| 275 | johboh | 40 | #ifdef USE_BLINDS |
| 41 | blindsInit(); |
||
| 339 | johboh | 42 | blindsTurn(0); |
| 43 | #else |
||
| 44 | BLINDS0P_IO=0; |
||
| 275 | johboh | 45 | #endif |
| 129 | johboh | 46 | |
| 275 | johboh | 47 | |
| 129 | johboh | 48 | while(1) |
| 49 | { |
||
| 353 | johboh | 50 | TICK currentTick = tickGet(); |
| 51 | |||
| 52 | static TICK tick_led = 0; |
||
| 53 | static TICK tick_temperature = 0; |
||
| 54 | static TICK tick_blinds = 0; |
||
| 55 | |||
| 339 | johboh | 56 | static BOOL getNewTemperature = TRUE; |
| 139 | johboh | 57 | static BYTE lastTemperature = TEMPERATURE_INSIDE; |
| 129 | johboh | 58 | |
| 353 | johboh | 59 | |
| 60 | if ((currentTick-tick_led)>(1*TICK_1S)) |
||
| 129 | johboh | 61 | { |
| 62 | LED0_IO=~LED0_IO; |
||
| 353 | johboh | 63 | tick_led = currentTick; |
| 129 | johboh | 64 | } |
| 139 | johboh | 65 | |
| 339 | johboh | 66 | |
| 277 | johboh | 67 | #ifdef USE_BLINDS |
| 353 | johboh | 68 | if ((currentTick-tick_blinds)>(3*TICK_1S)) |
| 275 | johboh | 69 | { |
| 353 | johboh | 70 | CAN_PACKET outCp; |
| 339 | johboh | 71 | outCp.type=ptPGM; |
| 72 | outCp.pgm.class=pcSENSOR; |
||
| 73 | outCp.pgm.id=pstBLIND_TR; |
||
| 74 | outCp.length=1; |
||
| 75 | outCp.data[0]=blindsGetPrecent(); |
||
| 76 | while(!canSendMessage(outCp,PRIO_HIGH)); |
||
| 353 | johboh | 77 | |
| 78 | tick_blinds = currentTick; |
||
| 275 | johboh | 79 | } |
| 277 | johboh | 80 | #endif |
| 339 | johboh | 81 | |
| 275 | johboh | 82 | |
| 139 | johboh | 83 | #ifdef USE_ADC |
| 353 | johboh | 84 | if ((currentTick-tick_temperature)>(2*TICK_1S) && getNewTemperature==TRUE) // Each 2 second, read temperature. |
| 139 | johboh | 85 | { |
| 86 | if (lastTemperature==TEMPERATURE_INSIDE) lastTemperature=TEMPERATURE_OUTSIDE; else lastTemperature=TEMPERATURE_INSIDE; |
||
| 87 | adcConvert(lastTemperature); |
||
| 339 | johboh | 88 | getNewTemperature=FALSE; |
| 353 | johboh | 89 | tick_temperature = currentTick; |
| 139 | johboh | 90 | } |
| 91 | #endif |
||
| 92 | |||
| 93 | |||
| 94 | #ifdef USE_ADC |
||
| 95 | if (adcDone()) // Has temperature, send it to the bus |
||
| 96 | { |
||
| 353 | johboh | 97 | CAN_PACKET outCp; |
| 139 | johboh | 98 | BYTE decimal; |
| 99 | signed char tenth; |
||
| 353 | johboh | 100 | |
| 139 | johboh | 101 | temperatureRead(&tenth,&decimal); |
| 353 | johboh | 102 | |
| 339 | johboh | 103 | outCp.type=ptPGM; |
| 104 | outCp.pgm.class =pcSENSOR; |
||
| 105 | outCp.pgm.id =(lastTemperature==TEMPERATURE_INSIDE?pstTEMP_INSIDE:pstTEMP_OUTSIDE); |
||
| 106 | outCp.length =2; |
||
| 342 | johboh | 107 | outCp.data[1] = tenth; // signed 10 an 1 decimal. |
| 108 | outCp.data[0] = decimal; // Decimal value, 0-9 |
||
| 109 | while(!canSendMessage(outCp,PRIO_HIGH)); |
||
| 353 | johboh | 110 | |
| 111 | getNewTemperature=TRUE; |
||
| 112 | tick_temperature = currentTick; |
||
| 139 | johboh | 113 | } |
| 114 | #endif |
||
| 353 | johboh | 115 | |
| 116 | } // end while |
||
| 117 | |||
| 118 | } // end main |
||
| 139 | johboh | 119 | |
| 129 | johboh | 120 | |
| 121 | #pragma interrupt high_isr |
||
| 122 | void high_isr(void) |
||
| 123 | { |
||
| 260 | johboh | 124 | canISR(); |
| 353 | johboh | 125 | |
| 126 | #ifdef USE_BLINDS |
||
| 127 | blindsISR(); |
||
| 128 | #endif |
||
| 129 | |||
| 130 | #ifdef USE_ADC |
||
| 131 | adcISR(); |
||
| 132 | #endif |
||
| 129 | johboh | 133 | } |
| 134 | |||
| 135 | |||
| 136 | #pragma interrupt low_isr |
||
| 137 | void low_isr(void) |
||
| 138 | { |
||
| 339 | johboh | 139 | |
| 129 | johboh | 140 | } |
| 141 | |||
| 142 | |||
| 143 | |||
| 144 | /* |
||
| 145 | * Function: mainInit |
||
| 146 | * |
||
| 147 | * Input: none |
||
| 148 | * Output: none |
||
| 149 | * Pre-conditions: none |
||
| 150 | * Affects: Se code |
||
| 151 | * Depends: none. |
||
| 152 | */ |
||
| 153 | void mainInit() |
||
| 154 | { |
||
| 275 | johboh | 155 | LED0_TRIS=0; |
| 156 | BLINDS0_TRIS=0; |
||
| 297 | johboh | 157 | BLINDS0P_TRIS=0; |
| 129 | johboh | 158 | |
| 353 | johboh | 159 | // Enable interrupt prirority |
| 160 | RCONbits.IPEN=1; |
||
| 161 | |||
| 129 | johboh | 162 | // Enable Interrupts |
| 347 | johboh | 163 | INTCONbits.GIEL = 1; |
| 129 | johboh | 164 | INTCONbits.GIEH = 1; |
| 165 | } |
||
| 166 | |||
| 167 | /* |
||
| 168 | * Function: canParse |
||
| 169 | * |
||
| 170 | * Input: Received can message |
||
| 171 | * Output: none |
||
| 172 | * Pre-conditions: canInit and received packet. |
||
| 173 | * Affects: Sensors/actuators/etc. See code. |
||
| 174 | * Depends: none. |
||
| 175 | */ |
||
| 260 | johboh | 176 | |
| 339 | johboh | 177 | void canParse(CAN_PACKET cp) |
| 129 | johboh | 178 | { |
| 339 | johboh | 179 | #ifdef USE_BLINDS |
| 180 | if (cp.pgm.class==pcACTUATOR && cp.pgm.id==patBLIND_TR) |
||
| 181 | { |
||
| 363 | johboh | 182 | if (cp.data[1]==0x1) |
| 183 | { |
||
| 184 | signed char pre = (signed char)blindsGetPrecent()+(signed char)cp.data[0]; |
||
| 185 | blindsTurn((pre<0?0:pre)); |
||
| 186 | } |
||
| 187 | else if (cp.data[1]==0x0) |
||
| 188 | { |
||
| 189 | blindsTurn(cp.data[0]); |
||
| 190 | } |
||
| 339 | johboh | 191 | } |
| 192 | #endif |
||
| 129 | johboh | 193 | } |
| 194 | |||
| 195 | |||
| 196 | // Below are mandantory when using bootloader |
||
| 197 | // define DEBUG_MODE to use without bootloader. |
||
| 198 | |||
| 353 | johboh | 199 | |
| 200 | |||
| 129 | johboh | 201 | #ifndef DEBUG_MODE |
| 202 | extern void _startup (void); |
||
| 339 | johboh | 203 | #pragma code _RESET_INTERRUPT_VECTOR = RM_RESET_VECTOR |
| 129 | johboh | 204 | void _reset (void) |
| 205 | { |
||
| 206 | _asm goto _startup _endasm |
||
| 207 | } |
||
| 208 | #pragma code |
||
| 209 | #endif |
||
| 210 | |||
| 339 | johboh | 211 | #pragma code _HIGH_INTERRUPT_VECTOR = RM_HIGH_INTERRUPT_VECTOR |
| 129 | johboh | 212 | void _high_ISR (void) |
| 213 | { |
||
| 214 | _asm GOTO high_isr _endasm |
||
| 215 | } |
||
| 216 | #pragma code |
||
| 217 | |||
| 339 | johboh | 218 | #pragma code _LOW_INTERRUPT_VECTOR = RM_LOW_INTERRUPT_VECTOR |
| 129 | johboh | 219 | void _low_ISR (void) |
| 220 | { |
||
| 221 | _asm GOTO low_isr _endasm |
||
| 222 | } |
||
| 223 | #pragma code |