LED-BOARD/src/panel.cpp
2023-04-24 21:52:33 +02:00

109 lines
1.9 KiB
C++

#include "panel.hpp"
Panel::Panel(uint8_t pData, uint8_t pClock, uint8_t pLoad, int x, int y)
{
pinData = pData;
pinLoad = pLoad;
pinClock = pClock;
posX = x;
posY = y;
}
void Panel::init()
{
pinMode(pinData, OUTPUT);
pinMode(pinClock, OUTPUT);
pinMode(pinLoad, OUTPUT);
Serial.println(F("Panel init"));
}
void Panel::send_image(Image* img) {
int endY = posY + PANEL_HEIGHT;
int endX = posX + PANEL_WIDTH;
for (int y = posY; y < endY; y += 8) {
for (int x = posX; x < endX; x += 4) {
send_block(img, x, y);
}
}
load();
}
void Panel::clock() {
//PORTA |= (1 << PA2);
//PORTA &= ~(1 << PA2);
digitalWrite(pinClock, HIGH);
digitalWrite(pinClock, LOW);
}
void Panel::load() {
//PORTB |= (1 << PB0);
//PORTB &= ~(1 << PB0);
digitalWrite(pinLoad, HIGH);
digitalWrite(pinLoad, LOW);
}
void Panel::send_block(Image* p, int x, int y) {
int order[32][2] = {
{ 1, 1 }, // 1
{ 1, 0 }, // 2
{ 0, 1 }, // 3
{ 1, 2 }, // 4
{ 0, 2 }, // 5
{ 1, 3 }, // 6
{ 0, 0 }, // 7
{ 0, 3 }, // 8
{ 0, 4 }, // 9
{ 1, 4 }, // 10
{ 0, 5 }, // 11
{ 1, 7 }, // 12
{ 1, 5 }, // 13
{ 0, 6 }, // 14
{ 1, 6 }, // 15
{ 0, 7 }, // 16
{ 3, 7 }, // 17
{ 2, 6 }, // 18
{ 2, 7 }, // 19
{ 3, 6 }, // 20
{ 2, 5 }, // 21
{ 3, 5 }, // 22
{ 3, 4 }, // 23
{ 2, 4 }, // 24
{ 3, 3 }, // 25
{ 2, 0 }, // 26
{ 3, 0 }, // 27
{ 2, 3 }, // 28
{ 3, 2 }, // 29
{ 2, 1 }, // 30
{ 3, 1 }, // 31
{ 2, 2 }, // 32
};
for (int n = 0; n < 32; n++) {
int x_offset = order[n][0];
int y_offset = order[n][1];
byte pixel = p->get_pixel(x + x_offset, y + y_offset);
/*if(pixel)
{
PORTB |= (1 << PB2);
}
else
{
PORTB &= ~(1 << PB2);
}*/
digitalWrite(pinData, pixel);
clock();
}
// 33 bit - kein pixel - senden
clock();
}