diff --git a/electron/src/machines/extruder/extruder2/Extruder2ControlPage.tsx b/electron/src/machines/extruder/extruder2/Extruder2ControlPage.tsx index 4c9f0f2e..efd37c64 100644 --- a/electron/src/machines/extruder/extruder2/Extruder2ControlPage.tsx +++ b/electron/src/machines/extruder/extruder2/Extruder2ControlPage.tsx @@ -26,9 +26,13 @@ export function Extruder2ControlPage() { backPower, middleTemperature, middlePower, - screwRpm, pressure, + motorCurrent, + motorFrequency, + motorScrewRpm, + motorVoltage, + setExtruderMode, setBackHeatingTemperature, setFrontHeatingTemperature, @@ -170,7 +174,7 @@ export function Extruder2ControlPage() { label="Rpm" unit="rpm" renderValue={(value) => roundToDecimals(value, 0)} - timeseries={screwRpm} + timeseries={motorScrewRpm} /> {state?.pressure_state?.wiring_error && ( diff --git a/electron/src/machines/extruder/extruder2/extruder2Namespace.ts b/electron/src/machines/extruder/extruder2/extruder2Namespace.ts index f9b6be1f..19ac15e3 100644 --- a/electron/src/machines/extruder/extruder2/extruder2Namespace.ts +++ b/electron/src/machines/extruder/extruder2/extruder2Namespace.ts @@ -22,11 +22,18 @@ import { useMemo } from "react"; export const modeSchema = z.enum(["Standby", "Heat", "Extrude"]); export type Mode = z.infer; +export const liveMotorStatusDataSchema = z.object({ + screw_rpm: z.number(), + frequency: z.number(), + voltage: z.number(), + current: z.number(), +}); +export type MotorStatus = z.infer; /** * Consolidated live values event schema (60FPS data) */ export const liveValuesEventDataSchema = z.object({ - screw_rpm: z.number(), + motor_status: liveMotorStatusDataSchema, pressure: z.number(), nozzle_temperature: z.number(), front_temperature: z.number(), @@ -174,7 +181,11 @@ export type Extruder2NamespaceStore = { defaultState: StateEvent | null; // Time series data for live values - screwRpm: TimeSeries; + motorFrequency: TimeSeries; + motorVoltage: TimeSeries; + motorCurrent: TimeSeries; + motorScrewRpm: TimeSeries; + pressure: TimeSeries; nozzleTemperature: TimeSeries; frontTemperature: TimeSeries; @@ -234,6 +245,18 @@ const { initialTimeSeries: backPower, insert: addBackPower } = createTimeSeries( ONE_HOUR, ); +const { initialTimeSeries: motorCurrent, insert: addMotorCurrent } = + createTimeSeries(TWENTY_MILLISECOND, ONE_SECOND, FIVE_SECOND, ONE_HOUR); + +const { initialTimeSeries: motorVoltage, insert: addMotorVoltage } = + createTimeSeries(TWENTY_MILLISECOND, ONE_SECOND, FIVE_SECOND, ONE_HOUR); + +const { initialTimeSeries: motorFrequency, insert: addMotorFrequency } = + createTimeSeries(TWENTY_MILLISECOND, ONE_SECOND, FIVE_SECOND, ONE_HOUR); + +const { initialTimeSeries: motorScrewRpm, insert: addMotorScrewRpm } = + createTimeSeries(TWENTY_MILLISECOND, ONE_SECOND, FIVE_SECOND, ONE_HOUR); + export function extruder2MessageHandler( store: StoreApi, throttledUpdater: ThrottledStoreUpdater, @@ -264,8 +287,20 @@ export function extruder2MessageHandler( const timestamp = event.ts; updateStore((state) => ({ ...state, - screwRpm: addScrewRpm(state.screwRpm, { - value: liveValuesEvent.data.screw_rpm, + motorScrewRpm: addMotorScrewRpm(state.motorScrewRpm, { + value: liveValuesEvent.data.motor_status.screw_rpm, + timestamp, + }), + motorCurrent: addMotorCurrent(state.motorCurrent, { + value: liveValuesEvent.data.motor_status.current, + timestamp, + }), + motorVoltage: addMotorVoltage(state.motorVoltage, { + value: liveValuesEvent.data.motor_status.voltage, + timestamp, + }), + motorFrequency: addMotorFrequency(state.motorFrequency, { + value: liveValuesEvent.data.motor_status.frequency, timestamp, }), pressure: addPressure(state.pressure, { @@ -321,7 +356,12 @@ export const createExtruder2NamespaceStore = return { state: null, defaultState: null, - screwRpm, + + motorCurrent, + motorFrequency, + motorScrewRpm, + motorVoltage, + pressure, nozzleTemperature, frontTemperature, diff --git a/electron/src/machines/extruder/extruder2/useExtruder.ts b/electron/src/machines/extruder/extruder2/useExtruder.ts index 01a6dd48..0ec623b1 100644 --- a/electron/src/machines/extruder/extruder2/useExtruder.ts +++ b/electron/src/machines/extruder/extruder2/useExtruder.ts @@ -41,7 +41,10 @@ export function useExtruder2() { const { state, defaultState, - screwRpm, + motorCurrent, + motorFrequency, + motorScrewRpm, + motorVoltage, pressure, nozzleTemperature, @@ -364,7 +367,11 @@ export function useExtruder2() { defaultState: defaultState?.data, // Individual live values (TimeSeries) - screwRpm, + motorCurrent, + motorFrequency, + motorScrewRpm, + motorVoltage, + pressure, nozzleTemperature, frontTemperature, diff --git a/server/src/machines/extruder1/mitsubishi_cs80/mod.rs b/server/src/machines/extruder1/mitsubishi_cs80/mod.rs index f150a31e..b29a27f6 100644 --- a/server/src/machines/extruder1/mitsubishi_cs80/mod.rs +++ b/server/src/machines/extruder1/mitsubishi_cs80/mod.rs @@ -13,7 +13,7 @@ use uom::si::{ }; /// Specifies all System environment Variables -/// Register addresses are calculated as follows: Register-value 40002 -> address: 40002-40001 -> address:0x1 +/// Register addresses are calculated as follows: Register-value 40002 -> address: 40002-40001 -> actual address in request:0x1 #[derive(Debug, Clone, Copy)] enum MitsubishiCS80Register { /// Register 40002