Changes made based on pr feedback.

This commit is contained in:
PhosphorosVR
2025-09-23 01:46:53 +02:00
parent 15641753f0
commit e47735c720
8 changed files with 48 additions and 50 deletions

View File

@@ -124,8 +124,10 @@ Runtime override: If the setup CLI (or a JSON command) provides a new device nam
- Fast WiFi setup: in the CLI, go to “WiFi settings” → “Automatic setup”, then check “status”.
- Change name/MDNS: set the device name in the CLI, then replug USB — UVC will show the new name.
- Adjust brightness/LED: set LED PWM in the CLI.
- Switch to UVC mode over commands: send JSON `{ "cmd": "switch_mode", "mode": "uvc" }` then reboot.
- Read filtered LED current (if enabled): `{ "cmd": "get_led_current" }`.
- Switch to UVC mode over commands (CDC/serial):
`{"commands":[{"command":"switch_mode","data":{"mode":"uvc"}}]}` then reboot.
- Read filtered LED current (if enabled):
`{"commands":[{"command":"get_led_current"}]}`
---
@@ -143,11 +145,19 @@ When UVC support is compiled in the device enumerates as a composite USB device:
- UVC interface: video streaming (JPEG frames)
- CDC (virtual COM): command channel accepting newlineterminated JSON objects
Example newlineterminated JSON commands over CDC:
Example newlineterminated JSON commands over CDC (one per line):
```
{"cmd":"ping"}\n
{"cmd":"get_info"}\n
{"cmd":"switch_mode","mode":"wifi"}\n
{"commands":[{"command":"ping"}]}
{"commands":[{"command":"get_who_am_i"}]}
{"commands":[{"command":"switch_mode","data":{"mode":"wifi"}}]}
```
Chained commands in a single request (processed in order):
```
{"commands":[
{"command":"set_mdns","data":{"hostname":"tracker"}},
{"command":"set_wifi","data":{"name":"main","ssid":"your_network","password":"password","channel":0,"power":0}}
]}
```
Responses are JSON blobs flushed immediately.

View File

@@ -72,8 +72,8 @@ private:
bool finishedPattern = false;
#if defined(CONFIG_LED_EXTERNAL_CONTROL) && defined(CONFIG_LED_EXTERNAL_AS_DEBUG)
mutable bool hasStoredExternalDuty = false;
mutable uint32_t storedExternalDuty = 0; // raw 0-255
bool hasStoredExternalDuty = false;
uint32_t storedExternalDuty = 0; // raw 0-255
#endif
};

View File

@@ -1,3 +1,5 @@
#ifndef CURRENT_MONITOR_HPP
#define CURRENT_MONITOR_HPP
#pragma once
#include <cstdint>
#include <memory>
@@ -43,3 +45,5 @@ private:
size_t sample_idx_ = 0;
size_t sample_count_ = 0;
};
#endif

View File

