Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
140 johboh 1
/*********************************************************************
129 johboh 2
 *
3
 *                  Main application
4
 *
5
 *********************************************************************
6
 * FileName:        $HeadURL: https://svn.auml.se/svn/HomeAutomation/trunk/EmbeddedSoftware/PIC/canLCD/Source/Main.c $
7
 * Last changed:    $LastChangedDate: 2006-11-21 10:28:39 +0100 (Tue, 21 Nov 2006) $
8
 * By:              $LastChangedBy: johboh $
9
 * Revision:        $Revision: 140 $
10
 ********************************************************************/
11
 
12
 
13
#include <compiler.h>
14
#include <stackTasks.h>
15
#include <Tick.h>
16
#include <funcdefs.h>
17
#include <EEaccess.h>
18
 
140 johboh 19
#ifdef USE_LCD
20
    #include "lcd.h"
21
#endif
22
 
129 johboh 23
#ifdef USE_CAN
24
    #include <CAN.h>
25
#endif
26
 
27
static void mainInit(void);
28
 
29
 
30
static int MY_ID = DEFAULT_ID;
31
static BYTE MY_NID = DEFAULT_NID;
32
 
33
void main()
34
{
35
    static TICK t = 0;
36
    CAN_MESSAGE outCm;
37
 
38
    // Inits
39
 
40
    mainInit();
41
 
42
    #ifdef USE_CAN
43
        canInit();
44
    #endif
45
 
140 johboh 46
    #ifdef USE_LCD
47
        lcdInit();
48
        lcdClear();
49
        lcdPutrs("Welcome!");
50
    #endif
51
 
129 johboh 52
    tickInit();
53
 
54
    // Read ID and NID if exist.
55
    if (EERead(NODE_ID_EE)==NODE_HAS_ID)
56
    {
57
        MY_ID=(((WORD)EERead(NODE_ID_EE + 1))<<8)+EERead(NODE_ID_EE + 2);
58
        MY_NID=EERead(NODE_ID_EE + 3);
59
    }
60
 
61
    // Send user program startup heatbeat
62
    outCm.funct                     = FUNCT_BOOTLOADER;
63
    outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
64
    outCm.nid                       = MY_NID;
65
    outCm.sid                       = MY_ID;
66
    outCm.data_length               = 1;
67
    outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_USER_STARTUP;
68
    while(!canSendMessage(outCm,PRIO_HIGH));
69
 
70
 
71
    while(1)
72
    {
73
        static TICK t = 0;
74
        static TICK heartbeat = 0;
75
 
76
 
77
        if ((tickGet()-heartbeat)>TICK_SECOND*5)
78
        {
79
            // Send alive heartbeat
80
            outCm.funct                     = FUNCT_BOOTLOADER;
81
            outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
82
            outCm.nid                       = MY_NID;
83
            outCm.sid                       = MY_ID;
84
            outCm.data_length               = 1;
85
            outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_ALIVE;
86
            while(!canSendMessage(outCm,PRIO_HIGH));
87
 
88
            heartbeat = tickGet();
89
        }
90
        if ((tickGet()-t)>TICK_SECOND)
91
        {
92
            LED0_IO=~LED0_IO;
93
            t = tickGet();
94
        }
95
    }
96
}
97
 
98
 
99
#pragma interrupt high_isr
100
void high_isr(void)
101
{
102
    ClrWdt();
103
 
104
    #ifdef USE_CAN
105
        canISR();
106
    #endif
107
 
108
    tickUpdate();
109
 
110
}
111
 
112
 
113
#pragma interrupt low_isr
114
void low_isr(void)
115
{
116
 
117
}
118
 
119
 
120
 
121
/*
122
*   Function: mainInit
123
*
124
*   Input:  none
125
*   Output: none
126
*   Pre-conditions: none
127
*   Affects: Se code
128
*   Depends: none.
129
*/
130
void mainInit()
131
{
132
    LED0_TRIS=0;   
133
 
134
    // Enable Interrupts
135
    INTCONbits.GIEH = 1;
136
    INTCONbits.GIEL = 1;
137
 
138
    // Enable interrupt prirority
139
    RCONbits.IPEN=1;
140
 
141
 
142
}
143
 
144
/*
145
*   Function: canParse
146
*
147
*   Input:  Received can message
148
*   Output: none
149
*   Pre-conditions: canInit and received packet.
150
*   Affects: Sensors/actuators/etc. See code.
151
*   Depends: none.
152
*/
153
#ifdef USE_CAN
154
void canParse(CAN_MESSAGE cm)
155
{
156
    CAN_MESSAGE outCm;
157
 
158
    ClrWdt();
159
 
160
    switch(cm.funct)
161
    {
162
        case FUNCT_BOOTLOADER:
163
            if (cm.nid==MY_NID && ((((unsigned int)cm.data[BOOT_DATA_RID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_RID_LOW_INDEX])==MY_ID)
164
            {
165
                switch(cm.funcc)
166
                {
167
                    case FUNCC_BOOT_INIT: Reset(); break; //User whant to program me, reset me.
168
                    case FUNCC_BOOT_SET_ID:
169
                        // Change my ID and NID
170
                        MY_ID=(((WORD)cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_NEW_ID_LOW_INDEX];
171
                        MY_NID=cm.data[BOOT_DATA_NEW_NID_INDEX];
172
                        EEWrite(NODE_ID_EE+1,cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX]);
173
                        EEWrite(NODE_ID_EE+2,cm.data[BOOT_DATA_NEW_ID_LOW_INDEX]);
174
                        EEWrite(NODE_ID_EE+3,cm.data[BOOT_DATA_NEW_NID_INDEX]);
175
                        EEWrite(NODE_ID_EE,NODE_HAS_ID);
176
                        // Send ack with new id.
177
                        outCm.funct                     = FUNCT_BOOTLOADER;
178
                        outCm.funcc                     = FUNCC_BOOT_ACK;
179
                        outCm.nid                       = MY_NID;
180
                        outCm.sid                       = MY_ID;
181
                        outCm.data_length               = 8;
182
                        outCm.data[BOOT_DATA_ERR_INDEX] = ACK_ERR_NO_ERROR;
183
                        while(!canSendMessage(outCm,PRIO_HIGH));
184
                    break;
185
                }
186
            }
187
 
188
 
189
        break;
190
    }
191
}
192
#endif
193
 
194
 
195
 
196
// Below are mandantory when using bootloader
197
// define DEBUG_MODE to use without bootloader.
198
 
199
#ifndef DEBUG_MODE
200
extern void _startup (void);
201
#pragma code _RESET_INTERRUPT_VECTOR = 0x001000
202
void _reset (void)
203
{
204
    _asm goto _startup _endasm
205
}
206
#pragma code
207
#endif
208
 
209
#pragma code _HIGH_INTERRUPT_VECTOR = 0x001008
210
void _high_ISR (void)
211
{
212
    _asm GOTO high_isr _endasm
213
}
214
#pragma code
215
 
216
#pragma code _LOW_INTERRUPT_VECTOR = 0x001018
217
void _low_ISR (void)
218
{
219
    _asm GOTO low_isr _endasm
220
}
221
#pragma code