You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.4 KiB
122 lines
4.4 KiB
#include <Wire.h>
|
|
#include <Adafruit_GFX.h>
|
|
#include <Adafruit_SSD1306.h>
|
|
#include "radDisplay.h"
|
|
#include "radDisplaySettings.h"
|
|
|
|
Adafruit_SSD1306 radDisplay(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, -1);
|
|
|
|
void initRadDisplay() {
|
|
Wire1.begin(RAD_I2C_SDA, RAD_I2C_SCL);
|
|
if(!radDisplay.begin(SSD1306_SWITCHCAPVCC, RAD_DISPLAY_I2C_ADDRESS)) {
|
|
//Serial.println("SSD1306 #2 allocation failed");
|
|
for(;;);
|
|
}
|
|
|
|
changeRad(0);
|
|
}
|
|
|
|
void changeRad(float value) {
|
|
radDisplay.clearDisplay();
|
|
radDisplay.fillScreen(RADBGRND);
|
|
overlayRadDisplay();
|
|
drawLineRadDisplay(convertValueToRadDisplay(value));
|
|
radDisplay.display();
|
|
}
|
|
|
|
float convertValueToRadDisplay(float value) {
|
|
return mapFloat(value, 0, 10, 90, -90);
|
|
}
|
|
|
|
void drawLineRadDisplay(float value) {
|
|
int r = 45;
|
|
float rad = value * PI / 180.0;
|
|
float radSin = sin(rad);
|
|
float radCos = cos(rad);
|
|
|
|
for (int x = radCenterX - 1; x < radCenterX + 1; x++) {
|
|
for (int y = radCenterY - 1; y < radCenterY + 1; y++) {
|
|
radDisplay.drawLine(x, y, x + (r * radSin), y - (r * radCos), RADCOLOR);
|
|
}
|
|
}
|
|
}
|
|
|
|
//todo optimaze
|
|
void calcRad(int16_t x, int16_t y, int radius, float radSin, float radCos) {
|
|
int endX = x + (radius * radSin);
|
|
int endY = y - (radius * radCos);
|
|
radDisplay.drawPixel(endX, endY, RADCOLOR);
|
|
}
|
|
|
|
void overlayRadDisplay() {
|
|
radDisplay.drawPixel(radCenterX, radCenterY, RADCOLOR);
|
|
for (int r = 1; r < 5; r++) {
|
|
radDisplay.drawCircle(radCenterX, radCenterY, r, RADCOLOR);
|
|
}
|
|
|
|
for (int angle = -90; angle <= 90; angle++) {
|
|
float rad = angle * PI / 180.0;
|
|
int absAngle = abs(angle);
|
|
float radSin = sin(rad);
|
|
float radCos = cos(rad);
|
|
|
|
calcRad(radCenterX, radCenterY, radRadius[internal], radSin, radCos);
|
|
calcRad(radCenterX, radCenterY, radRadius[external], radSin, radCos);
|
|
|
|
//need chunk
|
|
if (absAngle % 18 == 0) {
|
|
if ((absAngle + 90) % 36 == 0) {
|
|
int endLineX = radCenterX + (radRadius[extended] * radSin);
|
|
int endLineY = radCenterY - (radRadius[extended] * radCos);
|
|
|
|
int endLine4ChrX = radCenterX + ((radRadius[extended]+5) * radSin);
|
|
int endLine4ChrY = radCenterY - ((radRadius[extended]+5) * radCos);
|
|
|
|
radDisplay.drawLine(
|
|
radCenterX + (radRadius[internal] * radSin),
|
|
radCenterY - (radRadius[internal] * radCos),
|
|
endLineX,
|
|
endLineY,
|
|
RADCOLOR
|
|
);
|
|
|
|
int letChr = (5 - ((angle + 90) / 36)) * 2;
|
|
switch (letChr)
|
|
{
|
|
case 2:
|
|
for (int i = 0; i < sizeof(TwoLetterPoint) / sizeof(TwoLetterPoint[0]); i++) {
|
|
radDisplay.drawPixel(endLine4ChrX + TwoLetterPoint[i][0], endLine4ChrY + TwoLetterPoint[i][1], RADCOLOR);
|
|
}
|
|
break;
|
|
case 4:
|
|
for (int i = 0; i < sizeof(FourLetterPoint) / sizeof(FourLetterPoint[0]); i++) {
|
|
radDisplay.drawPixel(endLine4ChrX + FourLetterPoint[i][0], endLine4ChrY + FourLetterPoint[i][1], RADCOLOR);
|
|
}
|
|
break;
|
|
case 6:
|
|
for (int i = 0; i < sizeof(SixLetterPoint) / sizeof(SixLetterPoint[0]); i++) {
|
|
radDisplay.drawPixel(endLine4ChrX + SixLetterPoint[i][0], endLine4ChrY + SixLetterPoint[i][1], RADCOLOR);
|
|
}
|
|
break;
|
|
case 8:
|
|
for (int i = 0; i < sizeof(EightLetterPoint) / sizeof(EightLetterPoint[0]); i++) {
|
|
radDisplay.drawPixel(endLine4ChrX + EightLetterPoint[i][0], endLine4ChrY + EightLetterPoint[i][1], RADCOLOR);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
} else {
|
|
radDisplay.drawLine(
|
|
radCenterX + (radRadius[internal] * radSin),
|
|
radCenterY - (radRadius[internal] * radCos),
|
|
radCenterX + (radRadius[external] * radSin),
|
|
radCenterY - (radRadius[external] * radCos),
|
|
RADCOLOR
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|