/** * Minitel library for Arduino (v0.1) / May 2013 * http://github.com/01010101/Minitel * * By Jerome Saint-Clair aka 01010101 * http://saint-clair.net * * For the Graffiti Research Lab France * http://graffitiresearchlab.fr * * Based on works by the Tetalab (Fabrice, Renaud, PG & Phil) * http://tetalab.org */ #include "Arduino.h" #include "SoftwareSerial.h" #include "Minitel.h" byte _currentBgColor = BLACK; byte _currentTextColor = WHITE; byte _currentMode = TEXT_MODE; byte _currentVideo = VIDEO_STANDARD; byte _currentSize = SIZE_NORMAL; boolean _currentUnderline = false; boolean _currentBlink = false; boolean _currentShowCursor = false; Minitel::Minitel() : SoftwareSerial(6,7) { init(); } Minitel::Minitel(int rx, int tx) : SoftwareSerial(rx,tx) { init(); } void Minitel::init() { Serial.begin(1200); begin(1200); useDefaultColors(); refreshSettings(); } byte Minitel::getGraphicChar(String s) { byte carac= 32; // caractère pixel if (s.length() == 6) { carac += s[0] == '0' ? 0 : 1; carac += s[1] == '0' ? 0 : 2; carac += s[2] == '0' ? 0 : 4; carac += s[3] == '0' ? 0 : 8; carac += s[4] == '0' ? 0 : 16; carac += s[5] == '0' ? 0 : 32; return carac; } return 9; } void Minitel::serialprint7(byte b) { boolean i = false; for(int j = 0; j<8;j++) { if (bitRead(b,j)==1) { i =!i; //calcul de la parité } } if (i) { bitWrite(b,7,1); //ecriture de la partié } else { bitWrite(b,7,0); //ecriture de la partié } write(b); //ecriture du byte sur le software serial } void Minitel::graphic(String s, int x, int y){ moveCursorTo(x, y); graphic(s); } void Minitel::graphic(String s) { serialprint7(getGraphicChar(s)); } void Minitel::textByte(byte c) { serialprint7(c); } void Minitel::textByte(byte b, int x, int y) { moveCursorTo(x, y); textByte(b); } boolean Minitel::textChar(byte c) { byte charByte = getCharByte(c); if (isValidChar(charByte)) { serialprint7(charByte); return true; } return false; } boolean Minitel::textChar(byte c, int x, int y) { moveCursorTo(x, y); return textChar(c); } void Minitel::text(String s, int x, int y) { text(s, x, y, HORIZONTAL); } void Minitel::text(String s) { text(s, HORIZONTAL); } void Minitel::text(String s, int x, int y, int orientation) { moveCursorTo(x, y); text(s, orientation); } void Minitel::text(String s, int orientation) { for (int i=0; i 33 String chars1= "!\"#$%&'()*+,-./0123456789:;<=>?@"; // 33 -> 64 String chars2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 65 -> 90 String chars3 = "abcdefghijklmnopqrstuvwxyz"; // 97 -> 122 */ byte Minitel::getCharByte(char c) { String characters = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]x_xabcdefghijklmnopqrstuvwxyz"; return (byte) characters.lastIndexOf(c); } void Minitel::specialChar(byte c, int x, int y) { moveCursorTo(x, y); specialChar(c); } void Minitel::specialChar(byte c) { if (c == SPE_CHAR_BOOK || c == SPE_CHAR_PARAGRAPH || c == SPE_CHAR_ARROW_LEFT || c == SPE_CHAR_ARROW_UP || c == SPE_CHAR_ARROW_RIGHT || c == SPE_CHAR_ARROW_DOWN || c == SPE_CHAR_CIRCLE || c == SPE_CHAR_MINUS_PLUS || c == SPE_CHAR_1_4 || c == SPE_CHAR_1_2 || c == SPE_CHAR_3_4 || c == SPE_CHAR_UPPER_OE || c == SPE_CHAR_LOWER_OE || c == SPE_CHAR_BETA) { serialprint7(25); serialprint7(c); } } boolean Minitel::isValidChar(byte index) { if (index >= 32 && index < 123) { return true; } return false; } boolean Minitel::isAccent(char c) { String accents = "áàâäéèëêíìîïóòôöúùûü"; if (accents.indexOf(c) >=0) { return true; } return false; } boolean Minitel::printAccentChar(char c) { if (isAccent(c)) { String accents = "áàâäéèëêíìîïóòôöúùûü"; int index = (accents.indexOf(c)-1)/2; int accentTypeIndex = index%4; printAccent(accentTypeIndex); int letterIndex = floor(index/4); char letter = getAccentLetter(letterIndex); textChar(letter); return true; } return false; } void Minitel::printAccent(int index) { serialprint7(25); switch(index) { case(0) : serialprint7(GRAVE); break; case(1) : serialprint7(ACCUTE); break; case(2) : serialprint7(CIRCUMFLEX); break; default : serialprint7(UMLAUT); } } char Minitel::getAccentLetter(int letterIndex) { switch(letterIndex) { case(0) : return('a'); break; case(1) : return('e'); break; case(2) : return('i'); break; case(3) : return('o'); break; default : return('u'); } } void Minitel::repeat(byte n) { serialprint7(18); serialprint7(64+n); } void Minitel::bgColor(byte c) { if (c >= 0 && c <=7) { serialprint7(27); serialprint7(c+80); _currentBgColor = c; } } void Minitel::textColor(byte c) { if (c >= 0 && c <=7) { serialprint7(27); serialprint7(c+64); _currentTextColor = c; } } void Minitel::useDefaultColors() { bgColor(BLACK); textColor(WHITE); } void Minitel::moveCursorTo(byte x, byte y) { serialprint7(31); // Code positionnement de curseur serialprint7(64+y); // coordonnées x (x+64) (x de 1 à 40) serialprint7(64+x); // coordonnées y (y+64) (y de 1 à 24) refreshSettings(); } void Minitel::moveCursor(byte dir) { if (dir == LEFT || dir == RIGHT || dir == UP || dir == DOWN) { serialprint7(dir); } } void Minitel::moveCursorTo(byte location) { if (location == HOME || location == LINE_END || location == TOP_LEFT) { serialprint7(location); } else if (location == CENTER || location == TOP_RIGHT || location == BOTTOM_RIGHT || location == BOTTOM_LEFT) { if (location == CENTER) { moveCursorTo(20, 12); } else if (location == TOP_RIGHT) { moveCursorTo(40, 1); } else if (location == BOTTOM_RIGHT) { moveCursorTo(40, 24); } else if (location == BOTTOM_LEFT) { moveCursorTo(1, 24); } refreshSettings() ; } } void Minitel::moveCursor(byte dir, int n) { if (dir == LEFT || dir == RIGHT || dir == UP || dir == DOWN) { for (int i=0; i c = '>'; } else if (b == 192) { // @ c = '@'; } else if (b == 43) { // + c = '+'; } else if (b == 189) { // = c = '='; } else if (b == 170) { // * c = '*'; } else if (b == 175) { // / c = '/'; } else if (b == 123) { // / c = '|'; } } return c; } boolean Minitel::isMenuKey() { return _menuKeyPressed; } void Minitel::rect(char c, int x, int y, int w, int h) { byte b = getCharByte(c); rect(b, x, y, w, h); } void Minitel::rect(byte c, int x, int y, int w, int h) { moveCursorTo(x, y); textByte(c); repeat(w); moveCursorTo(x, y+1); for (int i=0; i