From a0300a3437723a35236d897e2cea1a235944ff3e Mon Sep 17 00:00:00 2001 From: Maximilien Cuony Date: Sun, 30 Apr 2017 11:29:50 +0200 Subject: Allow to open the relay with SQ using fax mode --- doc/statemachine.svg | 843 +++++++++++++++++++++++------------------ src/common/includes/Core/fsm.h | 12 +- src/common/src/Core/fsm.c | 45 ++- src/common/src/Core/main.c | 1 + 4 files changed, 531 insertions(+), 370 deletions(-) diff --git a/doc/statemachine.svg b/doc/statemachine.svg index 5f851af..2da083f 100644 --- a/doc/statemachine.svg +++ b/doc/statemachine.svg @@ -14,7 +14,7 @@ viewBox="0 0 744.09448819 1052.3622047" id="svg8745" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.92.1 r" sodipodi:docname="statemachine.svg"> @@ -655,6 +655,38 @@ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" transform="scale(0.4) rotate(180) translate(10,0)" /> + + + + + + image/svg+xml - + @@ -709,13 +741,12 @@ id="path9358" style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> OPEN1 + style="font-size:10px;line-height:1.25;font-family:sans-serif">OPEN1 LETTRE + style="font-size:10px;line-height:1.25;font-family:sans-serif">LETTRE QSO + style="font-size:10px;line-height:1.25;font-family:sans-serif">QSO ANTI TEXTETEXTE"HB9G" LONG 73 + style="font-size:10px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle">73 1750 + x="276.16611" + y="391.11063" + style="font-size:7.5px;line-height:1.25;font-family:sans-serif" + id="tspan41891">1750 | (SSTV ON & SQ) délai SQ après 3s + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">SQ après 3s SQ + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">SQ délai 5min &SQ SQ + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">SQ SQ + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">SQ délai 10s + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">délai 10s Durée QSO < 5min + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">Durée QSO < 5min Durée QSO < 10min Durée QSO < 15min + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">Durée QSO < 15min SQ & délai 6s &SQ & délai 6s &pas de QSO + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">pas de QSO SQ & délai 15s + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">SQ & délai 15s SQ + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">SQ SQ SQ + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">SQ SQ + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">SQ SQ + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">SQ Légende + y="651.72021" + style="font-size:14px;line-height:1.25;font-family:sans-serif">Légende Etat avec TX ON + y="691.72021" + style="font-size:10px;line-height:1.25;font-family:sans-serif">Etat avec TX ON @@ -1694,28 +1693,27 @@ ry="16.048639" /> QSO + style="font-size:10px;line-height:1.25;font-family:sans-serif">QSO Etat avec MOD OFF + sodipodi:role="line" + style="font-size:10px;line-height:1.25;font-family:sans-serif">Etat avec MOD OFF LONGUELONGUEBALISE + style="font-size:10px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle">BALISE BALISEQRP/ROS @@ -1893,115 +1889,115 @@ inkscape:connector-curvature="0" sodipodi:nodetypes="cc" /> Fréquences & Vitesse CW + sodipodi:role="line" + style="font-size:14px;line-height:1.25;font-family:sans-serif">Fréquences & Vitesse CW K, U, D, S, R, + y="681.72021" + style="font-size:10px;line-height:1.25;font-family:sans-serif">K, U, D, S, R, Message + sodipodi:role="line" + style="font-size:10px;line-height:1.25;font-family:sans-serif">Message Durée dit + y="666.72021" + style="font-size:10px;line-height:1.25;font-family:sans-serif">Durée dit Fréquence + sodipodi:role="line" + style="font-size:10px;line-height:1.25;font-family:sans-serif">Fréquence 80 ms + sodipodi:role="line" + style="font-size:10px;line-height:1.25;font-family:sans-serif">80 ms 960 Hz + y="711.72021" + style="font-size:10px;line-height:1.25;font-family:sans-serif">960 Hz G, 73, + sodipodi:role="line" + style="font-size:10px;line-height:1.25;font-family:sans-serif">G, 73, 70 ms + y="751.72021" + style="font-size:10px;line-height:1.25;font-family:sans-serif">70 ms 696 Hz + sodipodi:role="line" + style="font-size:10px;line-height:1.25;font-family:sans-serif">696 Hz HI HI, HB9G, + id="tspan45638" + style="font-size:10px;line-height:1.25;font-family:sans-serif">HI HI, HB9G, HB9G 1628m, + y="701.72021" + style="font-size:10px;line-height:1.25;font-family:sans-serif">HB9G 1628m, HB9G JN36BK + id="tspan45648" + style="font-size:10px;line-height:1.25;font-family:sans-serif">HB9G JN36BK   Balise QRP/ROS + y="751.72021" + style="font-size:10px;line-height:1.25;font-family:sans-serif">Balise QRP/ROS Balise longue + y="771.72021" + style="font-size:10px;line-height:1.25;font-family:sans-serif">Balise longue 110 ms + sodipodi:role="line" + style="font-size:10px;line-height:1.25;font-family:sans-serif">110 ms 588 Hz + y="771.72021" + style="font-size:10px;line-height:1.25;font-family:sans-serif">588 Hz Balise courte, + id="tspan45676" + style="font-size:10px;line-height:1.25;font-family:sans-serif">Balise courte, BALISE PENDING + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">BALISE PENDING ROS|QRP + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">ROS|QRP ROS & QRP &ROS & QRP &Intervalle 20min Clarification intervalle petite balise + sodipodi:role="line" + style="font-size:14px;line-height:1.25;font-family:sans-serif">Clarification intervalle petite balise Le timer de balise ne compte que lorsque TX OFF.Le timer de balise ne compte que lorsque TX OFF. Dès que TX est ON pendant plus de 10 minutes, remise à zéro du timer.Dès que TX est ON pendant plus de 10 minutes, remise à zéro du timer. Dès que le timer atteint 20 minutes, TX balise et remise à zéro. + id="tspan46519" + style="font-size:10px;line-height:1.25;font-family:sans-serif">Dès que le timer atteint 20 minutes, TX balise et remise à zéro. @@ -2233,20 +2233,19 @@ ry="19.867081" /> BALISEBALISEOPEN Glutt-o-matique / Machine d'étatsGlutt-o-matique / Machine d'états2016-10-21 HB9EGM - HB9FOH + id="tspan29929" + style="font-size:14px;line-height:1.25;font-family:sans-serif">2016-10-21 HB9EGM - HB9FOH CW fini + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">CW fini + transform="translate(208.71405,-150.6071)"> ODDHOUR BALISEBALISEPENDING + transform="translate(54.482088,-18.971107)"> EVENHOUR @@ -2465,79 +2459,75 @@ sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path9679" - d="m 501.92049,226.04375 c -8.2969,-6.09901 -26.98086,-21.96666 -35.2633,-31.51274" + d="m 548.82792,169.24962 c -8.2969,-6.09901 -26.98086,-21.96666 -35.2633,-31.51274" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker9681)" /> heure paire &uptime>60s heure paire &heure paire &uptime<60s + x="346.49408" + y="480.49994" + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">uptime<60s heure impaire BALISE LONGUEQRP/ROS ROS & QRP + style="font-size:7.5px;line-height:1.25;font-family:sans-serif">ROS & QRP BALISE PENDING + + + SSTV + + + OFF + + + + + LONGUE BALISE |ANTI-BAVARD + SQ & SSTV + + + + SSTV + + ON + + + diff --git a/src/common/includes/Core/fsm.h b/src/common/includes/Core/fsm.h index ef830da..e562241 100644 --- a/src/common/includes/Core/fsm.h +++ b/src/common/includes/Core/fsm.h @@ -58,6 +58,15 @@ enum balise_fsm_state_e { typedef enum balise_fsm_state_e balise_fsm_state_t; +// List of all states the SSTV FSM of the relay can be in +enum sstv_fsm_state_e { + SSTV_FSM_OFF = 0, + SSTV_FSM_ON, +}; + +typedef enum sstv_fsm_state_e sstv_fsm_state_t; + + // All signals that the FSM can read, most of them are actually booleans struct fsm_input_signals_t { /* Signals coming from repeater electronics */ @@ -103,6 +112,8 @@ void fsm_update(void); void fsm_balise_update(void); +void fsm_sstv_update(void); + // Force a BALISE void fsm_balise_force(void); @@ -114,4 +125,3 @@ void fsm_get_outputs(struct fsm_output_signals_t* out); // Announce a state change void fsm_state_switched(const char *new_state); - diff --git a/src/common/src/Core/fsm.c b/src/common/src/Core/fsm.c index 2d57444..dfde399 100644 --- a/src/common/src/Core/fsm.c +++ b/src/common/src/Core/fsm.c @@ -36,6 +36,7 @@ static struct fsm_output_signals_t fsm_out; static fsm_state_t current_state; static balise_fsm_state_t balise_state; +static sstv_fsm_state_t sstv_state; // Keep track of when we last entered a given state, measured // in ms using the timestamp_now() function @@ -82,6 +83,7 @@ void fsm_init() { current_state = FSM_OISIF; balise_state = BALISE_FSM_EVEN_HOUR; + sstv_state = SSTV_FSM_OFF; qso_info.qso_occurred = 0; qso_info.qso_start_time = timestamp_now(); @@ -127,6 +129,14 @@ static const char* balise_state_name(balise_fsm_state_t state) { } } +static const char* sstv_state_name(sstv_fsm_state_t state) { + switch (state) { + case SSTV_FSM_OFF: return "SSTV_FSM_OFF"; + case SSTV_FSM_ON: return "SSTV_FSM_ON"; + default: return "ERROR!"; + } +} + static fsm_state_t select_grande_balise(void) { if (fsm_in.qrp || fsm_in.swr_high) { return FSM_BALISE_SPECIALE; @@ -163,7 +173,7 @@ static const char* fsm_select_letter(void) { else if (fsm_in.qrp) { return letter_qrp; } - else if (fsm_in.sstv_mode) { + else if (fsm_in.sstv_mode || sstv_state == SSTV_FSM_ON) { return letter_sstv; } @@ -202,7 +212,7 @@ void fsm_update() { short_beacon_counter_s++; } - if (fsm_in.tone_1750) { + if (fsm_in.tone_1750 | (fsm_in.sq && sstv_state == SSTV_FSM_ON)) { next_state = FSM_OPEN1; } else if (balise_state == BALISE_FSM_PENDING) { @@ -619,3 +629,34 @@ void fsm_balise_update() { balise_state = next_state; } + +void fsm_sstv_update() { + + sstv_fsm_state_t next_state = sstv_state; + + switch (sstv_state) { + case SSTV_FSM_OFF: + if (fsm_in.sq && fsm_in.sstv_mode) { + next_state = SSTV_FSM_ON; + } + break; + case SSTV_FSM_ON: + if (current_state == FSM_BALISE_LONGUE || + current_state == FSM_ANTI_BAVARD) { + next_state = SSTV_FSM_OFF; + } + break; + + default: + // Should never happen + next_state = SSTV_FSM_OFF; + break; + } + + if (next_state != sstv_state) { + fsm_state_switched(sstv_state_name(next_state)); + } + + sstv_state = next_state; + +} diff --git a/src/common/src/Core/main.c b/src/common/src/Core/main.c index 80e6ce9..3fe441f 100644 --- a/src/common/src/Core/main.c +++ b/src/common/src/Core/main.c @@ -561,6 +561,7 @@ static void exercise_fsm(void __attribute__ ((unused))*pvParameters) fsm_update_inputs(&fsm_input); fsm_update(); fsm_balise_update(); + fsm_sstv_update(); struct fsm_output_signals_t fsm_out; fsm_get_outputs(&fsm_out); -- cgit v1.2.3