source: trunk/firmware_v4/SES/src/mode_mainswitch.c

Last change on this file was 42, checked in by f.jahn, 5 days ago
File size: 5.8 KB
RevLine 
[42]1// Keine LVP und OVP Überwachung aber Fault wird geprüft!
2// Falls nicht benötigt, nicht anschließen ?! Ist Low active mit PullUp
3// Dieser Modus ist als Hauptschaltermodus ohne BMS gedacht. Z.B. für Bleibatterien
4// Oder als Hauptschalter mit Fremd BMS
5
6
7
8#include "stdio.h"
9#include "mode_mainswitch.h"
10#include "button.h"
11#include "relais.h"
12#include "main.h"
13#include "leds.h"
14#include "buzzer.h"
15#include "chip_temperature.h"
16
17
18typedef enum MAINSWITCH_State_enum
19{
20 MAINSWITCH_OFF,
21 MAINSWITCH_ON,
22 MAINSWITCH_MANUAL_ON,
23 MAINSWITCH_ERROR
24} MAINSWITCH_state_t;
25
26
27static MAINSWITCH_state_t smState;
28
29
30void MAINSWITCH_SM_Off(void)
31{
32 int faultInput;
33
34 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
35 {
36 faultInput = 1;
37 }
38 else
39 {
40 faultInput = 0;
41 }
42
43
44
45 //Prüfe auf Wechsel des Modus AUTO / SM ON
46 if (BUTTON_GetMode() == BUTTON_AUTO)
47 {
48 if (faultInput == 0)
49 {
50 RELAIS_SetPuls();
51 BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
52 LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
53#ifdef DEBUG
54 printf("NEW_STATE: MAINSWITCH_ON\n");
55#endif
56 smState = MAINSWITCH_ON;
57
58 }
59 else
60 {
61 //Wechsel nicht möglich. Fehler Eingang aktiv
62 BUZZER_Beep(BUZZER_ON_TIME_REJECT);
63 BUTTON_SetModeOff();
64 LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
65#ifdef DEBUG
66 printf("NEW_STATE: MAINSWITCH_ERROR\n");
67#endif
68 smState = MAINSWITCH_ERROR;
69 }
70 }
71
72 //Prüfe auf Wechsel in MANUAL ON Mode
73 //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
74 if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
75 {
76
77 RELAIS_SetPuls();
78 BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
79 LEDS_GN_On();
80 LEDS_RT_BlinkCode_Start(BLINK_CODE_WARN_MANUAL, LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
81#ifdef DEBUG
82 printf("NEW_STATE: MAINSWITCH_MANUAL_ON\n");
83#endif
84 smState = MAINSWITCH_MANUAL_ON;
85 }
86
87
88
89}
90
91void MAINSWITCH_SM_On(void)
92{
93 int faultInput;
94 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
95 {
96 faultInput = 1;
97 }
98 else
99 {
100 faultInput = 0;
101 }
102
103
104 // Prüfe Wechsel in off mode
105 if (BUTTON_GetMode() == BUTTON_OFF)
106 {
107 //Ausschalten muss immer möglich sein
108 RELAIS_ResetPuls();
109 BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Bestätigung
110 LEDS_GN_Off();
111 LEDS_RT_Off();
112#ifdef DEBUG
113 printf("NEW_STATE: MAINSWITCH_OFF\n");
114#endif
115 smState = MAINSWITCH_OFF;
116 }
117
118 //Prüfe auf Fehlermode
119 if (faultInput == 1)
120 {
121 RELAIS_ResetPuls();
122 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
123 LEDS_GN_Off();
124 LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
125 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
126#ifdef DEBUG
127 printf("NEW_STATE: MAINSWITCH_ERROR\n");
128#endif
129 smState = MAINSWITCH_ERROR;
130 }
131
132 if (CHIP_TEMPERATURE_GetTemp() > 80)
133 {
134 RELAIS_ResetPuls();
135 BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
136 LEDS_GN_Off();
137 LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_TEMP, LED_RT_ON_TIME_WARN_TEMP, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
138 BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
139#ifdef DEBUG
140 printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
141#endif
142 smState = MAINSWITCH_ERROR;
143 }
144
145
146
147
148}
149
150void MAINSWITCH_SM_ManualOn(void)
151{
152 // Prüfe Wechsel in off mode
153 if (BUTTON_GetMode() == BUTTON_OFF)
154 {
155 //Ausschalten muss immer möglich sein
156 RELAIS_ResetPuls();
157 BUZZER_Alarm_Stop();
158 LEDS_GN_Off();
159 LEDS_RT_Off();
160#ifdef DEBUG
161 printf("NEW_STATE: MAINSWITCH_OFF\n");
162#endif
163 smState = MAINSWITCH_OFF;
164 }
165
166}
167
168void MAINSWITCH_SM_Error(void)
169{
170 int faultInput;
171
172 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
173 {
174 faultInput = 1;
175 }
176 else
177 {
178 faultInput = 0;
179 }
180
181
182 //Prüfe auf Wechsel des Modus AUTO / SM ON
183 if (BUTTON_GetMode() == BUTTON_AUTO)
184 {
185 if (faultInput == 0)
186 {
187 RELAIS_SetPuls();
188 BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
189 LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
190 LEDS_RT_Off(); //Fehler löschen
191#ifdef DEBUG
192 printf("NEW_STATE: MAINSWITCH_ON\n");
193#endif
194 smState = MAINSWITCH_ON;
195 }
196 else
197 {
198 //Wechsel nicht möglich. Fehler Eingang aktiv
199 BUZZER_Beep(BUZZER_ON_TIME_REJECT);
200 BUTTON_SetModeOff();
201 }
202 }
203
204 //Prüfe auf Wechsel in MANUAL ON Mode
205 //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
206 if (BUTTON_GetMode() == BUTTON_MANUAL_ON)
207 {
208
209 RELAIS_SetPuls();
210 BUZZER_Alarm_Start(BUZZER_ON_TIME_ALARM_MANUAL_MODE, BUZZER_OFF_TIME);
211 LEDS_GN_On();
212 LEDS_RT_Off();
213 LEDS_RT_BlinkCode_Start(BLINK_CODE_WARN_MANUAL, LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
214#ifdef DEBUG
215 printf("NEW_STATE: MAINSWITCH_MANUAL_ON\n");
216#endif
217 smState = MAINSWITCH_MANUAL_ON;
218 }
219
220
221
222}
223
224
225
226void MODE_MAINSWITCH_Exec(void)
227{
228
229
230
231 switch (smState)
232 {
233 case MAINSWITCH_OFF:
234 MAINSWITCH_SM_Off();
235 break;
236
237 case MAINSWITCH_ON:
238 MAINSWITCH_SM_On();
239 break;
240
241 case MAINSWITCH_MANUAL_ON:
242 MAINSWITCH_SM_ManualOn();
243 break;
244
245 case MAINSWITCH_ERROR:
246 MAINSWITCH_SM_Error();
247 break;
248
249 default:
250 break;
251 }
252}
253
254
Note: See TracBrowser for help on using the repository browser.