rcbench
Servo and ESC test bench: panel, IOmcu and shared C
Loading...
Searching...
No Matches
panel.h File Reference

What the panel's files share: firmware/panel/main/main.c and the files cut from it. One section per file, each holding what that file defines and another file uses. A file's own state stays static in that file. More...

#include <stdatomic.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include "art_store.h"
#include "esp_timer.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include "arming.h"
#include "bench_state.h"
#include "log_cols.h"
#include "bind_link.h"
#include "card_tree.h"
#include "busfault_screen.h"
#include "coproc_update_screen.h"
#include "endpoints_link.h"
#include "files_screen.h"
#include "hitec_link.h"
#include "hitec_prog.h"
#include "hitec_rx_link.h"
#include "kst_link.h"
#include "kst_prog.h"
#include "link_bringup.h"
#include "link_host.h"
#include "link_pages.h"
#include "link_port.h"
#include "link_update_host.h"
#include "log_cadence.h"
#include "log_take.h"
#include "log_writer.h"
#include "log_viewer_screen.h"
#include "motor_screen.h"
#include "out_bind.h"
#include "outputs.h"
#include "prog_link.h"
#include "safety_gate.h"
#include "sense_link.h"
#include "sense_map_link.h"
#include "servo_link.h"
#include "servo_page.h"
#include "servo_screen.h"
#include "servo_source.h"
#include "servo_test_io.h"
#include "supply.h"
#include "supply_link.h"
#include "supply_screen.h"
#include "telemetry_sim.h"
#include "tone_link.h"
#include "touch_loss.h"
#include "touch_types.h"
#include "ui_alert_slot.h"
#include "ui_screen.h"

Go to the source code of this file.

Data Structures

struct  servo_win_item_t
struct  cu_snap_t
struct  panel_snap_t
struct  log_row_t
 One sample on its way to the card, filled by the control task. More...
struct  test_line_t
struct  panel_cmd_t
struct  touch_item_t
struct  supply_item_t
struct  knob_turn_t

Macros

#define PANEL_CH_THROTTLE   0u
#define ALERT_MAX   UI_ALERT_MAX
#define CONTROL_PERIOD_MS   5u
#define LOG_Q_LEN   64
#define LOG_NOTE_MAX   208
#define LOG_NOTE_Q_LEN   4
#define TEST_Q_LEN   24
#define PROG_PORTS_NONE   0xFFFFFFFFu
#define DRIVE_PWM_BIT   (1u << 16)
#define DRIVE_HELD_SHIFT   20u
#define PANEL_SAMPLE_HZ   20.0f

Enumerations

enum  log_folder_t { LOG_FOLDER_AUTO = 0 , LOG_FOLDER_USER , LOG_FOLDERS }
enum  panel_cmd_kind_t {
  PANEL_CMD_MOTOR = 0 , PANEL_CMD_SERVO , PANEL_CMD_STOP , PANEL_CMD_OUTPUTS ,
  PANEL_CMD_SUPPLY
}

Functions

static uint32_t now_ms (void)
static void snap_lock (void)
static void snap_unlock (void)
uint32_t control_alert_numbered (const char *text)
gfx_canvas_t * panel_canvas (void)
 The canvas the next frame is drawn on (display_canvas()), after what Screen rotation asks of the UI: a whole repaint when the canvas changed between a logical buffer and a frame buffer, and the band's alert when 180° fell back to NORMAL. Every loop that renders takes its canvas here, on the task that flips (panel_frame.c).
void control_alert_withdraw (uint32_t gen)
static void control_alert (const char *text)
static void throttle_to_zero (void)
static supply_wiring_t wiring_of (unsigned word)
static supply_wiring_t pdmini_wiring (void)
void publish_sense (void)
sense_setup_t sense_wanted (void)
tone_setup_t tone_wanted (void)
 Returns the phase tap's set-up as SETUP INTERFACES left it, copied under the spinlock.
void control_pump (void)
 Drains the touch driver's queue, answers sequence gaps, applies a STOP at its press and passes the events on to the render loop.
