diff --git a/flows.json b/flows.json index 14d918e..144d53a 100644 --- a/flows.json +++ b/flows.json @@ -2734,11 +2734,16 @@ "t": "eq", "v": "imager/image", "vt": "str" + }, + { + "t": "eq", + "v": "calibration/save", + "vt": "str" } ], "checkall": "true", "repair": false, - "outputs": 9, + "outputs": 10, "x": 550, "y": 220, "wires": [ @@ -2768,6 +2773,9 @@ ], [ "a56a8820702f4610" + ], + [ + "ca11ba7100000002" ] ] }, @@ -2783,7 +2791,7 @@ "width": "0", "height": "0", "head": "", - "format": "\n \n\n \n \n Light\n \n \n Off\n \n \n \n On\n \n \n \n \n\n \n \n \n Focus\n \n \n \n Distance\n \n \n \n \n \n \n \n \n\n \n \n \n \n {{ value }} μm\n \n \n \n \n\n \n \n \n Near\n Stop\n Far\n \n \n \n \n \n\n \n \n \n Pump\n \n \n Flowrate\n \n \n \n \n \n \n {{ value }} ml/min\n \n \n \n \n \n Volume\n \n \n \n \n \n \n \n {{ value }} ml\n \n \n \n \n \n \n \n Backward\n Stop\n Forward\n \n \n \n \n \n\n \n \n Bubbler\n\n \n \n Off\n \n 25%\n \n 50%\n \n 75%\n \n 100%\n \n \n \n \n\n \n \n mdi-tune\n Calibration\n Modify camera and optical parameters.\n \n \n Calibrate\n \n \n \n \n\n \n \n \n \n mdi-tuneCamera Calibration\n \n \n \n mdi-close\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n COLOR ANALYSIS ZONE\n \n\n \n \n \n \n\n \n mdi-camera-iris\n {{ phaseLabel }}\n \n \n \n \n \n\n \n \n \n \n {{ btnText }}\n \n \n\n \n \n \n \n 1 · Initialization\n \n \n\n \n \n \n \n \n 2 · Desaturation\n = 2\" class=\"font-mono font-weight-black text-body-2\">\n {{ currentSat.toFixed(1) }}%\n \n \n \n \n\n = 2\" class=\"gauge mt-1\">\n \n \n \n \n \n \n \n\n = 2 && lastFrame\" class=\"d-flex justify-space-between mt-1 font-mono text-caption\">\n Pixel R: {{ Math.round(lastFrame.r || 0) }}\n G: {{ Math.round(lastFrame.g || 0) }}\n B: {{ Math.round(lastFrame.b || 0) }}\n \n \n\n \n \n \n \n \n 3 · Exposure\n = 3\" class=\"font-mono font-weight-black text-body-2\">\n {{ currentLum.toFixed(0) }} / 230\n \n \n \n \n\n = 3\" class=\"gauge mt-1\">\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n {{ status === 'success' ? 'mdi-check-circle' : 'mdi-alert-circle' }}\n \n {{ status === 'success' ? 'Calibration Successful' : 'Calibration Failed' }}\n \n \n LED{{ led.toFixed(4) }}\n Gain R{{ gains.red }}\n Gain B{{ gains.blue }}\n Sat{{ currentSat.toFixed(2) }}%\n Lum{{ currentLum.toFixed(1) }}\n Δ Lum\n \n {{ (currentLum - 230).toFixed(1) }}\n \n \n Zones{{ activeZonesCount }}/400\n \n \n\n \n\n \n \n \n \n\n \n\n\n\n\n", + "format": "\n \n\n \n \n Light\n \n \n Off\n \n \n \n On\n \n \n \n \n\n \n \n \n Focus\n \n \n \n Distance\n \n \n \n \n \n \n \n \n\n \n \n \n \n {{ value }} μm\n \n \n \n \n\n \n \n \n Near\n Stop\n Far\n \n \n \n \n \n\n \n \n \n Pump\n \n \n Flowrate\n \n \n \n \n \n \n {{ value }} ml/min\n \n \n \n \n \n Volume\n \n \n \n \n \n \n \n {{ value }} ml\n \n \n \n \n \n \n \n Backward\n Stop\n Forward\n \n \n \n \n \n\n \n \n Bubbler\n\n \n \n Off\n \n 25%\n \n 50%\n \n 75%\n \n 100%\n \n \n \n \n\n \n \n mdi-tune\n Calibration\n Modify camera and optical parameters.\n \n \n Calibrate\n \n \n \n \n\n \n \n \n \n mdi-tuneCamera Calibration\n \n \n \n mdi-close\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n COLOR ANALYSIS ZONE\n \n\n \n \n \n \n\n \n mdi-camera-iris\n {{ phaseLabel }}\n \n \n \n \n \n\n \n \n \n \n {{ btnText }}\n \n \n\n \n \n \n \n 1 · Initialization\n \n \n\n \n \n \n \n \n 2 · Desaturation\n = 2\" class=\"font-mono font-weight-black text-body-2\">\n {{ currentSat.toFixed(1) }}%\n \n \n \n \n\n = 2\" class=\"gauge mt-1\">\n \n \n \n \n \n \n \n\n = 2 && lastFrame\" class=\"d-flex justify-space-between mt-1 font-mono text-caption\">\n Pixel R: {{ Math.round(lastFrame.r || 0) }}\n G: {{ Math.round(lastFrame.g || 0) }}\n B: {{ Math.round(lastFrame.b || 0) }}\n \n \n\n \n \n \n \n \n 3 · Exposure\n = 3\" class=\"font-mono font-weight-black text-body-2\">\n {{ currentLum.toFixed(0) }} / 230\n \n \n \n \n\n = 3\" class=\"gauge mt-1\">\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n {{ status === 'success' ? 'mdi-check-circle' : 'mdi-alert-circle' }}\n \n {{ status === 'success' ? 'Calibration Successful' : 'Calibration Failed' }}\n \n \n LED{{ led.toFixed(4) }}\n Gain R{{ gains.red }}\n Gain B{{ gains.blue }}\n Sat{{ currentSat.toFixed(2) }}%\n Lum{{ currentLum.toFixed(1) }}\n Δ Lum\n \n {{ (currentLum - 230).toFixed(1) }}\n \n \n Zones{{ activeZonesCount }}/400\n \n \n\n \n\n \n \n \n \n\n \n\n\n\n\n", "storeOutMessages": true, "passthru": true, "resendOnRefresh": true, @@ -3612,7 +3620,7 @@ "width": 0, "height": 0, "head": "", - "format": "\n \n \n \n \n Acquisition Settings\n \n\n \n \n Project: {{ sample_project }}\n Sample: {{ sample_id }}\n Operator: {{ sample_operator }}\n Gear: {{ sample_gear }}\n \n \n\n \n \n \n \n \n mdi-information\n \n \n \n \n\n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n \n \n \n mdi-circle-small\n High Mag (100µm)\n \n \n mdi-circle-medium\n Medium Mag (300µm)\n \n \n mdi-circle\n Low Mag (500µm)\n \n \n \n \n\n \n \n \n Advanced Parameters\n \n \n\n \n \n Flowcell Thickness :\n \n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n\n \n \n Flowrate between images :\n \n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n\n \n \n Stabilization Delay :\n \n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n\n \n \n \n Volume between images :\n \n \n \n { acq_interframe_volume = v / 1000; autoCalculateVolumes(true); }\"\n type=\"number\" :min=\"0.1\" :step=\"0.1\" variant=\"outlined\" hide-details suffix=\"µL\" bg-color=\"white\"\n :disabled=\"acq_status === 'on'\">\n \n \n mdi-information\n \n \n \n \n \n\n \n\n \n \n Volume Imaged :\n \n \n \n \n mdi-information\n \n \n \n \n\n \n\n \n \n Total Volume Pumped :\n \n \n \n \n mdi-information\n \n \n \n \n\n \n \n \n\n \n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n \n \n Stop\n Start\n \n \n \n\n \n \n \n {{ acq_paused ? 'Resume Acquisition' : 'Pause Acquisition' }}\n \n \n \n\n \n \n \n {{ formattedStatus }}\n \n \n \n \n \n\n \n \n {{ hintTitle }}\n \n \n \n Close\n \n \n \n\n \n \n \n mdi-cog-sync\n Hardware Setup\n \n \n \n Switching to {{ tempMag?.toUpperCase() }}.\n \n \n System configuration:\n \n Lens: {{ getPreviewSettings(tempMag).tube }} / {{ getPreviewSettings(tempMag).obj }}\n Pixel: {{ getPreviewSettings(tempMag).pixel }} µm\n Flowcell: {{ getPreviewSettings(tempMag).thickness }} µm\n Flowrate: {{ getPreviewSettings(tempMag).flowrate }} mL/min\n \n \n Parameters will be updated automatically.\n \n \n Cancel\n \n Confirm & Update\n \n \n \n\n \n \n \n \n mdi-tuneCalibration\n \n \n \n \n\n \n\n \n \n \n \n\n \n \n COLOR ANALYSIS ZONE\n \n\n \n \n \n\n \n mdi-camera-iris\n {{ phaseLabel }}\n \n\n \n \n \n \n\n \n\n \n \n {{ calBtnText }}\n \n \n\n \n\n \n \n \n 1 · Initialization\n \n \n\n \n \n \n \n \n 2 · Desaturation\n = 2\" class=\"font-mono font-weight-black text-body-2\">\n {{ currentSat.toFixed(1) }}%\n \n \n \n \n\n = 2\" class=\"gauge mt-1\">\n \n \n \n \n \n \n \n \n\n = 2\" class=\"d-flex justify-space-between mt-1 font-mono text-caption\">\n Pixel R: {{ Math.round(lastFrame.r) }}\n G: {{ Math.round(lastFrame.g) }}\n B: {{ Math.round(lastFrame.b) }}\n \n \n\n \n \n \n \n \n 3 · Exposure\n = 3\" class=\"font-mono font-weight-black text-body-2\">\n {{ currentLum.toFixed(0) }} / 230\n \n \n \n \n\n = 3\" class=\"gauge mt-1\">\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n {{ cal_status === 'success' ? 'mdi-check-circle' : 'mdi-alert-circle' }}\n \n {{ resultStatusLabel }}\n \n {{ totalTime }}s\n \n \n LED{{ led.toFixed(4) }}\n Gain R{{ gains.red }}\n Gain B{{ gains.blue }}\n Sat{{ currentSat.toFixed(2) }}%\n Lum{{ currentLum.toFixed(1) }}\n Δ\n \n {{ (currentLum - 230).toFixed(1) }}\n \n \n Zones{{ activeZonesCount }}/400\n Iter{{ totalIter }}\n \n \n\n \n \n \n \n\n \n\n\n\n\n", + "format": "\n \n \n \n \n Acquisition Settings\n \n\n \n \n Project: {{ sample_project }}\n Sample: {{ sample_id }}\n Operator: {{ sample_operator }}\n Gear: {{ sample_gear }}\n \n \n\n \n \n \n \n \n mdi-information\n \n \n \n \n\n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n \n \n \n mdi-circle-small\n High Mag (100µm)\n \n \n mdi-circle-medium\n Medium Mag (300µm)\n \n \n mdi-circle\n Low Mag (500µm)\n \n \n \n \n\n \n \n \n Advanced Parameters\n \n \n\n \n \n Flowcell Thickness :\n \n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n\n \n \n Flowrate between images :\n \n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n\n \n \n Stabilization Delay :\n \n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n\n \n \n \n Volume between images :\n \n \n \n { acq_interframe_volume = v / 1000; autoCalculateVolumes(true); }\"\n type=\"number\" :min=\"0.1\" :step=\"0.1\" variant=\"outlined\" hide-details suffix=\"µL\" bg-color=\"white\"\n :disabled=\"acq_status === 'on'\">\n \n \n mdi-information\n \n \n \n \n \n\n \n\n \n \n Volume Imaged :\n \n \n \n \n mdi-information\n \n \n \n \n\n \n\n \n \n Total Volume Pumped :\n \n \n \n \n mdi-information\n \n \n \n \n\n \n \n \n\n \n \n \n \n \n mdi-information\n \n \n \n \n \n\n \n \n \n Stop\n Start\n \n \n \n\n \n \n \n {{ acq_paused ? 'Resume Acquisition' : 'Pause Acquisition' }}\n \n \n \n\n \n \n \n {{ formattedStatus }}\n \n \n \n \n \n\n \n \n {{ hintTitle }}\n \n \n \n Close\n \n \n \n\n \n \n \n mdi-cog-sync\n Hardware Setup\n \n \n \n Switching to {{ tempMag?.toUpperCase() }}.\n \n \n System configuration:\n \n Lens: {{ getPreviewSettings(tempMag).tube }} / {{ getPreviewSettings(tempMag).obj }}\n Pixel: {{ getPreviewSettings(tempMag).pixel }} µm\n Flowcell: {{ getPreviewSettings(tempMag).thickness }} µm\n Flowrate: {{ getPreviewSettings(tempMag).flowrate }} mL/min\n \n \n Parameters will be updated automatically.\n \n \n Cancel\n \n Confirm & Update\n \n \n \n\n \n \n \n \n mdi-tuneCalibration\n \n \n \n \n\n \n\n \n \n \n \n\n \n \n COLOR ANALYSIS ZONE\n \n\n \n \n \n\n \n mdi-camera-iris\n {{ phaseLabel }}\n \n\n \n \n \n \n\n \n\n \n \n {{ calBtnText }}\n \n \n\n \n\n \n \n \n 1 · Initialization\n \n \n\n \n \n \n \n \n 2 · Desaturation\n = 2\" class=\"font-mono font-weight-black text-body-2\">\n {{ currentSat.toFixed(1) }}%\n \n \n \n \n\n = 2\" class=\"gauge mt-1\">\n \n \n \n \n \n \n \n \n\n = 2\" class=\"d-flex justify-space-between mt-1 font-mono text-caption\">\n Pixel R: {{ Math.round(lastFrame.r) }}\n G: {{ Math.round(lastFrame.g) }}\n B: {{ Math.round(lastFrame.b) }}\n \n \n\n \n \n \n \n \n 3 · Exposure\n = 3\" class=\"font-mono font-weight-black text-body-2\">\n {{ currentLum.toFixed(0) }} / 230\n \n \n \n \n\n = 3\" class=\"gauge mt-1\">\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n {{ cal_status === 'success' ? 'mdi-check-circle' : 'mdi-alert-circle' }}\n \n {{ resultStatusLabel }}\n \n {{ totalTime }}s\n \n \n LED{{ led.toFixed(4) }}\n Gain R{{ gains.red }}\n Gain B{{ gains.blue }}\n Sat{{ currentSat.toFixed(2) }}%\n Lum{{ currentLum.toFixed(1) }}\n Δ\n \n {{ (currentLum - 230).toFixed(1) }}\n \n \n Zones{{ activeZonesCount }}/400\n Iter{{ totalIter }}\n \n \n\n \n \n \n \n\n \n\n\n\n\n", "storeOutMessages": true, "passthru": true, "resendOnRefresh": true, @@ -4037,11 +4045,16 @@ "t": "eq", "v": "imager/image", "vt": "str" + }, + { + "t": "eq", + "v": "calibration/save", + "vt": "str" } ], "checkall": "true", "repair": false, - "outputs": 2, + "outputs": 3, "x": 550, "y": 440, "wires": [ @@ -4052,6 +4065,9 @@ [ "d103a3c7e312d1f1", "7f4d54e564ca69d7" + ], + [ + "d103a3c7e312d1f1" ] ] }, @@ -7614,7 +7630,7 @@ "width": "0", "height": "0", "head": "", - "format": "\n \n \n \n \n \n \n \n \n \n \n COLOR ANALYSIS ZONE\n \n\n \n \n \n \n \n \n \n \n\n \n \n \n CALIBRATION\n \n LED: {{ status === 'running' ? 'ON' : 'OFF' }}\n \n \n\n \n Pump Calibration\n \n\n \n {{ btnText }}\n \n\n \n \n \n \n 1. Initialization\n Preset (0.1 / R200 B180)\n \n \n\n \n \n \n \n 2. Desaturation\n {{ currentSat }}%\n \n \n Target: 0%\n \n \n\n \n \n \n \n 3. Exposure\n {{ currentLum.toFixed(0) }}/230\n \n \n {{ activeZonesCount }} valid zones\n \n \n Smart Grid Target: 230\n \n \n \n\n \n \n \n {{l.time}} {{ l.txt }}\n \n \n \n\n \n \n \n\n\n\n\n", + "format": "\n \n \n \n \n \n \n \n \n \n \n COLOR ANALYSIS ZONE\n \n\n \n \n \n \n \n \n \n \n\n \n \n \n CALIBRATION\n \n LED: {{ status === 'running' ? 'ON' : 'OFF' }}\n \n \n\n \n Pump Calibration\n \n\n \n {{ btnText }}\n \n\n \n \n \n \n 1. Initialization\n Preset (0.1 / R200 B180)\n \n \n\n \n \n \n \n 2. Desaturation\n {{ currentSat }}%\n \n \n Target: 0%\n \n \n\n \n \n \n \n 3. Exposure\n {{ currentLum.toFixed(0) }}/230\n \n \n {{ activeZonesCount }} valid zones\n \n \n Smart Grid Target: 230\n \n \n \n\n \n \n \n {{l.time}} {{ l.txt }}\n \n \n \n\n \n \n \n\n\n\n\n", "storeOutMessages": true, "passthru": true, "resendOnRefresh": true, @@ -9301,5 +9317,43 @@ "wires": [ [] ] + }, + { + "id": "ca11ba7100000001", + "type": "mqtt in", + "z": "6d6a011bf1913637", + "name": "", + "topic": "status/calibration", + "qos": "0", + "datatype": "json", + "broker": "8dc3722c.06efa8", + "nl": false, + "rap": false, + "inputs": 0, + "x": 80, + "y": 400, + "wires": [ + [ + "db1ef284071e60a1" + ] + ] + }, + { + "id": "ca11ba7100000002", + "type": "mqtt out", + "z": "6d6a011bf1913637", + "name": "MQTT - calibration", + "topic": "", + "qos": "", + "retain": "", + "respTopic": "", + "contentType": "", + "userProps": "", + "correl": "", + "expiry": "", + "broker": "8dc3722c.06efa8", + "x": 790, + "y": 520, + "wires": [] } ] \ No newline at end of file
\n Switching to {{ tempMag?.toUpperCase() }}.\n
System configuration:
Parameters will be updated automatically.