make the Gauge Readings look the same format in the arrays

This commit is contained in:
Tyrel Souza 2023-10-20 22:52:21 -04:00
parent ec4eb418d5
commit 9b181287eb
No known key found for this signature in database
GPG Key ID: F3614B02ACBE438E
4 changed files with 71 additions and 55 deletions

View File

@ -3,16 +3,18 @@ import {ONE_NEW_LINE, TWO_NEW_LINES} from "./utils/constants.js";
const isInRange = (value, masterValue) => { const isInRange = (value, masterValue) => {
return (masterValue["Low Limit"] <= value && value <= masterValue["High Limit"]); return (masterValue["Low Limit"] <= value && value <= masterValue["High Limit"]);
} }
const calculateDelta = (value, masterValue) => { const calculateDelta = (value, lowLimit) => {
return Math.abs(masterValue["Low Limit"] - value); return Math.abs(lowLimit - value);
} }
function outOfTolerance(reading) { function outOfTolerance(readings) {
// Calculate Out of Tolerances // Calculate Out of Tolerances
for (const reading of reading) { for (const reading of readings) {
reading["Out Of Tolerance"] = 0; reading["Out Of Tolerance"] = 0;
if (!reading["In Range"]) { if (reading["In Range"]) {
reading["Out Of Tolerance"] = reading["Delta"]; // We are good.
continue
} }
reading["Out Of Tolerance"] = reading["Delta"];
} }
} }
@ -51,10 +53,11 @@ const KEEP = {
"Pressure Transducer": ["Instrument Pressure", "Master Value"], "Pressure Transducer": ["Instrument Pressure", "Master Value"],
}; };
function deviceDataToObj(lines, keep, name) { function deviceDataToObj(lines, name, kind) {
const keep = KEEP[kind]
const deviceData = { const deviceData = {
"Name":name, "Name":name,
"Master Values":[], "Master Values":{},
"Gauge Reading": [] "Gauge Reading": []
}; };
for (const line of lines) { for (const line of lines) {
@ -65,28 +68,30 @@ function deviceDataToObj(lines, keep, name) {
deviceData[keyTrimmed] = value.trim(); deviceData[keyTrimmed] = value.trim();
} }
} }
for (const start of keep) {
if (keyTrimmed.startsWith(start)) {
if (keyTrimmed.includes("Master")) {
// Master values occur twice, but due to the fact that this is // Master values occur twice, but due to the fact that this is
// editing KeyValues not Indexes, it will replace // editing KeyValues not Indexes, it will replace
// the masters with the second instance of these. // the masters with the second instance of these.
// No manual checks to skip the first. // No manual checks to skip the first.
for (const start of keep) { deviceData["Master Values"][keyTrimmed] = {"v": value.trim()}
if (keyTrimmed.startsWith(start)) {
if (keyTrimmed.includes("Master")) {
deviceData["Master Values"].push(
{
"Value": value.trim()
}
)
} else { } else {
deviceData["Gauge Reading"].push( deviceData["Gauge Reading"].push({"Value": value.trim()})
{
"Value": value.trim()
}
)
} }
} }
} }
} }
// Because of the annoyances of two entries,
// Loop through, merging the objects and deleting the old
for (let i in deviceData["Gauge Reading"]) {
i = parseInt(i)
const key = (kind === "Mass Flow Trans") ? `Master Reading ${i+1}` : `Master Value ${i+1}`
deviceData["Gauge Reading"][i]["Master Value"] = deviceData["Master Values"][key]["v"]
}
delete deviceData["Master Values"]
return deviceData; return deviceData;
} }
@ -100,23 +105,21 @@ function calculateLimitsAndTolerances(calibrationDatum, accuracy) {
} }
let limit = accuracy * value * 1000 let limit = accuracy * value * 1000
for (const mv of calibrationDatum["Master Values"]) { for (const gr of calibrationDatum["Gauge Reading"]) {
const reading = parseInt(mv["Value"].split(" ")[0]) * 1000; const master_value = parseInt(gr["Master Value"].split(" ")[0]) * 1000;
mv["Low Limit"] = reading - limit gr["Low Limit"] = master_value - limit
mv["High Limit"] = reading + limit gr["Master Value"] = master_value
mv["Value"] = reading gr["High Limit"] = master_value + limit
} }
for (const i in calibrationDatum["Gauge Reading"]) { for (const gr of calibrationDatum["Gauge Reading"]) {
let gr = calibrationDatum["Gauge Reading"][i];
const mv = calibrationDatum["Master Values"][i];
const [val, unit] = gr["Value"].split(" ") const [val, unit] = gr["Value"].split(" ")
const reading = parseInt(val) * 1000; const reading = parseInt(val) * 1000;
gr["Value"] = reading; // Update the original, ignoring the units gr["Value"] = reading; // Update the original, ignoring the units
gr["Unit"] = unit; gr["Unit"] = unit;
gr["In Range"] = isInRange(reading, mv) gr["In Range"] = isInRange(reading, gr["Master Value"])
gr["Delta"] = calculateDelta(reading, mv) gr["Delta"] = calculateDelta(reading, gr["Low Limit"])
console.log(0)
} }
outOfTolerance(calibrationDatum["Gauge Reading"]) outOfTolerance(calibrationDatum["Gauge Reading"])
} }
@ -135,7 +138,7 @@ const parseCalibrationData = (text, accuracy) => {
lines.shift(); // Remove "=======" line lines.shift(); // Remove "=======" line
const deviceName = lines.shift().trim().split(/\s+/).slice(-1)[0].trim(); const deviceName = lines.shift().trim().split(/\s+/).slice(-1)[0].trim();
calibrationData[blockTitle] = deviceDataToObj(lines, KEEP[blockTitle], deviceName); calibrationData[blockTitle] = deviceDataToObj(lines, deviceName, blockTitle);
} }
for (const bt of blockTitles) { for (const bt of blockTitles) {
@ -151,7 +154,7 @@ function parseHardwareCalibration(content, accuracy) {
const instrumentInfo = parseInstrumentInfo(instrument); const instrumentInfo = parseInstrumentInfo(instrument);
const portData = parsePorts(ports, accuracy); const portData = parsePorts(ports, accuracy);
return {instrument: instrumentInfo, calibration: portData}; return {"Instrument": instrumentInfo, "Calibration": portData};
} }
export default function ParseHardwareCalibration(content, accuracy) { export default function ParseHardwareCalibration(content, accuracy) {

View File

@ -1,4 +1,5 @@
import {ONE_NEW_LINE, TWO_NEW_LINES} from "./utils/constants.js"; import {ONE_NEW_LINE, TWO_NEW_LINES} from "./utils/constants.js";
import {tr} from "date-fns/locale";
const isInRange = (index, value, masterValues) => { const isInRange = (index, value, masterValues) => {
return (masterValues[index]["Low Limit"] <= value && value <= masterValues[index]["High Limit"]); return (masterValues[index]["Low Limit"] <= value && value <= masterValues[index]["High Limit"]);
@ -55,6 +56,24 @@ function outOfTolerance(transducerInfo) {
} }
} }
function doMerge(transducerInfo) {
let idx = 0;
while (transducerInfo["Master Value"].length > 0) {
const mv = transducerInfo["Master Value"].shift()
transducerInfo["Gauge Reading"][idx] = {...transducerInfo["Gauge Reading"][idx], ...mv}
idx++;
}
delete transducerInfo["Master Value"] // clean up
}
function refactorData(transducerInfo) {
const {['Gauge Reading']: gr, ...instrument} = transducerInfo
return {
"Instrument": instrument,
"Gauge Reading": gr
}
}
function parseSection(section, accuracy) { function parseSection(section, accuracy) {
const lines = section.trim().split(ONE_NEW_LINE); const lines = section.trim().split(ONE_NEW_LINE);
const filteredLines = lines.filter((line) => !line.startsWith("==") && line !== "|| Transducer Verify Report ||"); const filteredLines = lines.filter((line) => !line.startsWith("==") && line !== "|| Transducer Verify Report ||");
@ -77,6 +96,7 @@ function parseSection(section, accuracy) {
[, value, unit] = match; [, value, unit] = match;
value = parseInt(value); value = parseInt(value);
} }
unit = unit.toUpperCase()
if (unit === "SCCM" || unit === "LPM") { if (unit === "SCCM" || unit === "LPM") {
// SCCM and LPM are Flow // SCCM and LPM are Flow
transducerType = "Flow"; transducerType = "Flow";
@ -91,15 +111,15 @@ function parseSection(section, accuracy) {
// Create an object to store the data for each transducer // Create an object to store the data for each transducer
const transducerInfo = { const transducerInfo = {
Accuracy: accuracy, "Accuracy": accuracy,
Value: value, "Value": value,
Unit: unit, "Unit": unit,
"Part Number": partNumber, "Part Number": partNumber,
"Limit ABS": value * accuracy * 1000, "Limit ABS": value * accuracy * 1000,
"Transducer Name": transducerName, "Transducer Name": transducerName,
"Transducer Type": transducerType, "Transducer Type": transducerType,
"Gauge Reading": [],
"Master Value": [], "Master Value": [],
"Gauge Reading": [],
"Verify Date": "", "Verify Date": "",
"Verify Time": "", "Verify Time": "",
}; };
@ -115,7 +135,8 @@ function parseSection(section, accuracy) {
})); }));
outOfTolerance(transducerInfo); outOfTolerance(transducerInfo);
return transducerInfo; doMerge(transducerInfo);
return refactorData(transducerInfo);
} }
function parseTransducer(content, accuracy) { function parseTransducer(content, accuracy) {

View File

@ -9,13 +9,7 @@ describe("Test for all files", () => {
for (const file of files) { for (const file of files) {
test(`Can parse ${file.name}`, () => { test(`Can parse ${file.name}`, () => {
const calibrations = ParseHardwareCalibration(file.content, 0.05); const calibrations = ParseHardwareCalibration(file.content, 0.05);
console.log(calibrations.calibration) console.log(calibrations)
}) })
} }
}); });
/*
? With hardware - is it still accuracy limits are 0.05% (or w.e specified) of `3LPM`
*/