void esc_profiles_load (void)
card_dir_t panel_card_make_dir (void *ctx, const char *level)
void kst_record_write (void)
void kst_record_load (bool late)
void hitec_record_write (void)
 Write the text the render loop handed over, on the logger task: HITEC.NEW, then its name HITEC.TXT. Nothing when none waits.
void hitec_record_load (void)
 Read the record from the card into the Hitec programmer, once, at the start before the tasks run.
void kst_card_serve (void)
void log_set_folder (log_folder_t kind, const char *dir)
void log_open_marks (log_marks_t *marks, char *run_dir, char *test_dir)
bool log_fault_busy (void)
 Whether the logger may write a fault log line now: one queued in s_note_q, or under way. The file manager's bench reads it (fm_bench_t.fault_busy).
void log_fault_lock (void)
 Take the fault log's lock, which the logger holds across each line's open, write and close. The file manager holds it across an unlink and a rename: FatFs runs without its file lock (CONFIG_FATFS_FS_LOCK 0) and removes a file open for append. Neither holder takes another lock under it.
void log_fault_unlock (void)
 Give the fault log's lock back.
void log_task (void *arg)
 Everything that touches the card.
void log_post (log_row_t *row)
bool exchange (link_host_t *host, const link_msg_t *req, link_msg_t *reply)
static bool poll_page (link_host_t *host, uint8_t page, uint8_t count, link_msg_t *reply)
static bool read_regs (link_host_t *host, uint8_t page, uint8_t offset, uint8_t count, link_msg_t *reply)
uint32_t port_now (void *ctx)
void port_between (void *ctx)
static bool write_regs (link_host_t *host, uint8_t page, uint8_t offset, uint8_t count, const uint16_t *regs, link_msg_t *reply)
static bool control_write (bool armed, link_msg_t *reply)
bool control_arm (link_msg_t *reply)
bool poles_service (void)
void endpoints_service (bool far_disarmed)
static bool far_line_trusted (bool *answered)
void far_end_stop_here (void)
void arm_write_failed (uint32_t quiet_before, const char *alert)
static bool control_clear_failsafe (link_msg_t *reply)
void link_lost_report (busfault_report_t *r)
void link_report (void)
 One block naming the most fundamental fault rather than the loudest. Printed every 5s while the link is down and every 60s while it is up.
static bool read_bench (link_host_t *host, bench_state_t *out)
void prog_ports_publish (void)
void prog_ports_lost (void)
void prog_ports_init_screens (void)
void prog_ports_to_screens (void)
void kst_port_look (void)
void sense_link_alerts (void)
void sense_link_service (bool idle, bench_state_t *bench)
void publish_limits (void)
 Takes the LIMIT and WATCHES rows for the control task; app_main, from the SENSORS observer.
void sense_limit_came_up (uint16_t minor)
 The link came up; control task.
void sense_limit_lost (void)
 The link went; control task. Clears s_sense_limits.
void sense_limit_service (void)
 Serves SENSE_LIMIT, at most 2 exchanges, and sends the next band alert; control task, every poll.
void sense_map_came_up (uint16_t minor)
void sense_map_lost (void)
void sense_map_service (bool idle)
void sense_win_service (void)
void sense_win_attach (bench_state_t *b, bool ring)
bool sense_log_cols (log_cols_t *out)
void tone_link_alerts (void)
void tone_link_service (void)
void kst_commands (void)
void kst_link_service (void)
void prog_link_service (void)
void hitec_rx_service (void)
void kst_publish (kst_prog_feed_t *f)
void hitec_commands (void)
 The Hitec programmer's commands, at most 4 a pass; control task.
void hitec_pass (bool link_up)
 One pass of the HITEC page's module; control task, every pass.
bool hitec_taken (void)
 Whether the HITEC page holds a port or a request runs.
void hitec_publish (hitec_prog_feed_t *f)
 What the Hitec programmer's model is fed; under the snapshot's lock.
static void prog_drive_publish (void)
void read_outputs_binding (void)
void post_no_reading (void)
bool poll_far_end (bool *link_up, bench_state_t *bench, uint32_t *last_poll, uint32_t *last_status)
void advance_model_and_log (bool link_up, float emitted, telemetry_sim_t *sim, bench_state_t *bench, bool *new_sample)
void publish_snapshot (const bench_state_t *bench, bool link_up, bool new_sample)
void publish_throttle_ramp (void)
static uint16_t panel_throttle_ramp (void)
static void render_progress (void)
 The render task made progress: a pass of its loop, or one card read inside a pass. Render task only.
void log_follow_runs (void)
void supply_log_tail (void)
void supply_switch (bool on)
void supply_follow_set (void)
static void supply_follow_stops (void)
static void supply_service (void)
void apply_supply_cmd (const panel_cmd_t *pc)
void supply_pump (void)
void supply_link_service (void)
void control_setup (telemetry_sim_t *sim, bench_state_t *bench)
void arm_watch_service (bool link_up)
void service_arming (bool link_up)
 The latched stop and the act the arming policy asks for, once a pass of the control task: the router's backstop STOP unless the pump counted the same press, the let-go every stop owes, the supply, then the arm or the disarm.
bool disarm_here (bool link_up)
void drain_commands (bool link_up, bench_state_t *bench)
void kst_ui_service (void)
void hitec_ui_service (void)
 The Hitec programmer's model, once a frame on app_main.
bool supply_live_or_coming (void)
void publish_supply_levels (void)
void test_lines_service (void)
knob_turn_t knob_take (void)
void knob_apply (const knob_turn_t *turn, bool frame_lost)
void flush_screen_commands (uint32_t stops_now)
bool drain_touch (uint32_t stops_now)
 Hand the screens what the control task saw of the panel. Render loop only.
void outputs_apply (const outbind_t *b)
void drawing_for_picker (uint16_t board)
void drawing_follow (void)
void art_keep_service (void)
void art_stop (const char *why)
void art_begin (uint16_t board)
void art_slice (void)
bool cu_may_start (void)
void cu_link_up (const link_msg_t *reply)
bool cu_service (bool *link_up, bench_state_t *bench, uint32_t *last_poll, uint32_t *last_status)
void wifi_service (bool armed, uint32_t stops_now)
void upd_remind_service (bool armed, bool unsafe, const cu_snap_t *cs)
void upd_service (bool armed, bool unsafe, uint32_t stops_now, const cu_snap_t *cs)
 SETUP > UPDATES, the reminder and the download, once a frame.
void cu_render_service (bool unsafe, bool link_up, const cu_snap_t *cs)

Variables

link_host_t s_host
atomic_uint s_capabilities
link_bringup_t s_bring
atomic_uint s_link_lost_ms
bool s_link_lost_shown
uint32_t s_recoveries
uint32_t s_recoveries_total
float s_mcu_c
 Read and published by the control task; app_main takes it from the snapshot with everything else that crosses between the two.
bind_reading_t s_outputs_read
bool s_outputs_read_fresh
bind_read_t s_bind_read
uint16_t s_far_minor
uint16_t s_board
QueueHandle_t s_kst_q
QueueHandle_t s_hitec_q
 The model's commands, app_main -> control task.
QueueHandle_t s_sample_q
QueueHandle_t s_enc_q
QueueHandle_t s_win_q
SemaphoreHandle_t s_snap_lock
panel_snap_t s_snap
outputs_t s_out
arming_t s_arm
uint16_t s_throttle_hundredths
atomic_bool s_disarm_request
atomic_uint s_supply_vin_mv
atomic_uint s_supply_baud
uint32_t s_arm_gen
atomic_bool s_poles_owed
atomic_uint s_poles_value
endpoints_debt_t s_endpoints
 The throttle's pulse endpoints, Idle pulse and Full pulse, on their way to the IOmcu.
atomic_uint s_pdmini_wiring
bool s_pump_live
atomic_ullong s_servo_pins
atomic_bool s_servo_pins_known
atomic_bool s_enc_held
const files_io_t k_files_io
 FILES' way to the card: its requests run on the task cardjob.
const log_viewer_io_t k_card_io
atomic_uint s_log_open_run
atomic_uint s_test_open_run
atomic_uint s_test_open_txt
atomic_uint s_card_written
atomic_int s_card_written_tab
char s_kst_file [KST_PROG_FILE_MAX]
size_t s_kst_file_len
unsigned s_kst_file_mount
atomic_uint s_kst_file_sent
atomic_uint s_kst_file_done
atomic_bool s_kst_file_ok
char s_hitec_file [HITEC_CARD_TEXT_MAX]
 The record's text, as hitec_card_text() writes it.
