BMDatalogger/BMDatalogger/CustomCharacter.ino

398 lines
14 KiB
C++

const char Progbar2_START[][8] PROGMEM = {
{ B01111, B11000, B10000, B10000, B10000, B10000, B11000, B01111 },
{ B01111, B11000, B10011, B10111, B10111, B10011, B11000, B01111 }
};
const char Progbar2_MIDDLE[][8] PROGMEM = {
{ B11111, B00000, B00000, B00000, B00000, B00000, B00000, B11111 },
{ B11111, B00000, B11000, B11000, B11000, B11000, B00000, B11111 },
{ B11111, B00000, B11011, B11011, B11011, B11011, B00000, B11111 },
{ B11111, B00000, B00011, B00011, B00011, B00011, B00000, B11111 }
};
const char Progbar2_END[][8] PROGMEM = {
{ B11110, B00011, B00001, B00001, B00001, B00001, B00011, B11110 },
{ B11110, B00011, B11001, B11101, B11101, B11001, B00011, B11110 }
};
const char Progbar3[][8] PROGMEM = {
{ B10101, B00000, B00000, B00000, B00000, B00000, B00000, B10101 },
{ B10101, B10000, B10000, B10000, B10000, B10000, B10000, B10101 },
{ B10101, B10100, B10100, B10100, B10100, B10100, B10100, B10101 },
{ B10101, B10101, B10101, B10101, B10101, B10101, B10101, B10101 },
{ B10101, B00100, B00100, B00100, B00100, B00100, B00100, B10101 },
{ B10101, B00001, B00001, B00001, B00001, B00001, B00001, B10101 }
};
const char Progbar4[][8] PROGMEM = {
{ B11111, B10000, B10000, B10000, B10000, B10000, B10000, B11111 },
{ B11111, B01000, B01000, B01000, B01000, B01000, B01000, B11111 },
{ B11111, B00100, B00100, B00100, B00100, B00100, B00100, B11111 },
{ B11111, B00010, B00010, B00010, B00010, B00010, B00010, B11111 },
{ B11111, B00001, B00001, B00001, B00001, B00001, B00001, B11111 },
{ B11111, B00000, B00000, B00000, B00000, B00000, B00000, B11111 }
};
const char custom[][8] PROGMEM = {
{ 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00 }, // char 1
{ 0x18, 0x1C, 0x1E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }, // char 2
{ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x07, 0x03 }, // char 3
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F }, // char 4
{ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1C, 0x18 }, // char 5
{ 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x1F }, // char 6
{ 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F }, // char 7
{ 0x03, 0x07, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F } // char 8
};
const char *bigChars[][2] = {
{"\024", "\024"}, // Space
{"\024", "\004"}, // .
{"\010\001\002", "\003\004\005"}, // 0
{"\001\002", "\024\377"}, // 1
{"\006\006\002", "\003\007\007"}, // 2
{"\006\006\002", "\007\007\005"}, // 3
{"\003\004\002", "\024\024\377"}, // 4
{"\377\006\006", "\007\007\005"}, // 5
{"\010\006\006", "\003\007\005"}, // 6
{"\001\001\002", "\024\010\024"}, // 7
{"\010\006\002", "\003\007\005"}, // 8
{"\010\006\002", "\024\024\377"}, // 9
{"\004", "\001"}, // :
{"\010\006\002", "\377\024\377"}, // A
{"\377\006\005", "\377\007\002"}, // B
{"\010\001\001", "\003\004\004"}, // C
{"\377\001\002", "\377\004\005"}, // D
{"\377\006\006", "\377\007\007"}, // E
{"\377\006\006", "\377\024\024"}, // F
{"\010\001\001", "\003\004\002"}, // G
{"\377\004\377", "\377\024\377"}, // H
{"\001\377\001", "\004\377\004"}, // I
{"\024\024\377", "\004\004\005"}, // J
{"\377\004\005", "\377\024\002"}, // K
{"\377\024\024", "\377\004\004"}, // L
{"\010\003\005\002", "\377\024\024\377"}, // M
{"\010\002\024\377", "\377\024\003\005"}, // N
{"\010\001\002", "\003\004\005"}, // 0
{"\377\006\002", "\377\024\024"}, // P
{"\010\001\002\024", "\003\004\377\004"}, // Q
{"\377\006\002", "\377\024\002"}, // R
{"\010\006\006", "\007\007\005"}, // S
{"\001\377\001", "\024\377\024"}, // T
{"\377\024\377", "\003\004\005"}, // U
{"\003\024\024\005", "\024\002\010\024"}, // V
{"\377\024\024\377", "\003\010\002\005"}, // W
{"\003\004\005", "\010\024\002"}, // X
{"\003\004\005", "\024\377\024"}, // Y
{"\001\006\005", "\010\007\004"}, // Z
};
byte InitMode = 99;
void CharacterInit(byte bank) {
if (InitMode != bank) {
uint8_t ThisArray[8];
switch (bank) {
case 0:
for (int i=0; i<5; i++ ) {
byte ThisByte = 0x00;
if (ProgressBarMode == 0) {
if (i == 0) ThisByte = 0x1F;
if (i == 1) ThisByte = 0x10;
if (i == 2) ThisByte = 0x18;
if (i == 3) ThisByte = 0x1C;
if (i == 4) ThisByte = 0x1E;
}
if (ProgressBarMode == 1) {
if (i == 0) ThisByte = 0x01;
if (i == 1) ThisByte = 0x10;
if (i == 2) ThisByte = 0x08;
if (i == 3) ThisByte = 0x04;
if (i == 4) ThisByte = 0x02;
}
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) ThisByte;
lcd.createChar (i, ThisArray);
}
break;
case 1:
for (int i=0; i<8; i++ ) {
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &custom[i][i2] );
lcd.createChar (i+1, ThisArray);
}
break;
case 2:
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar2_START[0][i2] ); lcd.createChar (1, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar2_START[1][i2] ); lcd.createChar (2, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar2_MIDDLE[0][i2] ); lcd.createChar (3, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar2_MIDDLE[1][i2] ); lcd.createChar (4, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar2_MIDDLE[2][i2] ); lcd.createChar (5, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar2_END[0][i2] ); lcd.createChar (6, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar2_END[1][i2] ); lcd.createChar (7, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar2_MIDDLE[3][i2] ); lcd.createChar (8, ThisArray);
break;
case 3:
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar3[0][i2] ); lcd.createChar (0, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar3[1][i2] ); lcd.createChar (1, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar3[2][i2] ); lcd.createChar (2, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar3[3][i2] ); lcd.createChar (3, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar3[4][i2] ); lcd.createChar (4, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar3[5][i2] ); lcd.createChar (5, ThisArray);
break;
case 4:
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar4[0][i2] ); lcd.createChar (0, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar4[1][i2] ); lcd.createChar (1, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar4[2][i2] ); lcd.createChar (2, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar4[3][i2] ); lcd.createChar (3, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar4[4][i2] ); lcd.createChar (4, ThisArray);
for (int i2=0; i2<8; i2++) ThisArray[i2]= (uint8_t) pgm_read_byte( &Progbar4[5][i2] ); lcd.createChar (5, ThisArray);
break;
}
InitMode = bank;
}
}
void DrawProgressBar(const int value, const int Lenght) {
int percent = GetPeakPercent(value);
DrawProgressBarPercent(percent, Lenght);
}
void DrawProgressBarPercent(const int value, const int Lenght) {
int StyleMode = 1;
if (ProgressBarMode == 2 | ProgressBarMode == 3) StyleMode = 2;
if (ProgressBarMode == 4 | ProgressBarMode == 5) StyleMode = 3;
if (ProgressBarMode == 6) StyleMode = 4;
int WhiteMode = 0;
if (ProgressBarMode == 1| ProgressBarMode == 3 | ProgressBarMode == 5) WhiteMode = 1;
if (StyleMode == 1) CharacterInit(0);
if (StyleMode == 2) CharacterInit(2);
if (StyleMode == 3) CharacterInit(3);
if (StyleMode == 4) CharacterInit(4);
int percent = value;
//int nb_columns = map(percent, 0, 100, 0, Lenght * 2 * 4 - 2 * 4);
//int nb_columns = (percent * ((Lenght * 8) - 8)) / 100;
int nb_columns = (percent * ((Lenght * 2) - 2)) / 100;
double RowsNumber = ((double) Lenght / 100) * (double) percent;
int RowsDone = 0;
lcd.setCursor(XPos, YPos);
//ProgBar Style #1
if (StyleMode == 1) {
if (RowsNumber >= 1) {
for (int i=1; i < RowsNumber; i++) {
if (WhiteMode == 0) lcd.write((uint8_t)0);
if (WhiteMode == 1) lcd.write(' ');
RowsDone++;
}
}
RowsNumber = RowsNumber - RowsDone;
unsigned int peace = RowsNumber * 5;
switch (peace) {
case 0:
if (WhiteMode == 1) {
lcd.write((uint8_t)1);
RowsDone++;
}
break;
case 1:
lcd.write((uint8_t)1); RowsDone++;
break;
case 2:
lcd.write((uint8_t)2); RowsDone++;
break;
case 3:
lcd.write((uint8_t)3); RowsDone++;
break;
case 4:
lcd.write((uint8_t)4); RowsDone++;
break;
case 5:
lcd.write((uint8_t)0); RowsDone++;
break;
}
for (int i =0; i < (Lenght - RowsDone); i++) lcd.write(' ');
}
//ProgBar Style #2
if (StyleMode == 2) {
for (byte i = 0; i < Lenght; ++i) {
if (i == 0) {
if ((nb_columns > 0 && WhiteMode == 0) | (nb_columns == 1 && WhiteMode == 1)) {
lcd.write(2);
nb_columns -= 1;
} else {
lcd.write((uint8_t)1);
}
} else if (i == Lenght -1) {
if (nb_columns > 0) lcd.write(7);
if (nb_columns == 0) lcd.write(6);
} else {
if ((nb_columns >= 2 && WhiteMode == 0) | (nb_columns == 2 && WhiteMode == 1)) {
if (WhiteMode == 0) lcd.write(5);
if (WhiteMode == 1) lcd.write(8);
nb_columns -= 2;
} else if (nb_columns == 1) {
lcd.write(4);
nb_columns -= 1;
} else {
lcd.write(3);
if (WhiteMode == 1 && nb_columns > 2) nb_columns -= 2;
}
}
}
}
//ProgBar Style #3
if (StyleMode == 3) {
if (RowsNumber >= 1) {
for (int i=1; i < RowsNumber; i++) {
if (RowsDone < Lenght - 1) {
if (WhiteMode == 0) lcd.write((uint8_t)3);
if (WhiteMode == 1) lcd.write((uint8_t)0);
RowsDone++;
}
}
}
RowsNumber = RowsNumber - RowsDone;
unsigned int peace = RowsNumber * 5;
switch (peace) {
case 0:
if (RowsDone == 0) {
lcd.write((uint8_t)0); RowsDone++;
}
break;
case 1:
lcd.write((uint8_t)1); RowsDone++;
break;
case 2:
if (WhiteMode == 0) lcd.write((uint8_t)2);
if (WhiteMode == 1) lcd.write((uint8_t)4);
RowsDone++;
break;
case 3:
if (WhiteMode == 0) lcd.write((uint8_t)2);
if (WhiteMode == 1) lcd.write((uint8_t)4);
RowsDone++;
break;
case 4:
if (WhiteMode == 0) lcd.write((uint8_t)3);
if (WhiteMode == 1) lcd.write((uint8_t)5);
RowsDone++;
break;
case 5:
if (WhiteMode == 0) lcd.write((uint8_t)3);
if (WhiteMode == 1) lcd.write((uint8_t)5);
RowsDone++;
break;
}
for (int i =0; i < (Lenght - RowsDone); i++) lcd.write((uint8_t)0);
}
//ProgBar Style #4
if (StyleMode == 4) {
if (RowsNumber >= 1) {
for (int i=1; i < RowsNumber; i++) {
if (RowsDone < Lenght - 1) {
lcd.write((uint8_t)5); RowsDone++;
}
}
}
RowsNumber = RowsNumber - RowsDone;
unsigned int peace = RowsNumber * 5;
switch (peace) {
case 0:
if (RowsDone == 0) {
lcd.write((uint8_t)0); RowsDone++;
}
break;
case 1:
lcd.write((uint8_t)0); RowsDone++;
break;
case 2:
lcd.write((uint8_t)1); RowsDone++;
break;
case 3:
lcd.write((uint8_t)2); RowsDone++;
break;
case 4:
lcd.write((uint8_t)3); RowsDone++;
break;
case 5:
lcd.write((uint8_t)4); RowsDone++;
break;
}
for (int i =0; i < (Lenght - RowsDone); i++) lcd.write((uint8_t)5);
}
}
int writeBigChar(const char ch, const int x, const int y) {
const char *(*blocks)[2] = NULL;
if (ch < ' ' || ch > 'Z') return 0;
if (ch >= '!' && ch <= '-') return 0;
if (ch == '/') return 0;
if (ch >= ';' && ch <= '@') return 0;
int Index = (int) ch - (int) ' ';
if (ch > '!') Index -= 13;
if (ch > '/') Index -= 1;
if (ch > ';') Index -= 6;
blocks = &bigChars[Index];
for (int half = 0; half <=1; half++) {
int t = x;
for (const char *cp = (*blocks)[half]; *cp; cp++) {
if (t < 20) {
lcd.setCursor(t, y+half);
lcd.write(*cp);
t = (t+1) % 40;
}
}
//lcd.setCursor(t, y+half);
//lcd.write(' ');
}
return strlen((*blocks)[0]);
}
void writeBigString(int x, int y) {
CharacterInit(1);
for (int i=0; i < 20; i++) {
char c = StringBuffer[i];
//if ((int) c != 0) x += writeBigChar(c, x, y) + 1;
if ((int) c >= 20) x += writeBigChar(c, x, y);
if ((int) c < 20) i += 20;
}
}
void writeBigStringAnimated(int x, int y) {
CharacterInit(1);
for (int i=0; i < 20; i++) {
char c = StringBuffer[i];
//if ((int) c != 0) x += writeBigChar(c, x, y) + 1;
if ((int) c >= 20) x += writeBigChar(c, x, y);
if ((int) c < 20) i += 20;
delay(20);
}
}