Skip to content

Commit 30655d3

Browse files
committed
fsm refactoring
1 parent 7d55104 commit 30655d3

File tree

5 files changed

+111
-118
lines changed

5 files changed

+111
-118
lines changed

src/eez/modules/psu/dlog_record.cpp

Lines changed: 40 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ namespace dlog_record {
4444

4545
#define CHUNK_SIZE 4096
4646

47-
enum StateTransition {
48-
TRANSITION_INITIATE,
49-
TRANSITION_INITIATE_TRACE,
50-
TRANSITION_START,
51-
TRANSITION_TRIGGER,
52-
TRANSITION_TOGGLE,
53-
TRANSITION_FINISH,
54-
TRANSITION_ABORT,
55-
TRANSITION_RESET
47+
enum Event {
48+
EVENT_INITIATE,
49+
EVENT_INITIATE_TRACE,
50+
EVENT_START,
51+
EVENT_TRIGGER,
52+
EVENT_TOGGLE,
53+
EVENT_FINISH,
54+
EVENT_ABORT,
55+
EVENT_RESET
5656
};
5757

5858
dlog_view::Parameters g_parameters = {
@@ -497,7 +497,7 @@ static void log(uint32_t tickCount) {
497497
++g_recording.size;
498498

499499
if (g_nextTime > g_recording.parameters.time) {
500-
stateTransition(TRANSITION_FINISH);
500+
stateTransition(EVENT_FINISH);
501501
} else {
502502
int32_t diff = tickCount - g_lastSyncTickCount;
503503
if (diff > CONF_DLOG_SYNC_FILE_TIME * 1000000L) {
@@ -638,59 +638,42 @@ int checkDlogParameters(dlog_view::Parameters &parameters, bool doNotCheckFilePa
638638

639639
////////////////////////////////////////////////////////////////////////////////
640640

641-
void stateTransition(int transition, int* perr) {
641+
void stateTransition(int event, int* perr) {
642642
if (osThreadGetId() != g_scpiTaskHandle) {
643-
osMessagePut(g_scpiMessageQueueId, SCPI_QUEUE_MESSAGE(SCPI_QUEUE_MESSAGE_TARGET_NONE, SCPI_QUEUE_MESSAGE_TYPE_DLOG_STATE_TRANSITION, transition), osWaitForever);
643+
osMessagePut(g_scpiMessageQueueId, SCPI_QUEUE_MESSAGE(SCPI_QUEUE_MESSAGE_TARGET_NONE, SCPI_QUEUE_MESSAGE_TYPE_DLOG_STATE_TRANSITION, event), osWaitForever);
644644
return;
645645
}
646646

647-
int err = SCPI_RES_OK;
647+
int err = SCPI_ERROR_CANNOT_CHANGE_TRANSIENT_TRIGGER;
648648

649-
if (transition == TRANSITION_INITIATE || transition == TRANSITION_INITIATE_TRACE) {
650-
if (g_state == STATE_IDLE) {
651-
err = doInitiate(transition == TRANSITION_INITIATE_TRACE);
652-
} else {
653-
err = SCPI_ERROR_CANNOT_CHANGE_TRANSIENT_TRIGGER;
654-
}
655-
} else if (transition == TRANSITION_START) {
656-
if (g_state == STATE_IDLE || g_state == STATE_INITIATED) {
657-
err = doStartImmediately();
658-
} else {
659-
err = SCPI_ERROR_CANNOT_CHANGE_TRANSIENT_TRIGGER;
660-
}
661-
} else if (transition == TRANSITION_TRIGGER) {
662-
if (g_state == STATE_INITIATED) {
649+
if (g_state == STATE_IDLE) {
650+
if (event == EVENT_INITIATE || event == EVENT_INITIATE_TRACE) {
651+
err = doInitiate(event == EVENT_INITIATE_TRACE);
652+
} else if (event == EVENT_START) {
663653
err = doStartImmediately();
664-
} else {
665-
err = SCPI_ERROR_CANNOT_CHANGE_TRANSIENT_TRIGGER;
654+
} else if (event == EVENT_TOGGLE) {
655+
err = doInitiate(false);
656+
} else if (event == EVENT_ABORT || event == EVENT_RESET) {
657+
resetParameters();
658+
err = SCPI_RES_OK;
666659
}
667-
} else if (transition == TRANSITION_TOGGLE) {
668-
if (g_state == STATE_IDLE) {
669-
err = doInitiate(transition == TRANSITION_INITIATE_TRACE);
670-
} else if (g_state == STATE_INITIATED) {
660+
} else if (g_state == STATE_INITIATED) {
661+
if (event == EVENT_START || event == EVENT_TRIGGER || event == EVENT_TOGGLE) {
671662
err = doStartImmediately();
672-
} else if (g_state == STATE_EXECUTING) {
673-
doFinish();
674-
} else {
675-
err = SCPI_ERROR_CANNOT_CHANGE_TRANSIENT_TRIGGER;
663+
} else if (event == EVENT_ABORT || event == EVENT_RESET) {
664+
resetParameters();
665+
setState(STATE_IDLE);
666+
err = SCPI_RES_OK;
676667
}
677-
} else if (transition == TRANSITION_FINISH) {
678-
if (g_state == STATE_EXECUTING) {
668+
} else if (g_state == STATE_EXECUTING) {
669+
if (event == EVENT_TOGGLE || event == EVENT_FINISH) {
679670
doFinish();
680-
} else {
681-
err = SCPI_ERROR_CANNOT_CHANGE_TRANSIENT_TRIGGER;
682-
}
683-
} else if (transition == TRANSITION_ABORT || transition == TRANSITION_RESET) {
684-
if (g_state == STATE_IDLE) {
685-
resetParameters();
686-
} else if (g_state == STATE_INITIATED || g_state == STATE_EXECUTING) {
671+
err = SCPI_RES_OK;
672+
} else if (event == EVENT_ABORT || event == EVENT_RESET) {
687673
resetParameters();
688674
setState(STATE_IDLE);
689-
} else {
690-
err = SCPI_ERROR_CANNOT_CHANGE_TRANSIENT_TRIGGER;
675+
err = SCPI_RES_OK;
691676
}
692-
} else {
693-
err = SCPI_ERROR_CANNOT_CHANGE_TRANSIENT_TRIGGER;
694677
}
695678

696679
if (perr) {
@@ -706,36 +689,36 @@ void stateTransition(int transition, int* perr) {
706689

707690
int initiate() {
708691
int err;
709-
stateTransition(TRANSITION_INITIATE, &err);
692+
stateTransition(EVENT_INITIATE, &err);
710693
return err;
711694
}
712695

713696
int initiateTrace() {
714697
int err;
715-
stateTransition(TRANSITION_INITIATE_TRACE, &err);
698+
stateTransition(EVENT_INITIATE_TRACE, &err);
716699
return err;
717700
}
718701

719702
int startImmediately() {
720703
int err;
721-
stateTransition(TRANSITION_START, &err);
704+
stateTransition(EVENT_START, &err);
722705
return err;
723706
}
724707

725708
void triggerGenerated() {
726-
stateTransition(TRANSITION_TRIGGER);
709+
stateTransition(EVENT_TRIGGER);
727710
}
728711

729712
void toggle() {
730-
stateTransition(TRANSITION_TOGGLE);
713+
stateTransition(EVENT_TOGGLE);
731714
}
732715

733716
void abort() {
734-
stateTransition(TRANSITION_ABORT);
717+
stateTransition(EVENT_ABORT);
735718
}
736719

737720
void reset() {
738-
stateTransition(TRANSITION_RESET);
721+
stateTransition(EVENT_RESET);
739722
}
740723

741724
////////////////////////////////////////////////////////////////////////////////

src/eez/modules/psu/dlog_record.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void tick(uint32_t tick_usec);
6565
void log(float *values);
6666

6767
void fileWrite();
68-
void stateTransition(int action, int *perr = nullptr);
68+
void stateTransition(int event, int *perr = nullptr);
6969

7070
const char *getLatestFilePath();
7171

src/eez/modules/psu/ntp.cpp

Lines changed: 68 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,14 @@ enum State {
6060
STATE_WAIT_TEST
6161
};
6262

63-
enum Transition {
64-
TRANSITION_READY,
65-
TRANSITION_NOT_READY,
66-
TRANSITION_SUCCEEDED,
67-
TRANSITION_TEST_NTP_SERVER,
68-
TRANSITION_TIMEOUT1,
69-
TRANSITION_TIMEOUT2,
70-
TRANSITION_RESET
63+
enum Event {
64+
EVENT_READY,
65+
EVENT_NOT_READY,
66+
EVENT_SUCCEEDED,
67+
EVENT_TEST_NTP_SERVER,
68+
EVENT_TIMEOUT1,
69+
EVENT_TIMEOUT2,
70+
EVENT_RESET
7171
};
7272

7373
static State g_state;
@@ -82,7 +82,7 @@ static int g_ntpServerTestResult;
8282

8383
extern "C" void sntpSetSystemTimeUs(uint32_t utc, uint32_t us) {
8484
g_utc = utc;
85-
mcu::ethernet::ntpStateTransition(TRANSITION_SUCCEEDED);
85+
mcu::ethernet::ntpStateTransition(EVENT_SUCCEEDED);
8686
}
8787

8888
static bool isReady() {
@@ -129,29 +129,29 @@ static void startAndWait() {
129129
setState(STATE_WAIT);
130130
}
131131

132+
static void startAndWaitTest() {
133+
start();
134+
setTimeout(g_timeout1, CONF_TEST_NTP_SERVER_TIMEOUT);
135+
setState(STATE_WAIT_TEST);
136+
}
137+
132138
static void stop() {
133139
sntp_stop();
134140
}
135141

136142
#endif
137143

138-
void stateTransition(int transition) {
144+
void stateTransition(int event) {
139145
#ifdef EEZ_PLATFORM_STM32
140-
if (transition == TRANSITION_READY) {
141-
if (g_state == STATE_NOT_READY) {
146+
if (g_state == STATE_NOT_READY) {
147+
if (event == EVENT_READY) {
142148
startAndWait();
143149
}
144-
} else if (transition == TRANSITION_NOT_READY) {
145-
if (g_state == STATE_WAIT) {
150+
} else if (g_state == STATE_WAIT) {
151+
if (event == EVENT_NOT_READY) {
146152
stop();
147-
} else if (g_state == STATE_WAIT_TEST) {
148-
stop();
149-
g_ntpServerToTest = nullptr;
150-
g_ntpServerTestResult = 0;
151-
}
152-
setState(STATE_NOT_READY);
153-
} else if (transition == TRANSITION_SUCCEEDED) {
154-
if (g_state == STATE_WAIT) {
153+
setState(STATE_NOT_READY);
154+
} else if (event == EVENT_SUCCEEDED) {
155155
stop();
156156

157157
uint32_t local = datetime::utcToLocal(g_utc, persist_conf::devConf.time_zone, (datetime::DstRule)persist_conf::devConf.dstRule);
@@ -161,45 +161,55 @@ void stateTransition(int transition) {
161161

162162
setTimeout(g_timeout1, CONF_TIMEOUT_AFTER_SUCCESS_MS);
163163
setState(STATE_SUCCESS);
164-
} else if (g_state == STATE_WAIT_TEST) {
164+
} else if (event == EVENT_TEST_NTP_SERVER) {
165165
stop();
166-
167-
g_ntpServerToTest = nullptr;
168-
g_ntpServerTestResult = 1;
169-
170-
startAndWait();
171-
}
172-
} else if (transition == TRANSITION_TEST_NTP_SERVER) {
173-
if (g_state == STATE_WAIT || g_state == STATE_SUCCESS || g_state == STATE_ERROR || g_state == STATE_WAIT_TEST) {
174-
if (g_state == STATE_WAIT || g_state == STATE_WAIT_TEST) {
175-
stop();
176-
}
177-
start();
178-
setTimeout(g_timeout1, CONF_TEST_NTP_SERVER_TIMEOUT);
179-
setState(STATE_WAIT_TEST);
180-
}
181-
} else if (transition == TRANSITION_TIMEOUT1) {
182-
if (g_state == STATE_WAIT) {
166+
startAndWaitTest();
167+
} else if (event == EVENT_TIMEOUT1) {
183168
stop();
184169
start();
185170
setTimeout(g_timeout1, CONF_TEST_NTP_SERVER_TIMEOUT);
186-
} else if (g_state == STATE_WAIT_TEST) {
187-
g_ntpServerToTest = nullptr;
188-
g_ntpServerTestResult = 0;
189-
startAndWait();
190-
}
191-
} else if (transition == TRANSITION_TIMEOUT2) {
192-
if (g_state == STATE_WAIT) {
171+
} else if (event == EVENT_TIMEOUT2) {
193172
stop();
194173
event_queue::pushEvent(event_queue::EVENT_WARNING_NTP_REFRESH_FAILED);
195174
setTimeout(g_timeout1, CONF_TIMEOUT_AFTER_ERROR_MS);
196175
setState(STATE_ERROR);
176+
} else if (event == EVENT_RESET) {
177+
stop();
178+
startAndWait();
179+
}
180+
} else if (g_state == STATE_SUCCESS) {
181+
if (event == EVENT_TEST_NTP_SERVER) {
182+
startAndWaitTest();
183+
} else if (event == EVENT_TIMEOUT1) {
184+
startAndWait();
185+
} else if (event == EVENT_RESET) {
186+
startAndWait();
187+
}
188+
} else if (g_state == STATE_ERROR) {
189+
if (event == EVENT_TEST_NTP_SERVER) {
190+
startAndWaitTest();
191+
} else if (event == EVENT_TIMEOUT1) {
192+
startAndWait();
193+
} else if (event == EVENT_RESET) {
194+
startAndWait();
197195
}
198-
} else if (transition == TRANSITION_RESET) {
199-
if (g_state == STATE_WAIT || g_state == STATE_SUCCESS || g_state == STATE_ERROR) {
200-
if (g_state == STATE_WAIT) {
201-
stop();
202-
}
196+
} else if (g_state == STATE_WAIT_TEST) {
197+
if (event == EVENT_NOT_READY) {
198+
stop();
199+
g_ntpServerToTest = nullptr;
200+
g_ntpServerTestResult = 0;
201+
setState(STATE_NOT_READY);
202+
} else if (event == EVENT_SUCCEEDED) {
203+
stop();
204+
g_ntpServerToTest = nullptr;
205+
g_ntpServerTestResult = 1;
206+
startAndWait();
207+
} else if (event == EVENT_TEST_NTP_SERVER) {
208+
stop();
209+
startAndWaitTest();
210+
} else if (event == EVENT_TIMEOUT1) {
211+
g_ntpServerToTest = nullptr;
212+
g_ntpServerTestResult = 0;
203213
startAndWait();
204214
}
205215
}
@@ -210,37 +220,37 @@ void tick() {
210220
#ifdef EEZ_PLATFORM_STM32
211221
if (g_state == STATE_NOT_READY) {
212222
if (isReady()) {
213-
stateTransition(TRANSITION_READY);
223+
stateTransition(EVENT_READY);
214224
}
215225
} else {
216226
if (!isReady()) {
217-
stateTransition(TRANSITION_NOT_READY);
227+
stateTransition(EVENT_NOT_READY);
218228
}
219229
}
220230

221231
if (g_timeout1 && millis() >= g_timeout1) {
222232
g_timeout1 = 0;
223-
stateTransition(TRANSITION_TIMEOUT1);
233+
stateTransition(EVENT_TIMEOUT1);
224234
}
225235

226236
if (g_timeout2 && millis() >= g_timeout2) {
227237
g_timeout2 = 0;
228-
stateTransition(TRANSITION_TIMEOUT2);
238+
stateTransition(EVENT_TIMEOUT2);
229239
}
230240
#endif
231241
}
232242

233243
void reset() {
234244
#ifdef EEZ_PLATFORM_STM32
235-
mcu::ethernet::ntpStateTransition(TRANSITION_RESET);
245+
mcu::ethernet::ntpStateTransition(EVENT_RESET);
236246
#endif
237247
}
238248

239249
void testNtpServer(const char *ntpServer) {
240250
#ifdef EEZ_PLATFORM_STM32
241251
g_ntpServerToTest = ntpServer;
242252
g_ntpServerTestResult = 2;
243-
mcu::ethernet::ntpStateTransition(TRANSITION_TEST_NTP_SERVER);
253+
mcu::ethernet::ntpStateTransition(EVENT_TEST_NTP_SERVER);
244254
#endif
245255
}
246256

src/eez/modules/psu/ntp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void testNtpServer(const char *ntpServer);
2828
// returns true if test is done and sets result to true if successfull
2929
bool isTestNtpServerDone(bool &testResult);
3030

31-
void stateTransition(int transition);
31+
void stateTransition(int event);
3232

3333
}
3434
} // namespace eez::psu::ntp

src/third_party/stm32_truestudio/.settings/language.settings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
55
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
66
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
7-
<provider class="com.atollic.truestudio.mbs.GCCSpecsDetectorAtollicArm" console="false" env-hash="1918333901757071934" id="com.atollic.truestudio.mbs.provider" keep-relative-paths="false" name="Atollic ARM Tools Language Settings" parameter="${COMMAND} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
7+
<provider class="com.atollic.truestudio.mbs.GCCSpecsDetectorAtollicArm" console="false" env-hash="-979636608710813241" id="com.atollic.truestudio.mbs.provider" keep-relative-paths="false" name="Atollic ARM Tools Language Settings" parameter="${COMMAND} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
88
<language-scope id="org.eclipse.cdt.core.gcc"/>
99
<language-scope id="org.eclipse.cdt.core.g++"/>
1010
</provider>

0 commit comments

Comments
 (0)