Skip to content

Commit dd2b8ce

Browse files
committed
add fsm ability!
1 parent 59509bf commit dd2b8ce

File tree

3 files changed

+76
-5
lines changed

3 files changed

+76
-5
lines changed

MIDAS/src/hilsim/kal.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@ void k_init_sensordata() {
2727
}
2828

2929
// ---- Kamaji Thread ----
30-
DECLARE_THREAD(hilsim, void*arg) {
30+
DECLARE_THREAD(hilsim, RocketSystems* arg) {
3131
uint8_t header[5];
3232
uint8_t crc_buf[2];
3333
uint32_t timestamp;
3434
uint8_t discriminant;
3535
size_t data_size;
3636
uint8_t data_buf[128];
3737
uint16_t crc;
38+
39+
sys_flags_t sflags;
3840

3941
while (true) {
4042
int delim;
@@ -43,14 +45,19 @@ DECLARE_THREAD(hilsim, void*arg) {
4345
delim = Serial.read();
4446
THREAD_SLEEP(1);
4547

48+
if (sflags.fsm_target != FSMState::FSM_STATE_COUNT) {
49+
arg->rocket_data.fsm_state.update(sflags.fsm_target);
50+
sflags.fsm_target = FSMState::FSM_STATE_COUNT;
51+
}
52+
4653
} while(delim != '$' && delim != '#');
4754

4855
if(delim == '#') {
4956
if (!k_read_exact(data_buf, 16, 10)) continue;
5057

5158
// Sys message is 14 byte data, 2 byte crc
5259
memcpy(&crc, data_buf + 14, sizeof(crc_buf));
53-
k_handle_sys_msg(data_buf, crc);
60+
k_handle_sys_msg(data_buf, crc, &sflags);
5461
continue;
5562
}
5663

@@ -107,7 +114,7 @@ DECLARE_THREAD(hilsim, void*arg) {
107114
START_THREAD(fsm, SENSOR_CORE, config, 8);
108115
START_THREAD(buzzer, SENSOR_CORE, config, 6);
109116
START_THREAD(telemetry, SENSOR_CORE, config, 15);
110-
START_THREAD(hilsim, DATA_CORE, nullptr, 1);
117+
START_THREAD(hilsim, DATA_CORE, config, 1);
111118

112119
config->buzzer.play_tune(free_bird, FREE_BIRD_LENGTH);
113120

MIDAS/src/hilsim/kal.h

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,23 @@ enum sys_instr_t {
4949
RESERVED = 0,
5050
REPORT_EN = 1,
5151
VERIFY_CHECKSUM = 2,
52+
FSM_SET = 3,
5253
};
5354

55+
struct sys_flags_t {
56+
FSMState fsm_target = FSMState::FSM_STATE_COUNT;
57+
};
58+
59+
60+
5461
// System message: instruct the Kamaji driver to do something
5562
// # <INSTR> <data[13]>
5663
// INSTR
5764
// - 0x00 --> reserved
5865
// - 0x01 --> REPORT_EN
59-
inline void k_handle_sys_msg(uint8_t* data, uint16_t crc) {
66+
// - 0x02 --> VERIFY_CHECKSUM
67+
// - 0x03 --> FSM_SET
68+
inline void k_handle_sys_msg(uint8_t* data, uint16_t crc, sys_flags_t* sflags) {
6069
sys_instr_t instr = (sys_instr_t) data[0];
6170

6271
switch(instr) {
@@ -77,6 +86,12 @@ inline void k_handle_sys_msg(uint8_t* data, uint16_t crc) {
7786
}
7887
}
7988
break;
89+
case (sys_instr_t::FSM_SET):
90+
{
91+
FSMState new_fsm = (FSMState) data[1];
92+
sflags->fsm_target = new_fsm;
93+
}
94+
break;
8095
default:
8196
k_INVALIDINSTR();
8297
return;
@@ -99,7 +114,7 @@ inline void k_clear_inbuf() {
99114
}
100115

101116
// ---- Kamaji Thread ----
102-
void hilsim_thread(void* arg);
117+
void hilsim_thread(RocketSystems* arg);
103118

104119
// Run the Kamaji process
105120
[[noreturn]] void k_start();

MIDAS/src/hilsim/stream/main.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,29 @@ class InputReader {
158158
}
159159
};
160160

161+
enum sys_instr_t {
162+
RESERVED = 0,
163+
REPORT_EN = 1,
164+
VERIFY_CHECKSUM = 2,
165+
FSM_SET = 3,
166+
};
167+
168+
// System message: instruct the Kamaji driver to do something
169+
// # <INSTR> <data[13]>
170+
void send_sys_msg(serialib& s, sys_instr_t instr_t, uint8_t* dat, size_t dat_size) {
171+
172+
uint8_t send_buf[17];
173+
uint8_t instr_as_byte = (uint8_t) instr_t;
174+
send_buf[0] = '#';
175+
memcpy(send_buf + 1, &instr_as_byte, 1);
176+
if (dat_size > 0) { memcpy(send_buf + 2, dat, dat_size); }
177+
s.writeBytes(send_buf, sizeof(send_buf));
178+
179+
}
161180

181+
void set_fsm(serialib& s, uint8_t fsm_state) {
182+
send_sys_msg(s, sys_instr_t::FSM_SET, &fsm_state, 1);
183+
}
162184

163185
void send_data(serialib& s, entry_t& dat) {
164186
// $ 4 bytes ts, 1 byte disc, n bytes payload, 2 bytes crc
@@ -222,6 +244,14 @@ int main(int argc, char** argv) {
222244
if(Serial.isDeviceOpen()) {
223245
// do something
224246

247+
int av = Serial.available();
248+
if (av) {
249+
uint8_t buf[256];
250+
Serial.readBytes(buf, 255);
251+
buf[255] = '\0';
252+
printf("from thingy: %s", (char*)buf);
253+
}
254+
225255
// TBD
226256
}
227257

@@ -252,8 +282,27 @@ int main(int argc, char** argv) {
252282
// T <filter_thresh:float> - Entries will be probabilistically skipped if there is high latency. This sets the threshold (in seconds) at which 100% will be skipped.
253283
// If unset / 0, then no entries are skipped
254284

285+
// F <state_id:int> - Set FSM state directly.
286+
255287

256288
switch(_inbuf[0]) {
289+
case 'F':
290+
{
291+
uint8_t fsm_int;
292+
sscanf(_inbuf + 1, " %i", &fsm_int);
293+
294+
if (!Serial.isDeviceOpen()) {
295+
std::cerr << "No serial open" << std::endl;
296+
fflush(stdout);
297+
break;
298+
}
299+
300+
set_fsm(Serial, fsm_int);
301+
printf(".FSM %i\n", fsm_int);
302+
fflush(stdout);
303+
}
304+
305+
break;
257306
case 'i':
258307
{
259308
int discrim_int;

0 commit comments

Comments
 (0)