config: start implementing json-based configuration files
This commit is contained in:
parent
56e2e76954
commit
07e6e98673
70
src/JsonCoordinateMapping.cpp
Normal file
70
src/JsonCoordinateMapping.cpp
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#include "./JsonCoordinateMapping.h"
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
JsonCoordinateMapping::physicalPixelCount() const {
|
||||||
|
int total = 0;
|
||||||
|
for(int i = 0; i < strideCount; i++) {
|
||||||
|
total += displayMap[i].length;
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
JsonCoordinateMapping::physicalCoordsToIndex(const PhysicalCoordinates localCoords) const {
|
||||||
|
uint8_t idx = 0;
|
||||||
|
bool inverse = false;
|
||||||
|
for(int i = 0; i < localCoords.x; i++) {
|
||||||
|
idx += displayMap[i].length;
|
||||||
|
inverse = !inverse;
|
||||||
|
}
|
||||||
|
if (inverse) {
|
||||||
|
idx += std::max(0, displayMap[localCoords.x].length - 1 - std::max(0, (int)localCoords.y - displayMap[localCoords.x].y));
|
||||||
|
} else {
|
||||||
|
idx += std::min((int)displayMap[localCoords.x].length - 1, std::max(0, (int)localCoords.y - displayMap[localCoords.x].y));
|
||||||
|
}
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
PhysicalCoordinates
|
||||||
|
JsonCoordinateMapping::virtualToPhysicalCoords(const VirtualCoordinates virtualCoords) const {
|
||||||
|
const uint8_t spanIdx = scale8(strideCount-1, virtualCoords.x);
|
||||||
|
const uint8_t spanOffset = scale8(maxStrideSize - 1, virtualCoords.y);
|
||||||
|
return PhysicalCoordinates{spanIdx, spanOffset};
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtualCoordinates
|
||||||
|
JsonCoordinateMapping::physicalToVirtualCoords(const PhysicalCoordinates localCoords) const {
|
||||||
|
int offset = localCoords.x;
|
||||||
|
for(int i = 0; i < strideCount; i++) {
|
||||||
|
if (offset > displayMap[i].length) {
|
||||||
|
offset -= displayMap[i].length;
|
||||||
|
} else {
|
||||||
|
return VirtualCoordinates{i, offset};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return VirtualCoordinates{0, 0};
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
JsonCoordinateMapping::load(const JsonArray& strideList)
|
||||||
|
{
|
||||||
|
maxStrideSize = 0;
|
||||||
|
strideCount = strideList.size();
|
||||||
|
for(int i = 0; i < strideList.size();i++) {
|
||||||
|
JsonObject strideObj = strideList[i];
|
||||||
|
int length = strideObj["pixels"];
|
||||||
|
int x = strideObj["x"];
|
||||||
|
int y = strideObj["y"];
|
||||||
|
displayMap[i] = Span{length, x, y};
|
||||||
|
Log.verbose("config: Found stride (%d, %d): %d", x, y, length);
|
||||||
|
maxStrideSize = length > maxStrideSize ? length : maxStrideSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
JsonCoordinateMapping::loadDefault()
|
||||||
|
{
|
||||||
|
displayMap[0] = Span{255, 0, 0};
|
||||||
|
maxStrideSize = 255;
|
||||||
|
strideCount = 1;
|
||||||
|
}
|
26
src/JsonCoordinateMapping.h
Normal file
26
src/JsonCoordinateMapping.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Figments.h>
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
struct JsonCoordinateMapping : CoordinateMapping {
|
||||||
|
struct Span {
|
||||||
|
int length = 0;
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
|
||||||
|
Span() {}
|
||||||
|
Span(int length, int x, int y) : length(length), x(x), y(y) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
Span displayMap[32];
|
||||||
|
int strideCount = 0;
|
||||||
|
int maxStrideSize = 0;
|
||||||
|
|
||||||
|
void load(const JsonArray& strides);
|
||||||
|
void loadDefault();
|
||||||
|
|
||||||
|
VirtualCoordinates physicalToVirtualCoords(const PhysicalCoordinates localCoords) const override;
|
||||||
|
PhysicalCoordinates virtualToPhysicalCoords(const VirtualCoordinates virtualCoords) const override;
|
||||||
|
int physicalCoordsToIndex(const PhysicalCoordinates localCoords) const override;
|
||||||
|
unsigned int physicalPixelCount() const override;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user