size_t s_hitec_file_len
 The bytes of s_hitec_file to write; 0 removes the record.
unsigned s_hitec_file_mount
 The mount the text is written to (storage_mount_count()).
atomic_uint s_hitec_file_sent
 Texts the render loop handed over; one ahead of s_hitec_file_done while one waits.
atomic_uint s_hitec_file_done
 Texts the logger has written or given up on.
atomic_bool s_hitec_file_ok
 Whether the card took the last text whole.
kst_prog_card_req_t s_kst_card_req
unsigned s_kst_card_mount
kst_prog_card_done_t s_kst_card_done
atomic_uint s_kst_card_sent
atomic_uint s_kst_card_answered
QueueHandle_t s_log_q
QueueHandle_t s_note_q
SemaphoreHandle_t s_note_mx
 The fault log's lock (log_fault_lock()).
QueueHandle_t s_test_q
atomic_uint s_log_run_now
atomic_uint s_test_opens_sent
atomic_uint s_test_opens_done
unsigned s_test_ends_sent
atomic_uint s_test_ends_done
atomic_int s_test_file
atomic_bool s_test_report
log_cadence_t s_log_cad
log_run_kind_t s_log_kind
atomic_bool s_servo_testing
uint32_t s_unanswered
bool s_link_is_up
bool s_link_quiet
const link_port_t k_port
uint16_t s_arm_value
sense_link_t s_sense_link
servo_source_t s_servo_source
tone_link_t s_tone_link
kst_link_t s_kst_link
prog_link_t s_prog_link
atomic_uint s_prog_want_target
atomic_bool s_prog_want_pwm
atomic_uint s_prog_pin
atomic_uint s_prog_ports
atomic_uint s_drive
bool s_prog_taken
 Whether a servo programmer, KST or Hitec, has a port or an operation under way: the bench takes no arm and no supply change then. Control task only; kst_port_look().
kst_prog_gate_t s_kst_gate
atomic_uint s_sense_unheld
atomic_uint s_tone_unheld
hitec_rx_link_t s_hitec_rx_link
atomic_uint s_hitec_rx_want
atomic_uint s_hitec_rx_mark
sense_map_link_t s_sense_map
atomic_uint s_sense_parts
atomic_uint s_sense_limits
 sensors_rows_set_limits()'s word; control task writes, app_main reads.
hitec_link_t s_hitec_link
 The HITEC page's module (4.23); control task only.
hitec_prog_gate_t s_hitec_gate
 The gate the Hitec programmer's commands are claimed at; the one part both tasks touch.
atomic_ullong s_throttle_pins
atomic_bool s_throttle_pins_known
atomic_uint s_throttle_proto
atomic_uint s_throttle_ramp
atomic_int s_outputs_result
QueueHandle_t s_touch_q
QueueHandle_t s_supply_q
atomic_bool s_stop_request
atomic_uint s_stop_counted
atomic_uint s_lets_go
atomic_bool s_supply_off_request
atomic_uint s_supply_offs
atomic_uint s_supply_set_mv
atomic_uint s_supply_set_ma
atomic_uint s_supply_vmax_mv
atomic_uint s_supply_imax_ma
atomic_uint s_supply_trip_ma
atomic_uint s_supply_trip_mv
atomic_uint s_supply_trip_ms
atomic_uint s_supply_ack
atomic_bool s_supply_live
atomic_uint s_supply_ons_sent
atomic_uint s_supply_ons_taken
atomic_uint s_pdmini_edits
atomic_bool s_supply_real
atomic_uint s_drv_gaps
atomic_uint s_tq_published
uint32_t s_lost_notice_seq
atomic_uint s_loss_gen
atomic_uint s_arm_ack
atomic_uint s_render_progress
 The render loop's progress, for the control task's watchdog; see frame_watch.h and main.c.
