Skip to content

Instantly share code, notes, and snippets.

@FredDrago
Created May 10, 2014 14:02
Show Gist options
  • Save FredDrago/63527eeaa829397139dd to your computer and use it in GitHub Desktop.
Save FredDrago/63527eeaa829397139dd to your computer and use it in GitHub Desktop.
/*
* Modified by Frederic Drago to display a panel using 24 bits hex colors and gamma correction
* Modified by Markus Lipp adding interleaved buffers, streaming, 32x32 & 24bit support
* Based on "_16x32_Matrix R3.0" by Creater Alex Medeiros, http://PenguinTech.tk
* Use code freely and distort its contents as much as you want, just remeber to thank the
* original creaters of the code by leaving their information in the header. :)
*/
//PortA[4:5, 12:13] = {33, 24, 3, 4}
//PortB[0:3, 16:19] = {16, 17, 19, 18, 0, 1, 32, 25}
//PortC[0:11] = {15, 22, 23, 9, 10, 13, 11, 12, 28, 27, 29, 30}
//PortD[0:7] = {2, 14, 7, 8, 6, 20, 21, 5}
//PortE[0:1] = {31, 26}
// Define pins (if you cannot use portB, since pin 32 is not available by default on the Teensy, portC must be used,
// then change also GPIOB to GPIOC in the code.
const uint8_t
//PortC
//APIN = 15, BPIN = 22, CPIN = 23, DPIN = 9, CLOCKPIN = 10, LATCHPIN = 13, OEPIN = 11,
//PortB
APIN = 16, BPIN = 17, CPIN = 19, DPIN = 18, CLOCKPIN = 0, LATCHPIN = 1, OEPIN = 32,
//PortD
R1PIN = 2, R2PIN = 8,
G1PIN = 14, G2PIN = 6,
B1PIN = 7, B2PIN = 20;
uint8_t pinTable[13] = {
R1PIN,R2PIN,G1PIN,G2PIN,B1PIN,B2PIN,
APIN,BPIN,CPIN,DPIN,CLOCKPIN,LATCHPIN,OEPIN};
//Addresses 1/8 rows Through a decoder
uint16_t const A = 1, B = 2,C = 4, D=8;
//Acts like a 16 bit shift register
uint32_t const SCLK = 65536;//16 if using portC
uint32_t const LATCH = 131072;//32 if using portC
uint32_t const OE = 262144;//64 if using portC
uint16_t const abcVar[16] = { //Decoder counter var
// 0,A,B,A+B,C,C+A,C+B,A+B+C,0+D,A+D,B+D,A+B+D,C+D,C+A+D,C+B+D,A+B+C+D};
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//Data Lines for row 1 red and row 9 red, ect.
uint16_t const RED1 = 1, RED2 = 8;
uint16_t const GREEN1 = 2, GREEN2 = 16;
uint16_t const BLUE1 = 4, BLUE2 = 32;
const uint8_t SIZEX = 32;
const uint8_t SIZEY = 32;
//BAM and interrupt variables
uint8_t rowN = 0;
uint16_t BAM;
uint8_t BAMMAX = 7; //now 24bit color! (0-7)
IntervalTimer timer1;
uint8_t gImage[1024][3];
uint8_t gr, gg, gb;
uint8_t r, g, b;
char buffer[120];
int bufidx = 0;
char c;
int i = 0;
int color = 0;
// -------------------------------- sample image to display by default -----------------------------------------------------
static int hello[1024] = {
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,
0xFFFFFF,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,
0xFFFFFF,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFFFFFF,0x000000,
0xFFFFFF,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0x00000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,
0x000000,0x000000,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0x000000,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xFBA904,
0xFBA904,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0x000000,0xFFFFFF,0x000000,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0x000000,0xFFFFFF,0xFFFFFF,0x000000,0x000000,
0xFBA904,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0x000000,0xFFFFFF,0xFFFFFF,0x000000,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,
0xFBA904,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFFFFFF,0x000000,0x000000,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,
0xFBA904,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,
0x000000,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0x000000,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0x000000,
0xFBA904,0xFBA904,0xFBA904,0x000000,0x000000,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0xFBA904,0x000000,0x000000,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0xFBA904,0x000000,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0x000000,0xFBA904,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0x000000,0x000000,0x000000,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0x000000,0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0xFBA904,0xFBA904,0x000000,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0xFBA904,0x000000,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0xFBA904,0x000000,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0x000000,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,
0xFBA904,0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,
0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0x000000,0x000000,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0x000000,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0xFBA904,0x000000,0x000000,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFC02B5,0xFC02B5,0xFC02B5,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFB0412,0xFB0412,0xFB0412,0xFFFFFF,0x000000,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0x000000,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFC02B5,0xF7FB04,0xF7FB04,0xF7FB04,0xFC02B5,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFB0412,0xF7FB04,0xF7FB04,0xF7FB04,0x000000,0x000000,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0x000000,
0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFC02B5,0xF7FB04,0xF7FB04,0xF7FB04,0xFC02B5,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFB0412,0xF7FB04,0xF7FB04,0xF7FB04,0x000000,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,
0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFC02B5,0x2AF60A,0xFC02B5,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFB0412,0x2AF60A,0xFB0412,0x000000,0xFB0412,0x000000,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0x000000,0xFB0412,
0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x2AF60A,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x2AF60A,0xFFFFFF,0x000000,0xFB0412,0x000000,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0x000000,0xFB0412,
0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x2AF60A,0xFFFFFF,0x2AF60A,0xFFFFFF,0x2AF60A,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x2AF60A,0x2AF60A,0x2AF60A,0x000000,0xFB0412,0x000000,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0xFB0412,0x000000,0xFB0412,
0x000000,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x2AF60A,0x2AF60A,0x2AF60A,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF
};
// ----------------------------------------------------------------------------------------------------------------------------------
void setup() {
for(uint8_t i = 0; i < 13; i++){
pinMode(pinTable[i], OUTPUT);
}
// Prepare a default image
for (int i = 0; i < 1024; i++) {
gammaCorrect(hello[i]);
gImage[i][0] = gr;
gImage[i][1] = gg;
gImage[i][2] = gb;
}
Serial.begin(250000);
timerInit();
}
// ----------------------------------------------------------------------------------------------------------------------------------
void loop() {
// Normal serial from USB
// format to change a led is c,led number, color in hexadecimal ex: c,0,FF00FF (will change the first led to magenta)
Serial.flush();
if (Serial.available() > 0) {
c = (char)Serial.read();
buffer[bufidx++] = c;
if (c == '\n') {
buffer[bufidx++] = '\n';
bufidx = 0;
parseBuffer();
//gammaCorrectRGB(r, g, b); // works but takes too much time (could use a table), implemented in processing anyway
gImage[i][0] = r;
gImage[i][1] = g;
gImage[i][2] = b;
}
}
}
// ---------------------------------------------------END LOOP----------------------------------------------------------------
void timerInit() {
BAM = 0;
attackMatrix();
}
//The updating matrix stuff happens here
//each pair of rows is taken through its BAM cycle
//then the rowNumber is increased and is done again
void attackMatrix() {
timer1.end();
uint16_t portData;
portData = 0; // Clear data to enter
portData |= (abcVar[rowN])|OE; // abc, OE
portData &=~ LATCH; //LATCH LOW
GPIOB_PDOR = portData; // Write to Port
for(uint8_t i = 0; i < 32; i++){
uint16_t row = (rowN<<5)+i;
uint16_t row16 = ((rowN+16)<<5)+i;
uint16_t tempC[6] = { //Prepare data in correct place
((gImage[row][0])<<1) , ((gImage[row16][0])<<4), //3
((gImage[row][1])<<1), ((gImage[row16][1])<<4), //4
(gImage[row][2]<<1), (gImage[row16][2])<<4 }; //6
uint16_t allC =//Put OUTPUT data into temp variable
((tempC[0]>>BAM)&RED1)|((tempC[1]>>BAM)&RED2)|
((tempC[2]>>BAM)&GREEN1)|((tempC[3]>>BAM)&GREEN2)|
((tempC[4]>>BAM)&BLUE1)|((tempC[5]>>BAM)&BLUE2);
GPIOD_PDOR = (allC); // Transfer data
GPIOB_PDOR |= SCLK;// Clock HIGH
GPIOB_PDOR &=~ SCLK;// Clock LOW
}
GPIOB_PDOR |= LATCH;// Latch HIGH
GPIOB_PDOR &=~ OE;// OE LOW, Displays line
#define LOOPTIME 1 //trial&error to get both smooth gradients & little flicker
#define CALLOVERHEAD 1
timer1.begin(attackMatrix,((LOOPTIME+CALLOVERHEAD)<<BAM)-CALLOVERHEAD);
if(BAM >= BAMMAX) { //Checks the BAM cycle for next time.
if(rowN == 15){
rowN = 0;
}
else {
rowN ++;
}
BAM = 0;
}
else {
BAM ++;
}
}
// Choose appropriate gamma value by comparison with computer monitor
void gammaCorrect(int pixel)
{
float gammaCorrect = 1.0 /0.28;
gr = uint8_t((255.0 * (pow(((pixel >> 16) & 0xFF) / 255.0, gammaCorrect))));
gg = uint8_t((255.0 * (pow(((pixel >> 8) & 0xFF) / 255.0, gammaCorrect))));
gb = uint8_t((255.0 * (pow((pixel & 0xFF) / 255.0, gammaCorrect))));
// following gives the best color reproduction, however brightness is lost
// float gammaCorrect = 1.0 /0.45;
// gr = uint8_t((255.0 * (pow(((pixel >> 16) & 0xFF) / 255.0, gammaCorrect)))*0.33);
// gg = uint8_t((255.0 * (pow(((pixel >> 8) & 0xFF) / 255.0, gammaCorrect))))*0.33;
// gb = uint8_t((255.0 * (pow((pixel & 0xFF) / 255.0, gammaCorrect)))*0.15);
}
void gammaCorrectRGB(uint8_t r, uint8_t g, uint8_t b)
{
float gammaCorrect = 1.0 /0.28;
gr = uint8_t((255.0 * (pow(r / 255.0, gammaCorrect))));
gg = uint8_t((255.0 * (pow(g / 255.0, gammaCorrect))));
gb = uint8_t((255.0 * (pow(b / 255.0, gammaCorrect))));
}
void hexToColor(int pixel)
{
gr = uint8_t((pixel >> 16) & 0xFF);
gg = uint8_t((pixel >> 8) & 0xFF);
gb = uint8_t(pixel & 0xFF);
}
void parseBuffer(void)
{
char *parseptr;
if (strncmp(buffer,"C",1) == 0 || strncmp(buffer,"c",1) == 0){
parseptr = strchr(buffer, ',')+1;
i = parsenumber(parseptr,0);
parseptr = strchr(parseptr, ',')+1;
r = parseHex(parseptr[0])* 16 + parseHex(parseptr[1]) ;
g = parseHex(parseptr[2])* 16 + parseHex(parseptr[3]) ;
b = parseHex(parseptr[4])* 16 + parseHex(parseptr[5]) ;
}
}
// Function to parse fixed point numbers (numdec=number of decimals)
long parsenumber(char *str,byte numdec) {
long d = 0;
byte ndec = 0;
while (str[0] != 0) {
if (str[0] == '.'){
ndec = 1;
}
else {
if ((str[0] > '9') || (str[0] < '0'))
return d;
d *= 10;
d += str[0] - '0';
if (ndec > 0)
ndec++;
if (ndec > numdec) // we reach the number of decimals...
return d;
}
str++;
}
return d;
}
byte parseHex(char c) {
if (c < '0')
return (0);
if (c <= '9')
return (c - '0');
if (c < 'A')
return (0);
if (c <= 'F')
return ((c - 'A')+10);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment