Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
25 johboh 1
/*********************************************************************
2
 *
3
 *                  Main application
4
 *
5
 *********************************************************************
6
 * FileName:        Main.c
7
 *
8
 * Author               Date    Comment
9
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10
 * Johan Böhlin     21-10-06    Original        (Rev 1.0)
11
 ********************************************************************/
12
 
24 johboh 13
#include "../Include/compiler.h"
14
#include "../Include/stackTasks.h"
15
#include "../Include/Tick.h"
16
 
17
#ifdef USE_CAN
18
    #include "../Include/CAN.h"
19
#endif
20
 
21
#ifdef USE_UART
22
    #include "../Include/uart.h"
23
#endif
24
 
25
 
26
 
27
static void mainInit(void);
28
 
32 johboh 29
static BOOL heartBeatEnabled = FALSE;
31 johboh 30
 
24 johboh 31
void main()
32
{
33
    static TICK t = 0;
34
 
35
    // Inits
36
 
37
    mainInit();
38
 
39
    #ifdef USE_CAN
40
        canInit();
41
    #endif
42
 
43
    #ifdef USE_UART
44
        uartInit();
45
    #endif
46
 
47
    tickInit();
48
 
49
    while(1)
50
    {
31 johboh 51
        if ((tickGet()-t)>=5*TICK_SECOND && heartBeatEnabled==TRUE)
24 johboh 52
        {
53
            CAN_MESSAGE cm;
54
 
55
            t = tickGet();
56
 
57
            // Send heartbeat
31 johboh 58
            cm.ident=0x00000666;
24 johboh 59
            cm.extended=FALSE;
60
            cm.data_length=1;
61
            cm.data[0]='H';
62
 
63
            while(!canSendMessage(cm));
64
 
65
 
66
        }
67
    }
68
}
69
 
70
 
71
#pragma interruptlow HighISR
72
void HighISR(void)
73
{
74
    #ifdef USE_CAN
75
        canISR();
76
    #endif
77
 
78
    #ifdef USE_UART
79
        uartISR();
80
    #endif
81
 
82
    tickUpdate();
83
}
84
#pragma code highVector=0x08
85
void HighVector (void)
86
{
87
    _asm goto HighISR _endasm
88
}
89
#pragma code // Return to default code section
90
 
91
 
92
 
93
#pragma interruptlow LowISR
94
void LowISR(void)
95
{
96
 
97
}
98
#pragma code lowVector=0x18
99
void LowVector (void)
100
{
101
    _asm goto LowISR _endasm
102
}
103
#pragma code // Return to default code section
104
 
105
 
106
/*
107
*   Function: mainInit
108
*
109
*   Input:  none
110
*   Output: none
111
*   Pre-conditions: none
112
*   Affects: Se code
113
*   Depends: none.
114
*/
115
void mainInit()
116
{
117
    LED0_TRIS=0;   
118
 
119
    // Enable internal PORTB pull-ups
120
    INTCON2bits.RBPU = 0;
121
 
122
    // Enable Interrupts
123
    INTCONbits.GIEH = 1;
124
    INTCONbits.GIEL = 1;
125
 
126
}
127
 
128
/*
129
*   Function: canParse
130
*
131
*   Input:  Received can message
132
*   Output: none
133
*   Pre-conditions: canInit and received packet.
134
*   Affects: Sensors/actuators/etc. See code.
135
*   Depends: none.
136
*/
137
#ifdef USE_CAN
138
void canParse(CAN_MESSAGE cm)
139
{
140
    int i=0;
31 johboh 141
 
142
    uartPutc(UART_START_BYTE);
143
    uartPutc((BYTE)(cm.ident));
24 johboh 144
    uartPutc((BYTE)(cm.ident>>8));
31 johboh 145
    uartPutc((BYTE)(cm.ident>>16));
146
    uartPutc((BYTE)(cm.ident>>24));
147
    uartPutc(cm.extended);
148
    uartPutc(cm.data_length);
149
    for(i=0;i<8;i++) uartPutc(cm.data[cm.data_length-i-1]);
150
    uartPutc(UART_END_BYTE);
24 johboh 151
 
152
}
153
#endif
154
 
155
 
156
/*
157
*   Function: uartParse
158
*
159
*   Input:  Received uart message
160
*   Output: none
161
*   Pre-conditions: uartInit and received byte.
162
*   Affects: Sensors/actuators/etc. See code.
163
*   Depends: none.
164
*/
165
#ifdef USE_UART
166
void uartParse(BYTE c)
167
{
32 johboh 168
    BYTE i;
169
    unsigned int wait = 0;
170
    CAN_MESSAGE cm;
171
    static BOOL waitingMessage = FALSE;
172
    static TICK timeout;
173
    static BYTE count;
24 johboh 174
 
32 johboh 175
    if (waitingMessage==TRUE && (tickGet()-timeout)>TICK_SECOND/20)
24 johboh 176
    {
32 johboh 177
        waitingMessage=FALSE;
26 johboh 178
    }
179
 
32 johboh 180
    if (waitingMessage==TRUE)
26 johboh 181
    {
32 johboh 182
        timeout=tickGet();
24 johboh 183
 
32 johboh 184
        // UART END
185
        if(count>=14)
186
        {
187
            if (c==UART_END_BYTE)
188
            {
189
                while(!canSendMessage(cm));
190
            }
191
            waitingMessage=FALSE;
192
            return;
193
        }
26 johboh 194
 
32 johboh 195
        // data
196
        if(count>=6)
197
        {
198
            cm.data[count-6]=c;
199
            count++;
200
            return;
201
        }
24 johboh 202
 
32 johboh 203
        // data length
204
        if(count>=5)
205
        {
206
            cm.data_length=c;
207
            count++;
208
            return;
209
        }
31 johboh 210
 
32 johboh 211
        // extended
212
        if(count>=4)
213
        {
214
            cm.extended=c;
215
            count++;
216
            return;
217
        }
218
 
219
        // ident
220
        if(count>=0)
221
        {
222
            cm.ident+=((DWORD)c<<(count*8));
223
            count++;
224
            return;
225
        }
226
 
31 johboh 227
    }
228
 
32 johboh 229
 
230
    if (c==UART_START_BYTE && waitingMessage==FALSE)
24 johboh 231
    {
32 johboh 232
            waitingMessage=TRUE;
233
            timeout=tickGet();
234
            count=0;
235
            cm.ident=0;
236
            return;
24 johboh 237
    }
32 johboh 238
 
24 johboh 239
 
32 johboh 240
 
241
/*         
242
            for(i=0;i<4;i++)
243
            {
244
                wait = 0;
245
                while(!uartDataRedy())
246
                {
247
                    if(wait < UART_READ_TIMEOUT) wait++;                
248
                    else return;          
249
                }
250
                cm.ident += uartGet()<<(i*8);
251
            }
252
 
253
 
254
            wait = 0;
255
            while(!uartDataRedy())
256
            {
257
                if(wait < UART_READ_TIMEOUT) wait++ ;                
258
                else return;          
259
            }
260
            cm.extended= uartGet();
261
 
262
 
263
 
264
            wait = 0;
265
            while(!uartDataRedy())
266
            {
267
                if(wait < UART_READ_TIMEOUT) wait++ ;                
268
                else return;          
269
            }
270
            cm.data_length= uartGet();
271
 
272
            for(i=0;i<4;i++)
273
            {
274
                wait = 0;
275
                while(!uartDataRedy())
276
                {
277
                    if(wait < UART_READ_TIMEOUT) wait++ ;                
278
                    else return;          
279
                }
280
                cm.data[i]=uartGet();
281
            }
282
 
283
            wait = 0;
284
            while(!uartDataRedy())
285
            {
286
                if(wait < UART_READ_TIMEOUT) wait++ ;                
287
                else return;          
288
            }
289
            if (uartGet()!=UART_END_BYTE) return;
290
*/
291
            /* 
292
            if (uartGets(&cm.ident,4,UART_READ_TIMEOUT)) return;
293
            if (uartGets(&cm.extended,1,UART_READ_TIMEOUT)) return;
294
            if (uartGets(&cm.data_length,1,UART_READ_TIMEOUT)) return;
295
            if (uartGets(cm.data,8,UART_READ_TIMEOUT)) return;
296
            if (uartGets(&i,1,UART_READ_TIMEOUT)) return;
297
            if (i!=UART_END_BYTE) return;      
298
            */
299
        //  while(!canSendMessage(cm));
300
//  }
301
 
302
 
303
 
304
    if(c=='1' && waitingMessage==FALSE)
305
    {  
306
            cm.ident=0x00000123;
307
            cm.extended=FALSE;
308
            cm.data_length=4;
309
            cm.data[0]='!';
310
            cm.data[1]='j';
311
            cm.data[2]='e';
312
            cm.data[3]='H';
313
 
314
            while(!canSendMessage(cm));
24 johboh 315
    }
316
 
32 johboh 317
    if(c=='2' && waitingMessage==FALSE)  
24 johboh 318
    {
32 johboh 319
            cm.ident=0x0ABCDEF0;
320
            cm.extended=TRUE;
321
            cm.data_length=8;
322
            cm.data[0]='!';
323
            cm.data[1]='g';
324
            cm.data[2]='a';
325
            cm.data[3]='d';
326
            cm.data[4]=' ';
327
            cm.data[5]='d';
328
            cm.data[6]='o';
329
            cm.data[7]='G';
330
 
331
            while(!canSendMessage(cm));
31 johboh 332
    }
333
 
32 johboh 334
    if(c=='3' && waitingMessage==FALSE)
31 johboh 335
    {
32 johboh 336
            cm.ident=0x00000010;
337
            cm.extended=FALSE;
338
            cm.data_length=6;
339
            cm.data[0]='0';
340
            cm.data[1]='1';
341
            cm.data[2]='2';
342
            cm.data[3]='3';
343
            cm.data[4]='4';
344
            cm.data[5]='5';
345
 
346
            while(!canSendMessage(cm));
24 johboh 347
    }
348
 
32 johboh 349
 
350
 
24 johboh 351
}
352
#endif