@@ -6,8 +6,6 @@
class MonitoringManager {
public:
MonitoringManager() = default;
~MonitoringManager() = default;
void setup();
void start();

View File

@@ -97,10 +97,10 @@ static uvc_fb_t *UVCStreamHelpers::camera_fb_get_cb(void *cb_ctx)
// --- Frame pacing BEFORE grabbing a new camera frame ---
static int64_t next_deadline_us = 0; // next permitted capture time
static int rem_acc = 0; // fractional remainder accumulator
constexpr int target_fps = 60; // desired FPS
constexpr int64_t us_per_sec = 1000000; // 1e6 microseconds
constexpr int base_interval_us = us_per_sec / target_fps; // 16666
constexpr int rem_us = us_per_sec % target_fps; // 40 (distributed)
static const int target_fps = 60; // desired FPS
static const int64_t us_per_sec = 1000000; // 1e6 microseconds
static const int base_interval_us = us_per_sec / target_fps; // 16666
static const int rem_us = us_per_sec % target_fps; // 40 (distributed)
const int64_t now_us = esp_timer_get_time();
if (next_deadline_us == 0)

View File

@@ -5,9 +5,9 @@
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_timer.h"
#include "sdkconfig.h"
#include "nvs_flash.h"
#include "esp_wifi.h"
#include <openiris_logo.hpp>
#include <wifiManager.hpp>
@@ -65,7 +65,7 @@ UVCStreamManager uvcStream;
auto ledManager = std::make_shared<LEDManager>(BLINK_GPIO, CONFIG_LED_C_PIN_GPIO, ledStateQueue, deviceConfig);
auto *serialManager = new SerialManager(commandManager, &timerHandle, deviceConfig);
MonitoringManager monitoringManager;
std::shared_ptr<MonitoringManager> monitoringManager = std::make_shared<MonitoringManager>();
void startWiFiMode(bool shouldCloseSerialManager);
void startWiredMode(bool shouldCloseSerialManager);
@@ -233,11 +233,11 @@ void startSetupMode()
{
// If we're in SETUP mode - Device starts with a 20-second delay before deciding on what to do
// during this time we await any commands
const int startup_delay_s = CONFIG_GENERAL_STARTUP_DELAY;
const uint64_t startup_delay_s = CONFIG_GENERAL_STARTUP_DELAY;
ESP_LOGI("[MAIN]", "=====================================");
ESP_LOGI("[MAIN]", "STARTUP: %d-SECOND DELAY MODE ACTIVE", startup_delay_s);
ESP_LOGI("[MAIN]", "STARTUP: %llu-SECOND DELAY MODE ACTIVE", (unsigned long long)startup_delay_s);
ESP_LOGI("[MAIN]", "=====================================");
ESP_LOGI("[MAIN]", "Device will wait %d seconds for commands...", startup_delay_s);
ESP_LOGI("[MAIN]", "Device will wait %llu seconds for commands...", (unsigned long long)startup_delay_s);
// Create a one-shot timer for 20 seconds
const esp_timer_create_args_t startup_timer_args = {
@@ -248,9 +248,9 @@ void startSetupMode()
.skip_unhandled_events = false};
ESP_ERROR_CHECK(esp_timer_create(&startup_timer_args, &timerHandle));
ESP_ERROR_CHECK(esp_timer_start_once(timerHandle, (uint64_t)startup_delay_s * 1000000));
ESP_LOGI("[MAIN]", "Started %d-second startup timer", startup_delay_s);
ESP_LOGI("[MAIN]", "Send any command within %d seconds to enter heartbeat mode", startup_delay_s);
ESP_ERROR_CHECK(esp_timer_start_once(timerHandle, startup_delay_s * 1000000));
ESP_LOGI("[MAIN]", "Started %llu-second startup timer", (unsigned long long)startup_delay_s);
ESP_LOGI("[MAIN]", "Send any command within %llu seconds to enter heartbeat mode", (unsigned long long)startup_delay_s);
}
extern "C" void app_main(void)
@@ -262,7 +262,7 @@ extern "C" void app_main(void)
dependencyRegistry->registerService<WiFiManager>(DependencyType::wifi_manager, wifiManager);
#endif
dependencyRegistry->registerService<LEDManager>(DependencyType::led_manager, ledManager);
dependencyRegistry->registerService<MonitoringManager>(DependencyType::monitoring_manager, std::shared_ptr<MonitoringManager>(&monitoringManager, [](MonitoringManager*){}));
dependencyRegistry->registerService<MonitoringManager>(DependencyType::monitoring_manager, monitoringManager);
// add endpoint to check firmware version
// add firmware version somewhere
@@ -275,8 +275,8 @@ extern "C" void app_main(void)
initNVSStorage();
deviceConfig->load();
ledManager->setup();
monitoringManager.setup();
monitoringManager.start();
monitoringManager->setup();
monitoringManager->start();
xTaskCreate(
HandleStateManagerTask,

View File

@@ -1063,10 +1063,9 @@ def get_settings(device: OpenIrisDevice, args=None):
print("🔑 Serial/MAC: unavailable")
# Advertised Name
adv = summary.get("AdvertisedName", {})
adv_name = adv.get("advertised_name")
if adv_name:
print(f"📛 Name: {adv_name}")
advertised_name_data = summary.get("AdvertisedName", {})
if advertised_name := advertised_name_data.get("advertised_name"):
print(f"📛 Name: {advertised_name}")
# Info
info = summary.get("Info", {})
@@ -1090,12 +1089,11 @@ def get_settings(device: OpenIrisDevice, args=None):
print(f"🎚️ Mode: {mode if mode else 'unknown'}")
# Current
current = summary.get("Current", {}).get("led_current_ma")
if current is not None:
print(f"🔌 LED Current: {current:.3f} mA")
current_section = summary.get("Current", {})
if (led_current_ma := current_section.get("led_current_ma")) is not None:
print(f"🔌 LED Current: {led_current_ma:.3f} mA")
else:
err = summary.get("Current", {}).get("error")
if err:
if (err := current_section.get("error")):
print(f"🔌 LED Current: unavailable ({err})")
else:
print("🔌 LED Current: unavailable")

View File

@@ -1,4 +1,5 @@
import os
import difflib
import argparse
from typing import Dict, Optional, List
@@ -70,22 +71,9 @@ def _suggest_boards(partial: str) -> List[str]:
contains = [b for b in BOARD_CONFIGS if partial_low in b.lower()]
if contains:
return contains[:10]
# simple levenshtein distance limited (manual lightweight)
def distance(a: str, b: str) -> int:
if len(a) < len(b):
a, b = b, a
prev = list(range(len(b)+1))
for i, ca in enumerate(a, 1):
cur = [i]
for j, cb in enumerate(b, 1):
ins = cur[j-1] + 1
dele = prev[j] + 1
sub = prev[j-1] + (ca != cb)
cur.append(min(ins, dele, sub))
prev = cur
return prev[-1]
ranked = sorted(BOARD_CONFIGS, key=lambda k: distance(partial_low, k.lower()))
return ranked[:5]
# fallback to fuzzy matching using difflib
choices = list(BOARD_CONFIGS.keys())
return difflib.get_close_matches(partial, choices, n=5, cutoff=0.4)
def normalize_board_name(raw: Optional[str]) -> Optional[str]:
if raw is None: