Subversion Repositories HomeAutomation

Rev

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