Rev 303 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 303 | Rev 333 | ||
---|---|---|---|
Line 10... | Line 10... | ||
10 | #include "fat16.h" |
10 | #include "fat16.h" |
11 | #include "led.h" |
11 | #include "led.h" |
12 | #include "menu.h" |
12 | #include "menu.h" |
13 | #include "printf_P.h" |
13 | #include "printf_P.h" |
14 | #include "analog.h" |
14 | #include "analog.h" |
15 | #include "ubx.h" |
15 | #include "gps.h" |
16 | #include "button.h" |
16 | #include "button.h" |
Line -... | Line 17... | ||
- | 17 | ||
- | 18 | ||
- | 19 | #define FOLLOWME_INTERVAL 1000 // 1 second update |
|
17 | 20 | ||
18 | #ifdef USE_FOLLOWME |
21 | #ifdef USE_FOLLOWME |
19 | int16_t UBat = 120; |
22 | int16_t UBat = 120; |
20 | int16_t Zellenzahl = 0; |
23 | int16_t Zellenzahl = 0; |
21 | int16_t PowerOn = 0; |
24 | int16_t PowerOn = 0; |
22 | int16_t i = 0; |
25 | int16_t i = 0; |
23 | int16_t delay = 0; |
26 | int16_t delay = 0; |
Line 24... | Line 27... | ||
24 | #endif |
27 | #endif |
Line -... | Line 28... | ||
- | 28 | ||
- | 29 | uint16_t Error = 0; |
|
- | 30 | ||
- | 31 | typedef enum |
|
- | 32 | { |
|
- | 33 | STATE_UNDEFINED, |
|
Line 25... | Line 34... | ||
25 | 34 | STATE_IDLE, |
|
26 | #define GPS_RX_TIMEOUT 0x0001 |
35 | STATE_SEND_FOLLOWME |
27 | 36 | } SysState_t; |
|
28 | 37 | ||
Line 29... | Line 38... | ||
29 | int main (void) |
38 | int main (void) |
30 | { |
39 | { |
Line 31... | Line 40... | ||
31 | static uint16_t GPS_Timer = 0; |
40 | static uint16_t FollowMe_Timer = 0; |
Line 49... | Line 58... | ||
49 | ADC_Init(); |
58 | ADC_Init(); |
50 | Button_Init(); |
59 | Button_Init(); |
51 | // enable interrupts global |
60 | // enable interrupts global |
52 | sei(); |
61 | sei(); |
Line -... | Line 62... | ||
- | 62 | ||
- | 63 | Fat16_Init(); |
|
53 | 64 | ||
54 | LEDRED_OFF; |
- | |
55 | #ifdef USE_FOLLOWME |
65 | LEDRED_OFF; |
56 | LEDGRN_ON; |
- | |
Line 57... | Line 66... | ||
57 | #endif |
66 | LEDGRN_ON; |
58 | 67 | ||
Line 59... | Line 68... | ||
59 | // try to initialize the FAT 16 filesystem on the SD-Card |
68 | // try to initialize the FAT 16 filesystem on the SD-Card |
Line 68... | Line 77... | ||
68 | printf("\r\nFollow Me\n\rSoftware:V%d.%d%c ",VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH + 'a'); |
77 | printf("\r\nFollow Me\n\rSoftware:V%d.%d%c ",VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH + 'a'); |
69 | printf("\r\n------------------------------"); |
78 | printf("\r\n------------------------------"); |
70 | printf("\r\n"); |
79 | printf("\r\n"); |
Line 71... | Line -... | ||
71 | - | ||
72 | 80 | ||
73 | #ifdef USE_FOLLOWME |
- | |
Line 74... | Line 81... | ||
74 | //BeepTime = 2000; |
81 | |
Line 75... | Line 82... | ||
75 | #endif |
82 | //BeepTime = 2000; |
- | 83 | ||
76 | 84 | LCD_Clear(); |
|
77 | LCD_Clear(); |
85 | |
- | 86 | FollowMe_Timer = SetDelay(FOLLOWME_INTERVAL); |
|
- | 87 | ||
- | 88 | while (1) |
|
78 | 89 | { |
|
79 | GPS_Timer = SetDelay(1000); |
90 | // get gps data to update the follow me position |
80 | while (1) |
91 | GPS_Update(); |
81 | { |
92 | |
- | 93 | // check for button action and change state resectively |
|
82 | // check for button action |
94 | if(GetButton()) |
- | 95 | { |
|
- | 96 | BeepTime = 200; |
|
- | 97 | ||
- | 98 | switch(SysState) |
|
- | 99 | { |
|
- | 100 | case STATE_IDLE: |
|
- | 101 | if(!Error) SysState = STATE_SEND_FOLLOWME; // activate followme only of no error has occured |
|
- | 102 | break; |
|
- | 103 | ||
- | 104 | case STATE_SEND_FOLLOWME: |
|
- | 105 | SysState = STATE_IDLE; |
|
- | 106 | break; |
|
- | 107 | ||
Line 83... | Line 108... | ||
83 | if(GetButton()) |
108 | default: |
Line -... | Line 109... | ||
- | 109 | SysState = STATE_IDLE; |
|
- | 110 | break; |
|
- | 111 | } |
|
- | 112 | ||
- | 113 | } |
|
- | 114 | ||
- | 115 | // state machine |
|
- | 116 | switch(SysState) |
|
- | 117 | { |
|
- | 118 | case STATE_SEND_FOLLOWME: |
|
- | 119 | if(CheckDelay(FollowMe_Timer)) // time for next message? |
|
- | 120 | { |
|
- | 121 | if(FollowMe.Position.Status == NEWDATA) // if new |
|
- | 122 | { // update remaining data |
|
- | 123 | FollowMe_Timer = SetDelay(FOLLOWME_INTERVAL); // reset timer |
|
- | 124 | FollowMe.Heading = -1; // invalid heading |
|
- | 125 | FollowMe.ToleranceRadius = 1; // 1 meter |
|
- | 126 | FollowMe.HoldTime = 60; // go home after 60s without any update |
|
- | 127 | FollowMe.Event_Flag = 0; // no event |
|
- | 128 | FollowMe.reserve[0] = 0; // reserve |
|
- | 129 | FollowMe.reserve[1] = 0; // reserve |
|
- | 130 | FollowMe.reserve[2] = 0; // reserve |
|
- | 131 | FollowMe.reserve[3] = 0; // reserve |
|
- | 132 | Request_SendFollowMe = 1; // triggers serial tranmission |
|
- | 133 | ||
- | 134 | } |
|
- | 135 | else // now new position avalable (maybe bad gps signal condition) |
|
- | 136 | { |
|
- | 137 | FollowMe_Timer = SetDelay(FOLLOWME_INTERVAL/4); // reset timer on higer frequency |
|
- | 138 | } |
|
- | 139 | LEDGRN_TOGGLE; // indication of active follow me |
|
- | 140 | } |
|
- | 141 | break; |
|
- | 142 | ||
- | 143 | case STATE_IDLE: |
|
- | 144 | // do nothing |
|
- | 145 | LEDGRN_ON; |
|
- | 146 | break; |
|
- | 147 | ||
- | 148 | default: |
|
- | 149 | // triger to idle state |
|
84 | { |
150 | SysState = STATE_IDLE; |
85 | BeepTime = 200; |
151 | break; |
86 | Fat16_Init(); |
152 | |
87 | 153 | } |
|
88 | } |
154 | |
Line 105... | Line 171... | ||
105 | // because of the silicon diode inbetween. |
171 | // because of the silicon diode inbetween. |
106 | // voltage divider R2=10K, R3=3K9 |
172 | // voltage divider R2=10K, R3=3K9 |
107 | // UAdc4 = R3/(R3+R2)*UBat= 3.9/(3.9+10)*UBat = UBat/3.564 |
173 | // UAdc4 = R3/(R3+R2)*UBat= 3.9/(3.9+10)*UBat = UBat/3.564 |
108 | UBat = (3 * UBat + (64 * Adc4) / 368) / 4; |
174 | UBat = (3 * UBat + (64 * Adc4) / 368) / 4; |
109 | DebugOut.Analog[8] = UBat; |
175 | DebugOut.Analog[8] = UBat; |
110 | 176 | ||
111 | // check for zellenzahl |
177 | // check for zellenzahl |
112 | if(PowerOn < 100) |
178 | if(PowerOn < 100) |
113 | { |
179 | { |
114 | if(UBat<=84) Zellenzahl = 2; |
180 | if(UBat<=84) Zellenzahl = 2; |
115 | else Zellenzahl = 3; |
181 | else Zellenzahl = 3; |
116 | PowerOn++; |
182 | PowerOn++; |
117 | } |
183 | } |
118 | DebugOut.Analog[16] = Zellenzahl; |
184 | DebugOut.Analog[16] = Zellenzahl; |
119 | DebugOut.Analog[17] = PowerOn; |
185 | DebugOut.Analog[17] = PowerOn; |
120 | 186 | ||
121 | //show recognised Zellenzahl to user |
187 | //show recognised Zellenzahl to user |
122 | if(i < Zellenzahl && PowerOn >= 100 && BeepTime == 0 && delay > 1000) |
188 | if(i < Zellenzahl && PowerOn >= 100 && BeepTime == 0 && delay > 1000) |
123 | { |
189 | { |
124 | BeepTime = 100; |
190 | BeepTime = 100; |
125 | i++; |
191 | i++; |
126 | delay = 0; |
192 | delay = 0; |
127 | } |
193 | } |
128 | if(delay < 1500) delay++; |
194 | if(delay < 1500) delay++; |
129 | - | ||
130 | // monitor battery undervoltage |
- | |
131 | if(UBat < Zellenzahl * 31 && PowerOn >= 100) BeepTime = 200; |
- | |
132 | #endif |
- | |
133 | ADReady = 0; |
- | |
134 | ADC_Enable(); // restart ad conversion sequence |
- | |
135 | } |
- | |
136 | - | ||
Line 137... | Line 195... | ||
137 | 195 | ||
138 | if(GPSData.Status == NEWDATA) |
- | |
139 | { |
196 | // monitor battery undervoltage |
140 | Error &= ~GPS_RX_TIMEOUT; // clear possible error |
197 | if((UBat < Zellenzahl * 31) && (PowerOn >= 100)) |
- | 198 | { // sound for low battery |
|
141 | GPS_Timer = SetDelay(1000); // reset timeout |
199 | BeepModulation = 0x0300; |
142 | if(CheckGPSOkay >= 5) |
200 | if(!BeepTime) |
143 | { |
201 | { |
144 | // trigger transmission of FollowMe message here. |
202 | BeepTime = 6000; // 0.6 seconds |
145 | 203 | } |
|
146 | CheckGPSOkay = 0; |
204 | Error |= ERROR_LOW_BAT; |
147 | } |
- | |
148 | GPSData.Status = PROCESSED; |
- | |
149 | } |
- | |
150 | else // invalid or already processed |
205 | } |
151 | { |
- | |
152 | if(CheckDelay(GPS_Timer)) |
206 | else |
153 | { |
207 | { |
154 | Error |= GPS_RX_TIMEOUT; |
208 | Error &= ~ERROR_LOW_BAT; |
- | 209 | } |
|
- | 210 | #endif |
|
- | 211 | ADReady = 0; |
|
155 | } |
212 | ADC_Enable(); // restart ad conversion sequence |
Line -... | Line 213... | ||
- | 213 | } |
|
156 | } |
214 | |
157 | 215 | // serial communication |
|
- | 216 | USART0_ProcessRxData(); |
|
- | 217 | USART0_TransmitTxData(); |
|
- | 218 | ||
- | 219 | // indicate error, blinking code tbd. |
|
- | 220 | if(Error) LEDRED_ON; |
|
158 | USART0_ProcessRxData(); |
221 | else LEDRED_OFF; |
159 | USART0_TransmitTxData(); |
222 | |
160 | } |
223 | } |