|
|
@ -9,9 +9,18 @@ export const DEFAULT_CORRECTION_FACTORS = { |
|
|
|
|
|
|
|
|
export const DEFAULT_CORRECTION_DISTANCE = 10 |
|
|
export const DEFAULT_CORRECTION_DISTANCE = 10 |
|
|
|
|
|
|
|
|
|
|
|
export const createDefaultFactorGroup = () => ({ |
|
|
|
|
|
...DEFAULT_CORRECTION_FACTORS |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
export const createDefaultDualCorrectionFactors = () => ({ |
|
|
|
|
|
positive: createDefaultFactorGroup(), |
|
|
|
|
|
negative: createDefaultFactorGroup() |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
export const createDefaultCorrectionProfile = (distance = DEFAULT_CORRECTION_DISTANCE) => ({ |
|
|
export const createDefaultCorrectionProfile = (distance = DEFAULT_CORRECTION_DISTANCE) => ({ |
|
|
distance, |
|
|
distance, |
|
|
...DEFAULT_CORRECTION_FACTORS |
|
|
...createDefaultDualCorrectionFactors() |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
export const createDefaultCorrectionConfig = () => ({ |
|
|
export const createDefaultCorrectionConfig = () => ({ |
|
|
@ -44,6 +53,21 @@ export const sanitizeCorrectionFactors = (value) => { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
export const sanitizeDualCorrectionFactors = (value) => { |
|
|
|
|
|
const next = value && typeof value === 'object' ? value : {} |
|
|
|
|
|
const hasPositiveGroup = next.positive && typeof next.positive === 'object' |
|
|
|
|
|
const hasNegativeGroup = next.negative && typeof next.negative === 'object' |
|
|
|
|
|
|
|
|
|
|
|
if (!hasPositiveGroup || !hasNegativeGroup) { |
|
|
|
|
|
return null |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
|
positive: sanitizeCorrectionFactors(next.positive), |
|
|
|
|
|
negative: sanitizeCorrectionFactors(next.negative) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
export const sanitizeCorrectionProfile = (value) => { |
|
|
export const sanitizeCorrectionProfile = (value) => { |
|
|
const next = value && typeof value === 'object' ? value : {} |
|
|
const next = value && typeof value === 'object' ? value : {} |
|
|
const distance = toPositiveInteger(next.distance) |
|
|
const distance = toPositiveInteger(next.distance) |
|
|
@ -52,9 +76,14 @@ export const sanitizeCorrectionProfile = (value) => { |
|
|
return null |
|
|
return null |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const normalizedGroups = sanitizeDualCorrectionFactors(next) |
|
|
|
|
|
if (!normalizedGroups) { |
|
|
|
|
|
return null |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return { |
|
|
return { |
|
|
distance, |
|
|
distance, |
|
|
...sanitizeCorrectionFactors(next) |
|
|
...normalizedGroups |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -110,24 +139,8 @@ export const getActiveCorrectionFactors = (config) => { |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
return activeProfile |
|
|
return activeProfile |
|
|
? sanitizeCorrectionFactors(activeProfile) |
|
|
? sanitizeDualCorrectionFactors(activeProfile) ?? createDefaultDualCorrectionFactors() |
|
|
: { ...DEFAULT_CORRECTION_FACTORS } |
|
|
: createDefaultDualCorrectionFactors() |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
export const ensureDefaultDistanceProfile = (profiles) => { |
|
|
|
|
|
const normalizedProfiles = sanitizeCorrectionProfiles(profiles) |
|
|
|
|
|
const hasDefaultDistance = normalizedProfiles.some( |
|
|
|
|
|
(profile) => profile.distance === DEFAULT_CORRECTION_DISTANCE |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
if (hasDefaultDistance) { |
|
|
|
|
|
return normalizedProfiles |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return [ |
|
|
|
|
|
...normalizedProfiles, |
|
|
|
|
|
createDefaultCorrectionProfile(DEFAULT_CORRECTION_DISTANCE) |
|
|
|
|
|
] |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export const removeCorrectionProfileWithFallback = (profiles, activeDistance, distanceToDelete) => { |
|
|
export const removeCorrectionProfileWithFallback = (profiles, activeDistance, distanceToDelete) => { |
|
|
@ -162,7 +175,7 @@ export const removeCorrectionProfileWithFallback = (profiles, activeDistance, di |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export const correctAxisValue = (originalValue, k, b) => { |
|
|
const getFactorGroupNameByValue = (originalValue) => { |
|
|
if (originalValue === null || originalValue === undefined || originalValue === '') { |
|
|
if (originalValue === null || originalValue === undefined || originalValue === '') { |
|
|
return null |
|
|
return null |
|
|
} |
|
|
} |
|
|
@ -172,7 +185,72 @@ export const correctAxisValue = (originalValue, k, b) => { |
|
|
return null |
|
|
return null |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return k * numericOriginal + b |
|
|
return numericOriginal < 0 ? 'negative' : 'positive' |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
export const correctAxisValue = (originalValue, factors) => { |
|
|
|
|
|
if (originalValue === null || originalValue === undefined || originalValue === '') { |
|
|
|
|
|
return { correctedValue: null, appliedGroup: null, appliedFactors: null } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const numericOriginal = Number(originalValue) |
|
|
|
|
|
if (!Number.isFinite(numericOriginal)) { |
|
|
|
|
|
return { correctedValue: null, appliedGroup: null, appliedFactors: null } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const normalizedGroups = sanitizeDualCorrectionFactors(factors) |
|
|
|
|
|
if (!normalizedGroups) { |
|
|
|
|
|
return { correctedValue: null, appliedGroup: null, appliedFactors: null } |
|
|
|
|
|
} |
|
|
|
|
|
const appliedGroup = getFactorGroupNameByValue(numericOriginal) |
|
|
|
|
|
const appliedFactors = appliedGroup ? normalizedGroups[appliedGroup] : null |
|
|
|
|
|
|
|
|
|
|
|
if (!appliedFactors) { |
|
|
|
|
|
return { correctedValue: null, appliedGroup: null, appliedFactors: null } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
|
correctedValue: appliedFactors.xK * numericOriginal + appliedFactors.xB, |
|
|
|
|
|
appliedGroup, |
|
|
|
|
|
appliedFactors: { |
|
|
|
|
|
xK: appliedFactors.xK, |
|
|
|
|
|
xB: appliedFactors.xB |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const correctAxisWithKeys = (originalValue, factors, axis) => { |
|
|
|
|
|
if (originalValue === null || originalValue === undefined || originalValue === '') { |
|
|
|
|
|
return { correctedValue: null, appliedGroup: null, appliedFactors: null } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const numericOriginal = Number(originalValue) |
|
|
|
|
|
if (!Number.isFinite(numericOriginal)) { |
|
|
|
|
|
return { correctedValue: null, appliedGroup: null, appliedFactors: null } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const normalizedGroups = sanitizeDualCorrectionFactors(factors) |
|
|
|
|
|
if (!normalizedGroups) { |
|
|
|
|
|
return { correctedValue: null, appliedGroup: null, appliedFactors: null } |
|
|
|
|
|
} |
|
|
|
|
|
const appliedGroup = getFactorGroupNameByValue(numericOriginal) |
|
|
|
|
|
const appliedFactors = appliedGroup ? normalizedGroups[appliedGroup] : null |
|
|
|
|
|
|
|
|
|
|
|
if (!appliedFactors) { |
|
|
|
|
|
return { correctedValue: null, appliedGroup: null, appliedFactors: null } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const kKey = `${axis}K` |
|
|
|
|
|
const bKey = `${axis}B` |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
|
correctedValue: appliedFactors[kKey] * numericOriginal + appliedFactors[bKey], |
|
|
|
|
|
appliedGroup, |
|
|
|
|
|
appliedFactors: { |
|
|
|
|
|
[kKey]: appliedFactors[kKey], |
|
|
|
|
|
[bKey]: appliedFactors[bKey] |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export const applyCorrectionToSensor = (sensor, correctionFactors) => { |
|
|
export const applyCorrectionToSensor = (sensor, correctionFactors) => { |
|
|
@ -180,32 +258,44 @@ export const applyCorrectionToSensor = (sensor, correctionFactors) => { |
|
|
return sensor |
|
|
return sensor |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const normalizedFactors = sanitizeCorrectionFactors(correctionFactors) |
|
|
const normalizedFactors = |
|
|
const correctedX = correctAxisValue(sensor.xReal, normalizedFactors.xK, normalizedFactors.xB) |
|
|
sanitizeDualCorrectionFactors(correctionFactors) ?? createDefaultDualCorrectionFactors() |
|
|
const correctedY = correctAxisValue(sensor.yReal, normalizedFactors.yK, normalizedFactors.yB) |
|
|
const xResult = correctAxisWithKeys(sensor.xReal, normalizedFactors, 'x') |
|
|
|
|
|
const yResult = correctAxisWithKeys(sensor.yReal, normalizedFactors, 'y') |
|
|
|
|
|
|
|
|
console.log('[DeflectionCorrection]', { |
|
|
console.log('[DeflectionCorrection]', { |
|
|
pos: sensor.pos ?? null, |
|
|
pos: sensor.pos ?? null, |
|
|
des: sensor.des ?? '', |
|
|
des: sensor.des ?? '', |
|
|
x: { |
|
|
x: { |
|
|
originalValue: sensor.xReal ?? null, |
|
|
originalValue: sensor.xReal ?? null, |
|
|
k: normalizedFactors.xK, |
|
|
appliedGroup: xResult.appliedGroup, |
|
|
b: normalizedFactors.xB, |
|
|
k: xResult.appliedFactors?.xK ?? null, |
|
|
correctedValue: correctedX |
|
|
b: xResult.appliedFactors?.xB ?? null, |
|
|
|
|
|
correctedValue: xResult.correctedValue |
|
|
}, |
|
|
}, |
|
|
y: { |
|
|
y: { |
|
|
originalValue: sensor.yReal ?? null, |
|
|
originalValue: sensor.yReal ?? null, |
|
|
k: normalizedFactors.yK, |
|
|
appliedGroup: yResult.appliedGroup, |
|
|
b: normalizedFactors.yB, |
|
|
k: yResult.appliedFactors?.yK ?? null, |
|
|
correctedValue: correctedY |
|
|
b: yResult.appliedFactors?.yB ?? null, |
|
|
|
|
|
correctedValue: yResult.correctedValue |
|
|
} |
|
|
} |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
return { |
|
|
return { |
|
|
...sensor, |
|
|
...sensor, |
|
|
appliedCorrectionFactors: normalizedFactors, |
|
|
appliedCorrectionFactors: { |
|
|
correctedX, |
|
|
x: { |
|
|
correctedY |
|
|
group: xResult.appliedGroup, |
|
|
|
|
|
factors: xResult.appliedFactors |
|
|
|
|
|
}, |
|
|
|
|
|
y: { |
|
|
|
|
|
group: yResult.appliedGroup, |
|
|
|
|
|
factors: yResult.appliedFactors |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
correctedX: xResult.correctedValue, |
|
|
|
|
|
correctedY: yResult.correctedValue |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|