Driver for thermal printer using serial communication like http://www.sparkfun.com/products/10438. This is port from arduino library available at http://bildr.org/2011/08/thermal-printer-arduino/
Dependents: ThermalSample mbedica_on_yehowshua mbedica
Revision 0:fd2be7a1b59f, committed 2012-07-18
- Comitter:
- mimil
- Date:
- Wed Jul 18 12:58:53 2012 +0000
- Commit message:
- update of headers
Changed in this revision
Thermal.cpp | Show annotated file Show diff for this revision Revisions of this file |
Thermal.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r fd2be7a1b59f Thermal.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Thermal.cpp Wed Jul 18 12:58:53 2012 +0000 @@ -0,0 +1,351 @@ +/* + Copyright (c) 2010 bildr community + Ported to mbed by mimilowns + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include "mbed.h" +#include "Thermal.h" + + +Thermal::Thermal(PinName tx, PinName rx, int baud) : Serial(tx, rx) { + Serial::baud(baud); + //setTimeout(50); + + + int zero = 0; + + + + heatTime = 80; // 80 is default from page 23 of datasheet. Controls speed of printing and darkness + heatInterval = 2; // 2 is default from page 23 of datasheet. Controls speed of printing and darkness + printDensity = 15; // Not sure what the defaut is. Testing shows the max helps darken text. From page 23. + printBreakTime = 15; // Not sure what the defaut is. Testing shows the max helps darken text. From page 23. + + + setHeatTime(heatTime); + setPrintDensity(printDensity); + + + setDefault(); +} + +void Thermal::setDefault() + +{ + wake(); + justify('L'); + inverseOff(); + doubleHeightOff(); + setLineHeight(32); + boldOff(); + underlineOff(); + setBarcodeHeight(50); + setSize('s'); +} + +void Thermal::test() + +{ + Serial::printf("Hello World!"); + feed(2); +} + + + +void Thermal::setBarcodeHeight(int val) + +{ + // default is 50 + writeBytes(29, 104, val); +} + +void Thermal::printBarcode(char * text){ +writeBytes(29, 107, 0); // GS, K, m! + + for(int i = 0; i < strlen(text); i ++){ + write(text[i]); //Data + } + + write(zero); //Terminator + + delay(3000); //For some reason we can't immediately have line feeds here + feed(2); +} + +void Thermal::printFancyBarcode(char * text){ + writeBytes(29, 107, 4); // GS, K, Fancy! + + for(int i = 0; i < strlen(text); i ++){ + write(text[i]); //Data + } + + write(zero); //Terminator + + delay(3000); //For some reason we can't immediately have line feeds here + feed(2); +} + +void Thermal::writeBytes(uint8_t a, uint8_t b) + +{ + write(a); + write(b); +} + +void Thermal::writeBytes(uint8_t a, uint8_t b, uint8_t c) + +{ + write(a); + write(b); + write(c); +} + +void Thermal::writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d) + +{ + write(a); + write(b); + write(c); + write(d); +} + +void Thermal::write(uint8_t a) +{ + putc(a); +} + +void Thermal::delay(uint8_t a) +{ + wait(a); +} + +void Thermal::inverseOn() + +{ + writeBytes(29, 'B', 1); +} + +void Thermal::inverseOff() + +{ + writeBytes(29, 'B', 0, 10); +} + +void Thermal::doubleHeightOn() + +{ + writeBytes(27, 14); +} + +void Thermal::doubleHeightOff() + +{ + writeBytes(27, 20); +} + +void Thermal::boldOn() + +{ + writeBytes(27, 69, 1); +} + +void Thermal::boldOff() + +{ + writeBytes(27, 69, 0); + if (linefeedneeded) + feed(); + + linefeedneeded = false; +} + +void Thermal::justify(char value) + +{ + uint8_t pos = 0; + + + if(value == 'l' || value == 'L') pos = 0; + if(value == 'c' || value == 'C') pos = 1; + if(value == 'r' || value == 'R') pos = 2; + + writeBytes(0x1B, 0x61, pos); +} + +void Thermal::feed(uint8_t x) + +{ + while (x--) + write(10); +} + +void Thermal::setSize(char value) + +{ + int size = 0; + + + if(value == 's' || value == 'S') size = 0; + if(value == 'm' || value == 'M') size = 10; + if(value == 'l' || value == 'L') size = 25; + + writeBytes(29, 33, size, 10); + // if (linefeedneeded) + // println("lfn"); //feed(); + //linefeedneeded = false; +} + +void Thermal::underlineOff() + +{ + writeBytes(27, 45, 0, 10); +} + + +void Thermal::underlineOn() + +{ + writeBytes(27, 45, 1); +} + +void Thermal::printBitmap(uint8_t w, uint8_t h, const uint8_t *bitmap) + +{ + writeBytes(18, 42, h, w/8); + for (uint16_t i=0; i<(w/8) * h; i++) { + //write(pgm_read_byte(bitmap + i)); + write(*(bitmap + i)); + } +} + +void Thermal::wake() + +{ + writeBytes(27, 61, 1); +} + +void Thermal::sleep() + +{ + writeBytes(27, 61, 0); +} + +////////////////////// not working? +void Thermal::tab() + +{ + write(9); +} + + +void Thermal::setCharSpacing(int spacing) + +{ + writeBytes(27, 32, 0, 10); +} + + +void Thermal::setLineHeight(int val) + +{ + writeBytes(27, 51, val); // default is 32 +} + + + +void Thermal::setHeatTime(int vHeatTime) + +{ + + heatTime = vHeatTime; + + write(27); + + write(55); + + write(7); //Default 64 dots = 8*('7'+1) + + write(heatTime); //Default 80 or 800us + + write(heatInterval); //Default 2 or 20us + +} + + + +void Thermal::setHeatInterval(int vHeatInterval) + +{ + + heatInterval = vHeatInterval; + + write(27); + + write(55); + + write(7); //Default 64 dots = 8*('7'+1) + + write(heatTime); //Default 80 or 800us + + write(heatInterval); //Default 2 or 20us + +} + + + +void Thermal::setPrintDensity(char vPrintDensity) + +{ + + //Modify the print density and timeout + + printDensity = vPrintDensity; + + write(18); + + write(35); + + int printSetting = (printDensity<<4) | printBreakTime; + + write(printSetting); //Combination of printDensity and printBreakTime + +} + + + +void Thermal::setPrintBreakTime(char vPrintBreakTime) + +{ + + //Modify the print density and timeout + + printBreakTime = vPrintBreakTime; + + write(18); + + write(35); + + int printSetting = (printDensity<<4) | printBreakTime; + + write(printSetting); //Combination of printDensity and printBreakTime + +} +
diff -r 000000000000 -r fd2be7a1b59f Thermal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Thermal.h Wed Jul 18 12:58:53 2012 +0000 @@ -0,0 +1,111 @@ +/* + Copyright (c) 2010 bildr community + Ported to mbed by mimilowns + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef Thermal_h +#define Thermal_h + +#include "mbed.h" + + + +class Thermal : public Serial + +{ + + public: + Thermal(PinName tx, PinName rx, int baud = 9600); + + void setDefault(); + void test(); + + + + void inverseOn(); + void inverseOff(); + void doubleHeightOn(); + void doubleHeightOff(); + void boldOn(); + void boldOff(); + void underlineOn(); + void underlineOff(); + + + + void justify(char value); + void feed(uint8_t x = 1); + void sleep(); + void wake(); + + + + void setCharSpacing(int spacing); + void setSize(char value); + void setLineHeight(int val = 32); + + + + void printBarcode(char * text); + void printFancyBarcode(char * text); + void setBarcodeHeight(int val); + + + + void printBitmap(uint8_t w, uint8_t h, const uint8_t *bitmap); + + // ?? + void tab(); + + + + void setHeatTime(int vHeatTime); + + void setHeatInterval(int vHeatInterval); + + void setPrintDensity(char vPrintDensity); + + void setPrintBreakTime(char vPrintBreakTime); + + + private: + bool linefeedneeded; + + + // little helpers to make code easier to read&use + void writeBytes(uint8_t a, uint8_t b); + void writeBytes(uint8_t a, uint8_t b, uint8_t c); + void writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d); + + // port from arduino serial to mbed serial + void write(uint8_t a); + void delay(uint8_t a); + + int zero; + + + int heatTime; + int heatInterval; + char printDensity; + char printBreakTime; +}; + +#endif