Library for Adafruit Thermal Printer. Arduino library is published here: http://www.ladyada.net/products/thermalprinter/
Dependents: Thermal_HelloWorld
Fork of AdafruitThermalPrinter by
AdafruitThermal.cpp@3:1f832bfe41d1, 2016-03-16 (annotated)
- Committer:
- aross34
- Date:
- Wed Mar 16 19:55:29 2016 +0000
- Revision:
- 3:1f832bfe41d1
- Parent:
- 2:de26317d87a6
Trouble with Inverse On even following user manual strictly
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ashleymills | 0:c4a48036e46f | 1 | /*************************************************** |
ashleymills | 0:c4a48036e46f | 2 | This is a library for the Adafruit Thermal Printer |
ashleymills | 0:c4a48036e46f | 3 | |
ashleymills | 0:c4a48036e46f | 4 | Pick one up at --> http://www.adafruit.com/products/597 |
ashleymills | 0:c4a48036e46f | 5 | These printers use TTL serial to communicate, 2 pins are required |
ashleymills | 0:c4a48036e46f | 6 | |
ashleymills | 0:c4a48036e46f | 7 | Adafruit invests time and resources providing this open source code, |
ashleymills | 0:c4a48036e46f | 8 | please support Adafruit and open-source hardware by purchasing |
ashleymills | 0:c4a48036e46f | 9 | products from Adafruit! |
ashleymills | 0:c4a48036e46f | 10 | |
ashleymills | 0:c4a48036e46f | 11 | Written by Limor Fried/Ladyada for Adafruit Industries. |
ashleymills | 0:c4a48036e46f | 12 | MIT license, all text above must be included in any redistribution |
ashleymills | 0:c4a48036e46f | 13 | ****************************************************/ |
ashleymills | 0:c4a48036e46f | 14 | |
aross34 | 2:de26317d87a6 | 15 | // Ported to mbed by Ashley Mills |
aross34 | 2:de26317d87a6 | 16 | /** Documentation by Andrew Ross - NOTE: printBitmap not ported, nothing tested **/ |
aross34 | 2:de26317d87a6 | 17 | |
ashleymills | 0:c4a48036e46f | 18 | #include "mbed.h" |
ashleymills | 0:c4a48036e46f | 19 | #include "AdafruitThermal.h" |
ashleymills | 0:c4a48036e46f | 20 | |
ashleymills | 0:c4a48036e46f | 21 | |
ashleymills | 0:c4a48036e46f | 22 | AdafruitThermal::AdafruitThermal(PinName RX_Pin, PinName TX_Pin) { |
ashleymills | 0:c4a48036e46f | 23 | _RX_Pin = RX_Pin; |
ashleymills | 0:c4a48036e46f | 24 | _TX_Pin = TX_Pin; |
ashleymills | 0:c4a48036e46f | 25 | } |
ashleymills | 0:c4a48036e46f | 26 | |
ashleymills | 0:c4a48036e46f | 27 | void AdafruitThermal::begin(int heatTime) { |
ashleymills | 0:c4a48036e46f | 28 | _printer = new Serial(_RX_Pin, _TX_Pin); |
aross34 | 2:de26317d87a6 | 29 | _printer->baud(9600); |
ashleymills | 0:c4a48036e46f | 30 | |
ashleymills | 0:c4a48036e46f | 31 | // The printer can't start receiving data immediately |
ashleymills | 0:c4a48036e46f | 32 | // upon power up -- needs a moment to initialize. If |
ashleymills | 0:c4a48036e46f | 33 | // Arduino & printer are powered from the same supply, |
ashleymills | 0:c4a48036e46f | 34 | // they're starting simultaneously. Need to pause for |
ashleymills | 0:c4a48036e46f | 35 | // a moment so the printer is ready for commands. |
ashleymills | 0:c4a48036e46f | 36 | // (A more robust approach might be to wait in a loop |
ashleymills | 0:c4a48036e46f | 37 | // issuing status commands until valid response.) |
ashleymills | 0:c4a48036e46f | 38 | wait(0.5); |
ashleymills | 0:c4a48036e46f | 39 | |
ashleymills | 0:c4a48036e46f | 40 | reset(); |
ashleymills | 0:c4a48036e46f | 41 | |
ashleymills | 0:c4a48036e46f | 42 | // Description of print settings from page 23 of the manual: |
ashleymills | 0:c4a48036e46f | 43 | // ESC 7 n1 n2 n3 Setting Control Parameter Command |
ashleymills | 0:c4a48036e46f | 44 | // Decimal: 27 55 n1 n2 n3 |
ashleymills | 0:c4a48036e46f | 45 | // Set "max heating dots", "heating time", "heating interval" |
ashleymills | 0:c4a48036e46f | 46 | // n1 = 0-255 Max printing dots, Unit (8dots), Default: 7 (64 dots) |
ashleymills | 0:c4a48036e46f | 47 | // n2 = 3-255 Heating time, Unit (10us), Default: 80 (800us) |
ashleymills | 0:c4a48036e46f | 48 | // n3 = 0-255 Heating interval, Unit (10us), Default: 2 (20us) |
ashleymills | 0:c4a48036e46f | 49 | // The more max heating dots, the more peak current will cost |
ashleymills | 0:c4a48036e46f | 50 | // when printing, the faster printing speed. The max heating |
ashleymills | 0:c4a48036e46f | 51 | // dots is 8*(n1+1). The more heating time, the more density, |
ashleymills | 0:c4a48036e46f | 52 | // but the slower printing speed. If heating time is too short, |
ashleymills | 0:c4a48036e46f | 53 | // blank page may occur. The more heating interval, the more |
ashleymills | 0:c4a48036e46f | 54 | // clear, but the slower printing speed. |
ashleymills | 0:c4a48036e46f | 55 | |
ashleymills | 0:c4a48036e46f | 56 | writeBytes(27, 55); // Esc 7 (print settings) |
ashleymills | 0:c4a48036e46f | 57 | writeBytes(20); // Heating dots (20=balance of darkness vs no jams) |
ashleymills | 0:c4a48036e46f | 58 | writeBytes(heatTime); // Library default = 255 (max) |
ashleymills | 0:c4a48036e46f | 59 | writeBytes(250); // Heat interval (500 uS = slower, but darker) |
ashleymills | 0:c4a48036e46f | 60 | |
ashleymills | 0:c4a48036e46f | 61 | // Description of print density from page 23 of the manual: |
ashleymills | 0:c4a48036e46f | 62 | // DC2 # n Set printing density |
ashleymills | 0:c4a48036e46f | 63 | // Decimal: 18 35 n |
ashleymills | 0:c4a48036e46f | 64 | // D4..D0 of n is used to set the printing density. Density is |
ashleymills | 0:c4a48036e46f | 65 | // 50% + 5% * n(D4-D0) printing density. |
ashleymills | 0:c4a48036e46f | 66 | // D7..D5 of n is used to set the printing break time. Break time |
ashleymills | 0:c4a48036e46f | 67 | // is n(D7-D5)*250us. |
ashleymills | 0:c4a48036e46f | 68 | // (Unsure of the default value for either -- not documented) |
ashleymills | 0:c4a48036e46f | 69 | |
ashleymills | 0:c4a48036e46f | 70 | const int |
ashleymills | 0:c4a48036e46f | 71 | printDensity = 14, // 120% (? can go higher, text is darker but fuzzy) |
ashleymills | 0:c4a48036e46f | 72 | printBreakTime = 4; // 500 uS |
ashleymills | 0:c4a48036e46f | 73 | writeBytes(18, 35); // DC2 # (print density) |
ashleymills | 0:c4a48036e46f | 74 | writeBytes((printBreakTime << 5) | printDensity); |
ashleymills | 0:c4a48036e46f | 75 | } |
ashleymills | 0:c4a48036e46f | 76 | |
ashleymills | 0:c4a48036e46f | 77 | // reset printer |
ashleymills | 0:c4a48036e46f | 78 | void AdafruitThermal::reset() { |
ashleymills | 0:c4a48036e46f | 79 | writeBytes(27, 64); |
ashleymills | 0:c4a48036e46f | 80 | } |
ashleymills | 0:c4a48036e46f | 81 | |
ashleymills | 0:c4a48036e46f | 82 | // reset formatting |
ashleymills | 0:c4a48036e46f | 83 | void AdafruitThermal::setDefault(){ |
ashleymills | 0:c4a48036e46f | 84 | online(); |
ashleymills | 0:c4a48036e46f | 85 | justify('L'); |
ashleymills | 0:c4a48036e46f | 86 | inverseOff(); |
ashleymills | 0:c4a48036e46f | 87 | doubleHeightOff(); |
ashleymills | 0:c4a48036e46f | 88 | setLineHeight(32); |
ashleymills | 0:c4a48036e46f | 89 | boldOff(); |
ashleymills | 0:c4a48036e46f | 90 | underlineOff(); |
ashleymills | 0:c4a48036e46f | 91 | setBarcodeHeight(50); |
ashleymills | 0:c4a48036e46f | 92 | setSize('s'); |
ashleymills | 0:c4a48036e46f | 93 | } |
ashleymills | 0:c4a48036e46f | 94 | |
ashleymills | 0:c4a48036e46f | 95 | void AdafruitThermal::test(){ |
ashleymills | 0:c4a48036e46f | 96 | write('h'); |
ashleymills | 0:c4a48036e46f | 97 | write('e'); |
ashleymills | 0:c4a48036e46f | 98 | write('l'); |
ashleymills | 0:c4a48036e46f | 99 | write('l'); |
ashleymills | 0:c4a48036e46f | 100 | write('o'); |
ashleymills | 0:c4a48036e46f | 101 | write('!'); |
ashleymills | 0:c4a48036e46f | 102 | write('\n'); |
ashleymills | 0:c4a48036e46f | 103 | feed(2); |
ashleymills | 0:c4a48036e46f | 104 | } |
ashleymills | 0:c4a48036e46f | 105 | |
ashleymills | 0:c4a48036e46f | 106 | void AdafruitThermal::print(char *string) { |
ashleymills | 0:c4a48036e46f | 107 | while(*string!=0) { |
ashleymills | 0:c4a48036e46f | 108 | write(*string); |
ashleymills | 0:c4a48036e46f | 109 | string++; |
ashleymills | 0:c4a48036e46f | 110 | } |
aross34 | 2:de26317d87a6 | 111 | feed(2); |
ashleymills | 0:c4a48036e46f | 112 | } |
ashleymills | 0:c4a48036e46f | 113 | |
ashleymills | 0:c4a48036e46f | 114 | void AdafruitThermal::testPage() { |
ashleymills | 0:c4a48036e46f | 115 | writeBytes(18, 84); |
ashleymills | 0:c4a48036e46f | 116 | } |
ashleymills | 0:c4a48036e46f | 117 | |
ashleymills | 0:c4a48036e46f | 118 | // this is the basic function for all printing, the rest is taken care of by the |
ashleymills | 0:c4a48036e46f | 119 | // inherited Print class! |
ashleymills | 0:c4a48036e46f | 120 | size_t AdafruitThermal::write(uint8_t c) { |
ashleymills | 0:c4a48036e46f | 121 | if (c == 0x13) return 0; |
ashleymills | 0:c4a48036e46f | 122 | |
ashleymills | 0:c4a48036e46f | 123 | if (c != 0xA) |
ashleymills | 0:c4a48036e46f | 124 | linefeedneeded = true; |
ashleymills | 0:c4a48036e46f | 125 | else |
ashleymills | 0:c4a48036e46f | 126 | linefeedneeded = false; |
ashleymills | 0:c4a48036e46f | 127 | |
ashleymills | 0:c4a48036e46f | 128 | //DBG(" 0x"); |
ashleymills | 0:c4a48036e46f | 129 | //DBG(c, HEX); |
ashleymills | 0:c4a48036e46f | 130 | //DBG(" ("); |
ashleymills | 0:c4a48036e46f | 131 | |
ashleymills | 0:c4a48036e46f | 132 | PRINTER_PRINT(c); |
ashleymills | 0:c4a48036e46f | 133 | |
ashleymills | 0:c4a48036e46f | 134 | return 1; |
ashleymills | 0:c4a48036e46f | 135 | |
ashleymills | 0:c4a48036e46f | 136 | } |
ashleymills | 0:c4a48036e46f | 137 | |
ashleymills | 0:c4a48036e46f | 138 | void AdafruitThermal::setBarcodeHeight(int val){ |
ashleymills | 0:c4a48036e46f | 139 | //default is 50 |
ashleymills | 0:c4a48036e46f | 140 | writeBytes(29, 104, val); |
ashleymills | 0:c4a48036e46f | 141 | } |
ashleymills | 0:c4a48036e46f | 142 | |
ashleymills | 0:c4a48036e46f | 143 | void AdafruitThermal::printBarcode(char * text, uint8_t type) { |
ashleymills | 0:c4a48036e46f | 144 | int i; |
ashleymills | 0:c4a48036e46f | 145 | uint8_t c; |
ashleymills | 0:c4a48036e46f | 146 | |
ashleymills | 0:c4a48036e46f | 147 | delay(1000); // Need these delays else barcode doesn't always print. ??? |
ashleymills | 0:c4a48036e46f | 148 | writeBytes(29, 107, type); // set the type first |
ashleymills | 0:c4a48036e46f | 149 | delay(500); |
ashleymills | 0:c4a48036e46f | 150 | // Copy string, not including NUL terminator |
ashleymills | 0:c4a48036e46f | 151 | for(i=0; (c = text[i]); i++) PRINTER_PRINT(c); |
ashleymills | 0:c4a48036e46f | 152 | delay(500); |
ashleymills | 0:c4a48036e46f | 153 | PRINTER_PRINT(c); // Terminator must follow delay. ??? |
ashleymills | 0:c4a48036e46f | 154 | |
ashleymills | 0:c4a48036e46f | 155 | delay(3000); // For some reason we can't immediately have line feeds here |
ashleymills | 0:c4a48036e46f | 156 | feed(2); |
ashleymills | 0:c4a48036e46f | 157 | } |
ashleymills | 0:c4a48036e46f | 158 | |
ashleymills | 0:c4a48036e46f | 159 | void AdafruitThermal::writeBytes(uint8_t a) { |
ashleymills | 0:c4a48036e46f | 160 | PRINTER_PRINT(a); |
ashleymills | 0:c4a48036e46f | 161 | } |
ashleymills | 0:c4a48036e46f | 162 | |
ashleymills | 0:c4a48036e46f | 163 | void AdafruitThermal::writeBytes(uint8_t a, uint8_t b) { |
ashleymills | 0:c4a48036e46f | 164 | PRINTER_PRINT(a); |
ashleymills | 0:c4a48036e46f | 165 | PRINTER_PRINT(b); |
ashleymills | 0:c4a48036e46f | 166 | } |
ashleymills | 0:c4a48036e46f | 167 | |
ashleymills | 0:c4a48036e46f | 168 | void AdafruitThermal::writeBytes(uint8_t a, uint8_t b, uint8_t c) { |
ashleymills | 0:c4a48036e46f | 169 | PRINTER_PRINT(a); |
ashleymills | 0:c4a48036e46f | 170 | PRINTER_PRINT(b); |
ashleymills | 0:c4a48036e46f | 171 | PRINTER_PRINT(c); |
ashleymills | 0:c4a48036e46f | 172 | } |
ashleymills | 0:c4a48036e46f | 173 | |
ashleymills | 0:c4a48036e46f | 174 | void AdafruitThermal::writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d) { |
ashleymills | 0:c4a48036e46f | 175 | PRINTER_PRINT(a); |
ashleymills | 0:c4a48036e46f | 176 | PRINTER_PRINT(b); |
ashleymills | 0:c4a48036e46f | 177 | PRINTER_PRINT(c); |
ashleymills | 0:c4a48036e46f | 178 | PRINTER_PRINT(d); |
ashleymills | 0:c4a48036e46f | 179 | } |
ashleymills | 0:c4a48036e46f | 180 | |
ashleymills | 0:c4a48036e46f | 181 | // === Character commands === |
ashleymills | 0:c4a48036e46f | 182 | |
ashleymills | 0:c4a48036e46f | 183 | #define INVERSE_MASK (1 << 1) |
ashleymills | 0:c4a48036e46f | 184 | #define UPDOWN_MASK (1 << 2) |
ashleymills | 0:c4a48036e46f | 185 | #define BOLD_MASK (1 << 3) |
ashleymills | 0:c4a48036e46f | 186 | #define DOUBLE_HEIGHT_MASK (1 << 4) |
ashleymills | 0:c4a48036e46f | 187 | #define DOUBLE_WIDTH_MASK (1 << 5) |
ashleymills | 0:c4a48036e46f | 188 | #define STRIKE_MASK (1 << 6) |
ashleymills | 0:c4a48036e46f | 189 | |
ashleymills | 0:c4a48036e46f | 190 | void AdafruitThermal::setPrintMode(uint8_t mask) { |
ashleymills | 0:c4a48036e46f | 191 | printMode |= mask; |
ashleymills | 0:c4a48036e46f | 192 | writePrintMode(); |
ashleymills | 0:c4a48036e46f | 193 | } |
ashleymills | 0:c4a48036e46f | 194 | void AdafruitThermal::unsetPrintMode(uint8_t mask) { |
ashleymills | 0:c4a48036e46f | 195 | printMode &= ~mask; |
ashleymills | 0:c4a48036e46f | 196 | writePrintMode(); |
ashleymills | 0:c4a48036e46f | 197 | } |
ashleymills | 0:c4a48036e46f | 198 | |
ashleymills | 0:c4a48036e46f | 199 | void AdafruitThermal::writePrintMode() { |
ashleymills | 0:c4a48036e46f | 200 | writeBytes(27, 33, printMode); |
ashleymills | 0:c4a48036e46f | 201 | } |
ashleymills | 0:c4a48036e46f | 202 | |
ashleymills | 0:c4a48036e46f | 203 | void AdafruitThermal::normal() { |
ashleymills | 0:c4a48036e46f | 204 | printMode = 0; |
ashleymills | 0:c4a48036e46f | 205 | writePrintMode(); |
ashleymills | 0:c4a48036e46f | 206 | } |
ashleymills | 0:c4a48036e46f | 207 | |
ashleymills | 0:c4a48036e46f | 208 | void AdafruitThermal::inverseOn(){ |
aross34 | 3:1f832bfe41d1 | 209 | setPrintMode(INVERSE_MASK); |
aross34 | 3:1f832bfe41d1 | 210 | //writeBytes(29, 66, 1); |
ashleymills | 0:c4a48036e46f | 211 | } |
ashleymills | 0:c4a48036e46f | 212 | |
ashleymills | 0:c4a48036e46f | 213 | void AdafruitThermal::inverseOff(){ |
aross34 | 3:1f832bfe41d1 | 214 | unsetPrintMode(INVERSE_MASK); |
aross34 | 3:1f832bfe41d1 | 215 | //writeBytes(29, 'B', 0, 10); |
aross34 | 3:1f832bfe41d1 | 216 | //writeBytes(29, 66, 0); |
ashleymills | 0:c4a48036e46f | 217 | } |
ashleymills | 0:c4a48036e46f | 218 | |
ashleymills | 0:c4a48036e46f | 219 | void AdafruitThermal::upsideDownOn(){ |
ashleymills | 0:c4a48036e46f | 220 | setPrintMode(UPDOWN_MASK); |
ashleymills | 0:c4a48036e46f | 221 | } |
ashleymills | 0:c4a48036e46f | 222 | |
ashleymills | 0:c4a48036e46f | 223 | void AdafruitThermal::upsideDownOff(){ |
ashleymills | 0:c4a48036e46f | 224 | unsetPrintMode(UPDOWN_MASK); |
ashleymills | 0:c4a48036e46f | 225 | } |
ashleymills | 0:c4a48036e46f | 226 | |
ashleymills | 0:c4a48036e46f | 227 | void AdafruitThermal::doubleHeightOn(){ |
ashleymills | 0:c4a48036e46f | 228 | setPrintMode(DOUBLE_HEIGHT_MASK); |
ashleymills | 0:c4a48036e46f | 229 | } |
ashleymills | 0:c4a48036e46f | 230 | |
ashleymills | 0:c4a48036e46f | 231 | void AdafruitThermal::doubleHeightOff(){ |
ashleymills | 0:c4a48036e46f | 232 | unsetPrintMode(DOUBLE_HEIGHT_MASK); |
ashleymills | 0:c4a48036e46f | 233 | } |
ashleymills | 0:c4a48036e46f | 234 | |
ashleymills | 0:c4a48036e46f | 235 | void AdafruitThermal::doubleWidthOn(){ |
ashleymills | 0:c4a48036e46f | 236 | setPrintMode(DOUBLE_WIDTH_MASK); |
ashleymills | 0:c4a48036e46f | 237 | } |
ashleymills | 0:c4a48036e46f | 238 | |
ashleymills | 0:c4a48036e46f | 239 | void AdafruitThermal::doubleWidthOff(){ |
ashleymills | 0:c4a48036e46f | 240 | unsetPrintMode(DOUBLE_WIDTH_MASK); |
ashleymills | 0:c4a48036e46f | 241 | } |
ashleymills | 0:c4a48036e46f | 242 | |
ashleymills | 0:c4a48036e46f | 243 | void AdafruitThermal::strikeOn(){ |
ashleymills | 0:c4a48036e46f | 244 | setPrintMode(STRIKE_MASK); |
ashleymills | 0:c4a48036e46f | 245 | } |
ashleymills | 0:c4a48036e46f | 246 | |
ashleymills | 0:c4a48036e46f | 247 | void AdafruitThermal::strikeOff(){ |
ashleymills | 0:c4a48036e46f | 248 | unsetPrintMode(STRIKE_MASK); |
ashleymills | 0:c4a48036e46f | 249 | } |
ashleymills | 0:c4a48036e46f | 250 | |
ashleymills | 0:c4a48036e46f | 251 | void AdafruitThermal::boldOn(){ |
ashleymills | 0:c4a48036e46f | 252 | setPrintMode(BOLD_MASK); |
ashleymills | 0:c4a48036e46f | 253 | } |
ashleymills | 0:c4a48036e46f | 254 | |
ashleymills | 0:c4a48036e46f | 255 | void AdafruitThermal::boldOff(){ |
aross34 | 2:de26317d87a6 | 256 | //unsetPrintMode(BOLD_MASK); |
aross34 | 2:de26317d87a6 | 257 | //writeBytes(27, 69, 0); |
aross34 | 2:de26317d87a6 | 258 | // if (linefeedneeded) |
aross34 | 2:de26317d87a6 | 259 | // feed(); |
aross34 | 2:de26317d87a6 | 260 | |
aross34 | 2:de26317d87a6 | 261 | //linefeedneeded = false; |
ashleymills | 0:c4a48036e46f | 262 | } |
ashleymills | 0:c4a48036e46f | 263 | |
ashleymills | 0:c4a48036e46f | 264 | void AdafruitThermal::justify(char value){ |
ashleymills | 0:c4a48036e46f | 265 | uint8_t pos = 0; |
ashleymills | 0:c4a48036e46f | 266 | |
ashleymills | 0:c4a48036e46f | 267 | if(value == 'l' || value == 'L') pos = 0; |
ashleymills | 0:c4a48036e46f | 268 | if(value == 'c' || value == 'C') pos = 1; |
ashleymills | 0:c4a48036e46f | 269 | if(value == 'r' || value == 'R') pos = 2; |
ashleymills | 0:c4a48036e46f | 270 | |
ashleymills | 0:c4a48036e46f | 271 | writeBytes(0x1B, 0x61, pos); |
ashleymills | 0:c4a48036e46f | 272 | } |
ashleymills | 0:c4a48036e46f | 273 | |
ashleymills | 0:c4a48036e46f | 274 | // Feeds by the specified number of lines |
ashleymills | 0:c4a48036e46f | 275 | void AdafruitThermal::feed(uint8_t x){ |
ashleymills | 0:c4a48036e46f | 276 | // The datasheet claims sending bytes 27, 100, <x> will work |
ashleymills | 0:c4a48036e46f | 277 | // but it feeds much much more. |
ashleymills | 0:c4a48036e46f | 278 | while (x--) |
ashleymills | 0:c4a48036e46f | 279 | write('\n'); |
ashleymills | 0:c4a48036e46f | 280 | } |
ashleymills | 0:c4a48036e46f | 281 | |
ashleymills | 0:c4a48036e46f | 282 | // Feeds by the specified number of rows of pixels |
ashleymills | 0:c4a48036e46f | 283 | void AdafruitThermal::feedRows(uint8_t rows) { |
ashleymills | 0:c4a48036e46f | 284 | writeBytes(27, 74, rows); |
ashleymills | 0:c4a48036e46f | 285 | } |
ashleymills | 0:c4a48036e46f | 286 | |
ashleymills | 0:c4a48036e46f | 287 | void AdafruitThermal::flush() { |
ashleymills | 0:c4a48036e46f | 288 | writeBytes(12); |
ashleymills | 0:c4a48036e46f | 289 | } |
ashleymills | 0:c4a48036e46f | 290 | |
ashleymills | 0:c4a48036e46f | 291 | void AdafruitThermal::setSize(char value){ |
ashleymills | 0:c4a48036e46f | 292 | int size = 0; |
ashleymills | 0:c4a48036e46f | 293 | |
ashleymills | 0:c4a48036e46f | 294 | if(value == 's' || value == 'S') size = 0; |
ashleymills | 0:c4a48036e46f | 295 | if(value == 'm' || value == 'M') size = 10; |
ashleymills | 0:c4a48036e46f | 296 | if(value == 'l' || value == 'L') size = 25; |
ashleymills | 0:c4a48036e46f | 297 | |
ashleymills | 0:c4a48036e46f | 298 | writeBytes(29, 33, size, 10); |
ashleymills | 0:c4a48036e46f | 299 | // if (linefeedneeded) |
ashleymills | 0:c4a48036e46f | 300 | // println("lfn"); //feed(); |
ashleymills | 0:c4a48036e46f | 301 | //linefeedneeded = false; |
ashleymills | 0:c4a48036e46f | 302 | } |
ashleymills | 0:c4a48036e46f | 303 | |
ashleymills | 0:c4a48036e46f | 304 | // Underlines of different weights can be produced: |
ashleymills | 0:c4a48036e46f | 305 | // 0 - no underline |
ashleymills | 0:c4a48036e46f | 306 | // 1 - normal underline |
ashleymills | 0:c4a48036e46f | 307 | // 2 - thick underline |
ashleymills | 0:c4a48036e46f | 308 | void AdafruitThermal::underlineOn(uint8_t weight) { |
ashleymills | 0:c4a48036e46f | 309 | writeBytes(27, 45, weight); |
ashleymills | 0:c4a48036e46f | 310 | } |
ashleymills | 0:c4a48036e46f | 311 | |
ashleymills | 0:c4a48036e46f | 312 | void AdafruitThermal::underlineOff() { |
ashleymills | 0:c4a48036e46f | 313 | underlineOn(0); |
aross34 | 2:de26317d87a6 | 314 | //writeBytes(27, 45, 0, 10); |
aross34 | 2:de26317d87a6 | 315 | //Writing text with underline will work but seems to be a problem printing after turning off underline |
ashleymills | 0:c4a48036e46f | 316 | } |
ashleymills | 0:c4a48036e46f | 317 | |
ashleymills | 0:c4a48036e46f | 318 | /* |
ashleymills | 0:c4a48036e46f | 319 | void AdafruitThermal::printBitmap(int w, int h, const uint8_t *bitmap) { |
ashleymills | 0:c4a48036e46f | 320 | if (w > 384) return; // maximum width of the printer |
ashleymills | 0:c4a48036e46f | 321 | for (int rowStart=0; rowStart < h; rowStart += 256) { |
ashleymills | 0:c4a48036e46f | 322 | int chunkHeight = ((h - rowStart) > 255) ? 255 : (h - rowStart); |
ashleymills | 0:c4a48036e46f | 323 | delay(500); // Need these delays else bitmap doesn't always print. ??? |
ashleymills | 0:c4a48036e46f | 324 | writeBytes(18, 42); |
ashleymills | 0:c4a48036e46f | 325 | writeBytes(chunkHeight, w/8); |
ashleymills | 0:c4a48036e46f | 326 | delay(500); |
ashleymills | 0:c4a48036e46f | 327 | for (int i=0; i<((w/8)*chunkHeight); i++) { |
ashleymills | 0:c4a48036e46f | 328 | PRINTER_PRINT(pgm_read_byte(bitmap + (rowStart*(w/8)) + i)); |
ashleymills | 0:c4a48036e46f | 329 | } |
ashleymills | 0:c4a48036e46f | 330 | delay(500); |
ashleymills | 0:c4a48036e46f | 331 | } |
ashleymills | 0:c4a48036e46f | 332 | } |
ashleymills | 0:c4a48036e46f | 333 | |
ashleymills | 0:c4a48036e46f | 334 | |
ashleymills | 0:c4a48036e46f | 335 | void AdafruitThermal::printBitmap(int w, int h, Stream *stream) { |
ashleymills | 0:c4a48036e46f | 336 | if (w > 384) return; // maximum width of the printer |
ashleymills | 0:c4a48036e46f | 337 | for (int rowStart=0; rowStart < h; rowStart += 256) { |
ashleymills | 0:c4a48036e46f | 338 | int chunkHeight = ((h - rowStart) > 255) ? 255 : (h - rowStart); |
ashleymills | 0:c4a48036e46f | 339 | delay(500); // Need these delays else bitmap doesn't always print. ??? |
ashleymills | 0:c4a48036e46f | 340 | writeBytes(18, 42); |
ashleymills | 0:c4a48036e46f | 341 | writeBytes(chunkHeight, w/8); |
ashleymills | 0:c4a48036e46f | 342 | delay(500); |
ashleymills | 0:c4a48036e46f | 343 | for (int i=0; i<((w/8)*chunkHeight); i++) { |
ashleymills | 0:c4a48036e46f | 344 | PRINTER_PRINT((uint8_t)stream->read()); |
ashleymills | 0:c4a48036e46f | 345 | } |
ashleymills | 0:c4a48036e46f | 346 | delay(500); |
ashleymills | 0:c4a48036e46f | 347 | } |
ashleymills | 0:c4a48036e46f | 348 | }; |
ashleymills | 0:c4a48036e46f | 349 | |
ashleymills | 0:c4a48036e46f | 350 | void AdafruitThermal::printBitmap(Stream *stream) { |
ashleymills | 0:c4a48036e46f | 351 | uint8_t tmp; |
ashleymills | 0:c4a48036e46f | 352 | uint16_t width, height; |
ashleymills | 0:c4a48036e46f | 353 | |
ashleymills | 0:c4a48036e46f | 354 | tmp = stream->read(); |
ashleymills | 0:c4a48036e46f | 355 | width = (stream->read() << 8) + tmp; |
ashleymills | 0:c4a48036e46f | 356 | |
ashleymills | 0:c4a48036e46f | 357 | tmp = stream->read(); |
ashleymills | 0:c4a48036e46f | 358 | height = (stream->read() << 8) + tmp; |
ashleymills | 0:c4a48036e46f | 359 | |
ashleymills | 0:c4a48036e46f | 360 | printBitmap(width, height, stream); |
ashleymills | 0:c4a48036e46f | 361 | }; |
ashleymills | 0:c4a48036e46f | 362 | */ |
ashleymills | 0:c4a48036e46f | 363 | |
ashleymills | 0:c4a48036e46f | 364 | // Take the printer offline. Print commands sent after this will be |
ashleymills | 0:c4a48036e46f | 365 | // ignored until `online` is called |
ashleymills | 0:c4a48036e46f | 366 | void AdafruitThermal::offline(){ |
ashleymills | 0:c4a48036e46f | 367 | writeBytes(27, 61, 0); |
ashleymills | 0:c4a48036e46f | 368 | } |
ashleymills | 0:c4a48036e46f | 369 | |
ashleymills | 0:c4a48036e46f | 370 | // Take the printer back online. Subsequent print commands will be |
ashleymills | 0:c4a48036e46f | 371 | // obeyed. |
ashleymills | 0:c4a48036e46f | 372 | void AdafruitThermal::online(){ |
ashleymills | 0:c4a48036e46f | 373 | writeBytes(27, 61, 1); |
ashleymills | 0:c4a48036e46f | 374 | } |
ashleymills | 0:c4a48036e46f | 375 | |
ashleymills | 0:c4a48036e46f | 376 | // Put the printer into a low-energy state immediately |
ashleymills | 0:c4a48036e46f | 377 | void AdafruitThermal::sleep() { |
ashleymills | 0:c4a48036e46f | 378 | sleepAfter(0); |
ashleymills | 0:c4a48036e46f | 379 | } |
ashleymills | 0:c4a48036e46f | 380 | |
ashleymills | 0:c4a48036e46f | 381 | // Put the printer into a low-energy state after the given number |
ashleymills | 0:c4a48036e46f | 382 | // of seconds |
ashleymills | 0:c4a48036e46f | 383 | void AdafruitThermal::sleepAfter(uint8_t seconds) { |
ashleymills | 0:c4a48036e46f | 384 | writeBytes(27, 56, seconds); |
ashleymills | 0:c4a48036e46f | 385 | } |
ashleymills | 0:c4a48036e46f | 386 | |
ashleymills | 0:c4a48036e46f | 387 | // Wake the printer from a low-energy state. This command will wait |
ashleymills | 0:c4a48036e46f | 388 | // for 50ms (as directed by the datasheet) before allowing further |
ashleymills | 0:c4a48036e46f | 389 | // commands to be send. |
ashleymills | 0:c4a48036e46f | 390 | void AdafruitThermal::wake() { |
ashleymills | 0:c4a48036e46f | 391 | writeBytes(255); |
ashleymills | 0:c4a48036e46f | 392 | delay(50); |
ashleymills | 0:c4a48036e46f | 393 | } |
ashleymills | 0:c4a48036e46f | 394 | |
ashleymills | 0:c4a48036e46f | 395 | ////////////////////// not working? |
ashleymills | 0:c4a48036e46f | 396 | void AdafruitThermal::tab(){ |
ashleymills | 0:c4a48036e46f | 397 | PRINTER_PRINT(9); |
ashleymills | 0:c4a48036e46f | 398 | } |
ashleymills | 0:c4a48036e46f | 399 | void AdafruitThermal::setCharSpacing(int spacing) { |
ashleymills | 0:c4a48036e46f | 400 | writeBytes(27, 32, 0, 10); |
ashleymills | 0:c4a48036e46f | 401 | } |
ashleymills | 0:c4a48036e46f | 402 | void AdafruitThermal::setLineHeight(int val){ |
ashleymills | 0:c4a48036e46f | 403 | writeBytes(27, 51, val); // default is 32 |
ashleymills | 0:c4a48036e46f | 404 | } |