uint32_t s_arm_take_gen
uint32_t s_arm_take_drv
arm_watch_t s_arm_watch
float s_log_t
QueueHandle_t s_cmd_q
supply_sim_t s_supply_sim
supply_link_t s_supply_link
atomic_uint s_supply_adopt_mv
atomic_uint s_supply_adopt_ma
atomic_uint s_supply_adopt_gen
atomic_uint s_supply_adopt_done
atomic_uintptr_t s_escsim_profile
atomic_uint s_escsim_runs
bool s_supply_page
bool s_supply_auto
bool s_supply_is_real
supply_state_t s_supply
uint32_t s_supply_ms
uint32_t s_supply_stops_served
uint32_t s_supply_step_ms
uint32_t s_supply_gen
bench_totals_t s_totals
uint32_t s_totals_ms
log_rail_t s_rail
 The supply's last reading for a SERVO run's rows (log_rail_t). Control task only.
bench_totals_t s_rail_totals
 The run's totals of s_rail since the arm. Control task only.
atomic_uint s_servo_log
 The SERVO screen's pulse and angle for a SERVO run's rows, packed (log_servo_pack()): stored by the render side each frame, read by the control task.
unsigned s_tq_lost
const art_flash_t * s_artflash
bool s_artbusy
atomic_bool s_keeping
SemaphoreHandle_t s_draw_lock
uint8_t * s_drawpub
uint8_t * s_drawshow
atomic_bool s_fw_quiet_req
atomic_bool s_fw_quiet_ack
bool s_wifi_ok
link_uph_mismatch_t s_mismatch

Detailed Description

What the panel's files share: firmware/panel/main/main.c and the files cut from it. One section per file, each holding what that file defines and another file uses. A file's own state stays static in that file.

Nothing in shared/ includes this header.

SPDX-License-Identifier: MIT

Function Documentation

◆ drain_touch()

bool drain_touch ( uint32_t stops_now)

Hand the screens what the control task saw of the panel. Render loop only.

Parameters
stops_nowthe stop count the commands flushed here carry
Returns
whether the stream was found broken

◆ hitec_pass()

void hitec_pass ( bool link_up)

One pass of the HITEC page's module; control task, every pass.

Parameters
link_upwhether the IOmcu answers

◆ hitec_publish()

void hitec_publish ( hitec_prog_feed_t * f)

What the Hitec programmer's model is fed; under the snapshot's lock.

Parameters
freceives the feed

◆ hitec_record_load()

void hitec_record_load ( void )

Read the record from the card into the Hitec programmer, once, at the start before the tasks run.

Read the record from the card at the start (panel.h).

Read the record from the card into the Hitec programmer, once, at the start before the tasks run.

◆ hitec_record_write()

void hitec_record_write ( void )

Write the text the render loop handed over, on the logger task: HITEC.NEW, then its name HITEC.TXT. Nothing when none waits.

Write the text the render loop handed over (panel.h).

Write the text the render loop handed over, on the logger task: HITEC.NEW, then its name HITEC.TXT. Nothing when none waits.

◆ hitec_taken()

bool hitec_taken ( void )

Whether the HITEC page holds a port or a request runs.

Returns
true while it does

◆ hitec_ui_service()

void hitec_ui_service ( void )

The Hitec programmer's model, once a frame on app_main.

The Hitec programmer's model, once a frame on app_main: it reads what the control task published (hitec_publish()), and its commands go to the control task's queue.

The Hitec programmer's model, once a frame on app_main.

A command the queue does not take stays with the model; one the model hands over and the queue then refuses is lost, and the model says so when its answer does not come (HITEC_PROG_MSG_TIMEOUT).

◆ link_report()

void link_report ( void )

One block naming the most fundamental fault rather than the loudest. Printed every 5s while the link is down and every 60s while it is up.

The verdict judges the window since the previous report, not the session: one burst of late answers at an IOmcu drop is the verdict of the report that covers it, and a link that is healthy again reads as healthy at the next one. The first report's window is everything since start-up. A window of under 4 polls says "link healthy" (link_bringup_diagnose()). A link that is down gets one identity probe about every 1000ms (poll_far_end()'s gate; an unanswered probe waits LINK_HOST_TIMEOUT_MS, 1000ms, of it), so a 5s window holds 4 or 5 polls and a silent link reads as silent.

The panel and iomcu lines keep the totals since start-up; the window's counts have a line of their own.

