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