View File

@ -8,16 +8,14 @@ describe("Test for all files", () => {
for (const file of files) { for (const file of files) {
test(`Can parse ${file.name}`, () => { test(`Can parse ${file.name}`, () => {
const transducers = ParseTransducer(file.content, 0.05) const transducers = ParseTransducer(file.content, 0.05)
console.log(transducers[0]["Master Value"])
expect(transducers.length).toBeGreaterThan(0) expect(transducers.length).toBeGreaterThan(0)
for (const transducer of transducers) { for (const transducer of transducers) {
expect(transducer).toHaveProperty("Part Number") expect(transducer["Instrument"]).toHaveProperty("Part Number")
expect(transducer).toHaveProperty("Transducer Name") expect(transducer["Instrument"]).toHaveProperty("Transducer Name")
expect(transducer).toHaveProperty("Gauge Reading") expect(transducer).toHaveProperty("Gauge Reading")
expect(transducer).toHaveProperty("Master Value") expect(transducer).not.toHaveProperty("Master Value")
expect(transducer["Gauge Reading"].length).toBeGreaterThan(1); expect(transducer["Gauge Reading"].length).toBeGreaterThan(1);
expect(transducer["Master Value"].length).toBe(transducer["Gauge Reading"].length);
} }
}); });
} }
@ -28,14 +26,14 @@ describe("Testing actual calculations", () => {
const content = fs.readFileSync("src/parsers/__tests__/transducer_verify/Blackbelt with flow 220601_143736 Transducer Verify.txt", 'utf8'); const content = fs.readFileSync("src/parsers/__tests__/transducer_verify/Blackbelt with flow 220601_143736 Transducer Verify.txt", 'utf8');
const transducers = ParseTransducer(content, 0.05); const transducers = ParseTransducer(content, 0.05);
for (const transducer of transducers) { for (const transducer of transducers) {
let anyOOT = false; let atLeastOneOOT = false;
for (const gauge of transducer["Gauge Reading"]) { for (const gauge of transducer["Gauge Reading"]) {
if (!gauge["In Range"]) { if (!gauge["In Range"]) {
anyOOT = true; atLeastOneOOT = true;
expect(gauge["Out Of Tolerance"]).toBeGreaterThan(0) expect(gauge["Out Of Tolerance"]).toBeGreaterThan(0)
} }
} }
expect(anyOOT).toBeTruthy(); expect(atLeastOneOOT).toBeTruthy();
} }
}) })
}); });