◆ log_fault_busy()

bool log_fault_busy ( void )

Whether the logger may write a fault log line now: one queued in s_note_q, or under way. The file manager's bench reads it (fm_bench_t.fault_busy).

Returns
true while a line waits or is written

◆ log_task()

void log_task ( void * arg)

Everything that touches the card.

On the control task's core and below it in priority: the control task blocks for CONTROL_PERIOD_MS (5ms) every pass and inside every receive window of a link exchange, and this runs in those gaps. It touches no PSRAM, so it does not share bandwidth with the display's scan-out.

Parameters
argUnused.

◆ panel_canvas()

gfx_canvas_t * panel_canvas ( void )

The canvas the next frame is drawn on (display_canvas()), after what Screen rotation asks of the UI: a whole repaint when the canvas changed between a logical buffer and a frame buffer, and the band's alert when 180° fell back to NORMAL. Every loop that renders takes its canvas here, on the task that flips (panel_frame.c).

Returns
the canvas

◆ sense_limit_came_up()

void sense_limit_came_up ( uint16_t minor)

The link came up; control task.

Parameters
minorthe IOmcu's protocol minor; below 27 nothing is sent to SENSE_LIMIT.

◆ service_arming()

void service_arming ( bool link_up)

The latched stop and the act the arming policy asks for, once a pass of the control task: the router's backstop STOP unless the pump counted the same press, the let-go every stop owes, the supply, then the arm or the disarm.

Parameters
link_upwhether the link to the IOmcu answers

◆ tone_wanted()

tone_setup_t tone_wanted ( void )

Returns the phase tap's set-up as SETUP INTERFACES left it, copied under the spinlock.

Returns
the set-up

◆ upd_service()

void upd_service ( bool armed,
bool unsafe,
uint32_t stops_now,
const cu_snap_t * cs )

SETUP > UPDATES, the reminder and the download, once a frame.

Once a frame, after wifi_service(): the start-up check, what UPDATES and the reminder ask for, the job's aborts, the download's screen, and what UPDATES shows. armed includes an arm waiting; panel.h names each parameter.

Parameters
armedARMED, or an arm waiting
unsafeARMED, an arm waiting, or the supply's output on or coming on
stops_nowSTOP presses since the start; a change is a STOP
csthe IOmcu update's state this frame

SETUP > UPDATES, the reminder and the download, once a frame.

Variable Documentation

◆ k_files_io

const files_io_t k_files_io
extern

FILES' way to the card: its requests run on the task cardjob.

FILES' way to the card: its requests run on cardjob.

FILES' way to the card: its requests run on the task cardjob.

◆ s_cmd_q

QueueHandle_t s_cmd_q
extern

app_main -> control task

◆ s_enc_q

QueueHandle_t s_enc_q
extern

control task -> app_main

◆ s_endpoints

endpoints_debt_t s_endpoints
extern

The throttle's pulse endpoints, Idle pulse and Full pulse, on their way to the IOmcu.

Published the way the pole count is, and for the same reason: the settings screen writes the model from app_main and the control task owns the link, so the values travel in atomics beside the debt rather than being read from settings.c on the control task (endpoints_link.h).

The time of the last edit travels too. A key held on + or - steps the value every few hundred milliseconds, and each write of CHAN_CFG is a flash write at the far end; the debt is paid once the value has rested for ENDPOINTS_SETTLE_MS.

Its hold is raised at a link-up edge, control task only: the far end is held disarmed until its throttle endpoints have been brought to the settings. A bench armed with no link – the simulator, or a cable pulled mid-run – would otherwise arm an IOmcu that has just answered on whatever range it kept in flash, and keep that range for the whole run.

◆ s_hitec_file

char s_hitec_file[HITEC_CARD_TEXT_MAX]
extern

The record's text, as hitec_card_text() writes it.

The record's text (panel.h).

The record's text, as hitec_card_text() writes it.

◆ s_hitec_file_done

atomic_uint s_hitec_file_done
extern

Texts the logger has written or given up on.

Texts written or given up on (panel.h).

Texts the logger has written or given up on.

◆ s_hitec_file_len

size_t s_hitec_file_len
extern

The bytes of s_hitec_file to write; 0 removes the record.

The bytes of s_hitec_file to write (panel.h).

The bytes of s_hitec_file to write; 0 removes the record.

◆ s_hitec_file_mount

unsigned s_hitec_file_mount
extern

The mount the text is written to (storage_mount_count()).

The mount the text is written to (panel.h).

The mount the text is written to (storage_mount_count()).

◆ s_hitec_file_ok

atomic_bool s_hitec_file_ok
extern

Whether the card took the last text whole.

Whether the card took the last text whole (panel.h).

Whether the card took the last text whole.

◆ s_hitec_file_sent

atomic_uint s_hitec_file_sent
extern

Texts the render loop handed over; one ahead of s_hitec_file_done while one waits.

Texts handed over (panel.h).

Texts the render loop handed over; one ahead of s_hitec_file_done while one waits.

◆ s_hitec_gate

hitec_prog_gate_t s_hitec_gate
extern

The gate the Hitec programmer's commands are claimed at; the one part both tasks touch.

The gate a command in the queue is claimed at (hitec_prog.h).

The gate the Hitec programmer's commands are claimed at; the one part both tasks touch.

◆ s_hitec_link

hitec_link_t s_hitec_link
extern

The HITEC page's module (4.23); control task only.

The HITEC page's module (4.23). Control task only.

The HITEC page's module (4.23); control task only.

◆ s_hitec_q

QueueHandle_t s_hitec_q
extern

The model's commands, app_main -> control task.

app_main -> control task

◆ s_kst_q

QueueHandle_t s_kst_q
extern

app_main -> control task

◆ s_log_q

QueueHandle_t s_log_q
extern

control task -> logger, one row each

◆ s_note_q

QueueHandle_t s_note_q
extern

control task -> logger, one line each

◆ s_prog_taken

bool s_prog_taken
extern

Whether a servo programmer, KST or Hitec, has a port or an operation under way: the bench takes no arm and no supply change then. Control task only; kst_port_look().

Whether a servo programmer, KST or Hitec, has a port or an operation under way: the bench takes no arm then (kst_prog.h, hitec_prog.h), and the supply's set points are the port's.

Whether a servo programmer, KST or Hitec, has a port or an operation under way: the bench takes no arm and no supply change then. Control task only; kst_port_look().

Control task only. Read once a pass by kst_port_look(), before the arms of the pass are served: no command of a programmer is taken between the two. A HITEC port another writer holds counts: the bench console's, or one held over a panel restart, until RELEASE PORT closes it.

◆ s_render_progress

atomic_uint s_render_progress
extern

The render loop's progress, for the control task's watchdog; see frame_watch.h and main.c.

The render loop's progress: moved once a pass of panel_frame_loop() and once per card read the loop makes on LOGS (panel_card.c), read by the control task's watchdog (frame_watch.h, control_pump()).

The render loop's progress, for the control task's watchdog; see frame_watch.h and main.c.

◆ s_sample_q

QueueHandle_t s_sample_q
extern

control task -> app_main

◆ s_sense_limits

atomic_uint s_sense_limits
extern

sensors_rows_set_limits()'s word; control task writes, app_main reads.

SETUP > SENSORS' LIMIT marks, sensors_rows_set_limits()'s word. Control task writes, app_main reads.

sensors_rows_set_limits()'s word; control task writes, app_main reads.

◆ s_servo_log

atomic_uint s_servo_log
extern

The SERVO screen's pulse and angle for a SERVO run's rows, packed (log_servo_pack()): stored by the render side each frame, read by the control task.

The pulse and the angle the render side last handed over (log_servo_pack()), none until it does.

The SERVO screen's pulse and angle for a SERVO run's rows, packed (log_servo_pack()): stored by the render side each frame, read by the control task.

◆ s_stop_counted

atomic_uint s_stop_counted
extern

s_touch_q number of a counted STOP, 0 none

◆ s_supply_q

QueueHandle_t s_supply_q
extern

control task -> app_main

◆ s_test_q

QueueHandle_t s_test_q
extern

render loop -> logger

◆ s_touch_q

QueueHandle_t s_touch_q
extern

control task -> app_main

◆ s_win_q

QueueHandle_t s_win_q
extern

control task -> app_main