From fb6c3cbb7b071ab20b7d06bcf0f4530a29712ff7 Mon Sep 17 00:00:00 2001 From: kuwoyuki Date: Thu, 4 Dec 2025 18:26:02 +0600 Subject: [PATCH] feat: add ++dmm_loop cmd ++dmm_loop <0|1> to disable the HP3478A DMM loop, if for some reason the DMM app loop is interfering with the GPIB bus when used as a USB-GPIB controller --- inc/config.h | 3 ++- main.c | 50 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/inc/config.h b/inc/config.h index 3f15b21..a0d36fc 100644 --- a/inc/config.h +++ b/inc/config.h @@ -30,7 +30,7 @@ #define MENU_COMMIT_DELAY_MS 2400 // Time to hold before entering mode #define MENU_SUBLAYER_DELAY_MS 500 // Time to "hover" before dots start #define MENU_DEBOUNCE_MS 100 // Button press dead-time -#define MENU_LOCKOUT_MS 1000 // How long to ignore SRQ for after exiting menu +#define MENU_LOCKOUT_MS 200 // How long to ignore SRQ for after exiting menu // Polling #define POLL_INTERVAL_MS 100 // 10Hz polling when in Passthrough @@ -76,6 +76,7 @@ #define BUZZER_CHIRP_HZ 3000 #define BUZZER_CHIRP_MS 75 #define BUZZER_CONT_HZ 2500 +#define BUZZER_ONLINE_TUNE 0 // todo: add to conf // #define LOCAL_COMMIT 1 diff --git a/main.c b/main.c index 2908a17..ce9b0dc 100644 --- a/main.c +++ b/main.c @@ -60,11 +60,12 @@ typedef enum { CMD_CFG_SET, CMD_CFG_GET, CMD_CFG_LIST, - CMD_SAVECFG, // Save configuration - CMD_RST, // Reset the controller - CMD_ADDR, // Set GPIB primary address - CMD_MODE, // Set Controller vs Device mode (we're always the controller) - CMD_TIMEOUT, // Set read timeouts + CMD_SAVECFG, // Save configuration + CMD_RST, // Reset the controller + CMD_ADDR, // Set GPIB primary address + CMD_MODE, // Set Controller vs Device mode (we're always the controller) + CMD_TIMEOUT, // Set read timeouts + CMD_DMM_LOOP, // Toggle extra HP3478A features // Data transport/formatting CMD_READ, // Read data from bus @@ -273,7 +274,8 @@ typedef struct { uint8_t dmm_online : 1; uint8_t has_saved_state : 1; uint8_t tone_timer_pending : 1; - uint8_t reserved : 2; + uint8_t dmm_loop : 1; + uint8_t reserved : 1; uint32_t usb_timeout_cycles; // calculated from sys_cfg.usb_timeout_target_ms @@ -346,6 +348,7 @@ static const cmd_entry_t COMMAND_TABLE[] = { {"mode", CMD_MODE}, // 0=Device, 1=Controller {"tmo", CMD_TIMEOUT}, // Set read timeout {"read_tmo_ms", CMD_TIMEOUT}, + {"dmm_loop", CMD_DMM_LOOP}, // Toggle extra feats // Protocol/formatting {"auto", CMD_AUTO}, // Auto-read data after write @@ -608,6 +611,8 @@ inline static void config_apply_to_app(void) { app.usb_timeout_cycles = ((FUNCONF_SYSTEM_CORE_CLOCK / 1000 * sys_cfg.usb_timeout_target_ms) / CYCLES_PER_LOOP); + app.dmm_loop = 1; // again, preferably read from config if someone wants this + // to be persistent } static void config_reset_defaults(void) { @@ -1929,10 +1934,9 @@ static void handle_env_sensor(void) { uint32_t now = millis(); - if ((now - app.env_last_read) >= sys_cfg.env_sensor_read_interval_ms) { - if (aht20_read(&app.current_env) == AHT20_OK) { - app.env_last_read = now; - } + if (((now - app.env_last_read) >= sys_cfg.env_sensor_read_interval_ms) && + aht20_read(&app.current_env) == AHT20_OK) { + app.env_last_read = now; } } @@ -2765,6 +2769,7 @@ static void cmd_help(void) { " ++eor <0-7> Read Stop: 0:CRLF ... 7:EOI-Only\r\n" " ++eot_enable Append extra char to read output\r\n" " ++eot_char The char to append\r\n" + " ++dmm_loop <0|1> Toggle HP3478A loop, if it conflicts w/ GPIB bus\r\n" "\r\n" "[System Configuration]\r\n" " ++config List all configurable parameters\r\n" @@ -2808,10 +2813,12 @@ static void cmd_status(void) { "EOR : %d\r\n" "EOI : %d\r\n" "EOT : %s (%d)\r\n" - "SRQ : %d\r\n", + "SRQ : %d\r\n" + "DMM_LOOP : %d\r\n", sys_cfg.target_addr, sys_cfg.gpib_timeout_ms, sys_cfg.auto_read, sys_cfg.eos_mode, sys_cfg.eor_mode, sys_cfg.eoi_assert, - sys_cfg.eot_enable ? "ON" : "OFF", sys_cfg.eot_char, srq); + sys_cfg.eot_enable ? "ON" : "OFF", sys_cfg.eot_char, srq, + app.dmm_loop); usb_send_text(scratch.cmd.fmt_buf); } @@ -2948,6 +2955,16 @@ static void process_command(void) { } break; + case CMD_DMM_LOOP: + if (*p_args) { + app.dmm_loop = (atoi(p_args) ? true : false); + exit_to_passthrough(); + gpib_interface_clear(); + } else { + usb_send_text(app.dmm_loop ? "1\r\n" : "0\r\n"); + } + break; + case CMD_SAVECFG: config_save(); break; @@ -3277,7 +3294,7 @@ do_read_operation: { } } -static void app_loop(void) { +static void dmm_loop(void) { uint32_t now = millis(); if (app.tone_timer_pending) { @@ -3322,8 +3339,9 @@ static void app_loop(void) { gpib_interface_clear(); app.dmm_online = true; +#if defined(BUZZER_ONLINE_TUNE) && BUZZER_ONLINE_TUNE play_tune(ONLINE_NOTES); - +#endif gpib_send(sys_cfg.dmm_addr, HP3478A_CMD_MASK_BTN_ONLY HP3478A_CMD_SRQ_CLEAR); gpib_go_to_local(sys_cfg.dmm_addr); @@ -3408,7 +3426,9 @@ int main() { while (1) { handle_usb_state(); usb_process_tx(); - app_loop(); + if (app.dmm_loop) { + dmm_loop(); + } handle_env_sensor(); if (app.usb_online) {