diff --git a/Code/thermal_printer/config.h b/Code/thermal_printer/config.h index f0f3960..aa012ed 100644 --- a/Code/thermal_printer/config.h +++ b/Code/thermal_printer/config.h @@ -1,10 +1,10 @@ #ifndef CONFIG_H #define CONFIG_H -#include #include +#include -///raspberry pi CM3 +/// raspberry pi CM3 #define BCM_GPIO_28 28 #define BCM_GPIO_29 29 @@ -25,27 +25,28 @@ #define BCM_GPIO_44 44 #define BCM_GPIO_45 45 -//PA8-12 UART1 -//#define SPI1_NSS_PIN PA4 //SPI_1 Chip Select pin is PA4. //no use in DevTerm +// PA8-12 UART1 +//#define SPI1_NSS_PIN PA4 //SPI_1 Chip Select pin is PA4. //no use in +//DevTerm -#define VH_PIN BCM_GPIO_40 //ENABLE_VH required,PRT_EN +#define VH_PIN BCM_GPIO_40 // ENABLE_VH required,PRT_EN -#define LATCH_PIN BCM_GPIO_36 //18 -#define PEM_PIN BCM_GPIO_34 // 1 [PS,PAPER] +#define LATCH_PIN BCM_GPIO_36 // 18 +#define PEM_PIN BCM_GPIO_34 // 1 [PS,PAPER] /* -#define PEM_CTL_PIN BCM_GPIO_32 //3 VPS +#define PEM_CTL_PIN BCM_GPIO_32 //3 VPS #define ENABLE_PEM digitalWrite(PEM_CTL_PIN,HIGH) -#define DISABLE_PEM digitalWrite(PEM_CTL_PIN,LOW) +#define DISABLE_PEM digitalWrite(PEM_CTL_PIN,LOW) */ -//DevTerm no VPS IO -//#define PEM_CTL_PIN -#define ENABLE_PEM -#define DISABLE_PEM +// DevTerm no VPS IO +//#define PEM_CTL_PIN +#define ENABLE_PEM +#define DISABLE_PEM // https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md -//enable SPI0 ALT0 in CM3 first -// in /boot/config.txt +// enable SPI0 ALT0 in CM3 first +// in /boot/config.txt // dtparam=spi=on // dtoverlay=spi-gpio35-39 // then we can see GPIO38 GPIO39 in ALT0 Mode by `gpio readall` @@ -53,74 +54,68 @@ #define MOSI_PIN BCM_GPIO_38 #define CLK_PIN BCM_GPIO_39 - /** - *@brief STB_NUMBER stand for STROBE NUMBER of lines, which means how many lines - * are going to be activated -**/ -#define STB_NUMBER 1 - -#define STB1_PIN BCM_GPIO_37//13 -#define STB2_PIN STB1_PIN -#define STB3_PIN STB1_PIN -#define STB4_PIN STB1_PIN -#define STB5_PIN STB1_PIN -#define STB6_PIN STB1_PIN + *@brief STB_NUMBER stand for STROBE NUMBER of lines, which means how many lines + * are going to be activated + **/ +#define STB_NUMBER 1 +#define STB1_PIN BCM_GPIO_37 // 13 +#define STB2_PIN STB1_PIN +#define STB3_PIN STB1_PIN +#define STB4_PIN STB1_PIN +#define STB5_PIN STB1_PIN +#define STB6_PIN STB1_PIN #define PH1_PIN BCM_GPIO_28 #define PH2_PIN BCM_GPIO_29 #define PH3_PIN BCM_GPIO_30 #define PH4_PIN BCM_GPIO_31 -///0 1 3 2 mine -#define PA_PIN PH1_PIN // +/// 0 1 3 2 mine +#define PA_PIN PH1_PIN // #define PNA_PIN PH2_PIN // -#define PB_PIN PH3_PIN // +#define PB_PIN PH3_PIN // #define PNB_PIN PH4_PIN // - - //#define ENABLE1_PIN PA13 //#define ENABLE2_PIN PA14 -#define THERMISTORPIN BCM_GPIO_35 //ADC,14 - +#define THERMISTORPIN BCM_GPIO_35 // ADC,14 #define MOTOR_ENABLE1 -#define MOTOR_ENABLE2 +#define MOTOR_ENABLE2 + +#define MOTOR_DISABLE1 +#define MOTOR_DISABLE2 -#define MOTOR_DISABLE1 -#define MOTOR_DISABLE2 - #define ENABLE_VH digitalWrite(VH_PIN, HIGH) #define DISABLE_VH digitalWrite(VH_PIN, LOW) #define LATCH_ENABLE digitalWrite(LATCH_PIN, LOW) #define LATCH_DISABLE digitalWrite(LATCH_PIN, HIGH) -#define ASK4PAPER digitalRead(PEM_PIN) +#define ASK4PAPER digitalRead(PEM_PIN) +#define ERROR_FEED_PITCH ((uint8_t)0x01) +#define IS_PAPER 0x00 +#define NO_PAPER 0x01 +#define HOT_PRINTER 0x02 -#define ERROR_FEED_PITCH ((uint8_t) 0x01) -#define IS_PAPER 0x00 -#define NO_PAPER 0x01 -#define HOT_PRINTER 0x02 - -#define FORWARD 0x01 -#define BACKWARD 0x00 +#define FORWARD 0x01 +#define BACKWARD 0x00 #define HOT 64 -#define BCoefficent 3950 -#define RthNominal 30000 -#define TempNominal 25 -#define ADCResolution 1024 -#define SeriesResistor 30000 -#define NumSamples 1 +#define BCoefficent 3950 +#define RthNominal 30000 +#define TempNominal 25 +#define ADCResolution 1024 +#define SeriesResistor 30000 +#define NumSamples 1 -#define KELVIN 1 -#define CELSIUS 0 +#define KELVIN 1 +#define CELSIUS 0 #define ADC_FILE_PAT "/tmp/devterm_adc" @@ -129,28 +124,26 @@ #define BAT_CAP "/sys/class/power_supply/axp20x-battery/capacity" #define BAT_THRESHOLD 14 // %14 battery = low power -#define int16 uint16_t -#define int8 uint8_t - -#define asciistart ((uint8_t)'A') -#define netxcharacter ((uint8_t)24) -#define Fontrows ((uint8_t)24) -#define FontColums ((uint8_t)16) - -#define nextcharactercolum ((uint8_t)Fontrows/8) // = 3 +#define int16 uint16_t +#define int8 uint8_t +#define asciistart ((uint8_t)'A') +#define netxcharacter ((uint8_t)24) +#define Fontrows ((uint8_t)24) +#define FontColums ((uint8_t)16) +#define nextcharactercolum ((uint8_t)Fontrows / 8) // = 3 #define ASCII_TAB '\t' // Horizontal tab -#define ASCII_LF '\n' // Line feed,10 -#define ASCII_FF '\f' // Form feed -#define ASCII_CR '\r' // Carriage return -#define ASCII_EOT 4 // End of Transmission -#define ASCII_DLE 16 // Data Link Escape -#define ASCII_DC2 18 // Device control 2 //0x12 -#define ASCII_ESC 27 // Escape //0x1b -#define ASCII_FS 28 // Field separator//0x1c -#define ASCII_GS 29 // Group separator //0x1d +#define ASCII_LF '\n' // Line feed,10 +#define ASCII_FF '\f' // Form feed +#define ASCII_CR '\r' // Carriage return +#define ASCII_EOT 4 // End of Transmission +#define ASCII_DLE 16 // Data Link Escape +#define ASCII_DC2 18 // Device control 2 //0x12 +#define ASCII_ESC 27 // Escape //0x1b +#define ASCII_FS 28 // Field separator//0x1c +#define ASCII_GS 29 // Group separator //0x1d #define PRINT_STATE 0 #define ESC_STATE 1 @@ -164,7 +157,6 @@ #define BITS8 8 - #define MAX_DOTS 384 #define PRINTER_BITS MAX_DOTS #define MAXPIXELS 48 @@ -178,81 +170,78 @@ #define FONT_MODE_0 0 // Internal #define FONT_MODE_1 1 // External -//extract bits -#define LAST(k,n) ((k) & ((1<<(n))-1)) -#define MID(k,m,n) LAST((k)>>(m),((n)-(m))) +// extract bits +#define LAST(k, n) ((k) & ((1 << (n)) - 1)) +#define MID(k, m, n) LAST((k) >> (m), ((n) - (m))) - -typedef struct _Margin{ +typedef struct _Margin { uint16_t width; uint8_t esgs; -}Margin; - +} Margin; typedef struct _FONT { - uint8_t width;//in bits + uint8_t width; // in bits uint8_t height; - uint8_t mode;//0 internal pcf font array,1 external ttf font file + uint8_t mode; // 0 internal pcf font array,1 external ttf font file const uint8_t *data; - char*file; -}FONT; + char *file; +} FONT; + +typedef struct _ImageCache { -typedef struct _ImageCache{ - uint16_t idx; uint16_t num; uint16_t width; uint16_t height; - uint8_t need_print:1; - uint8_t revert_bits:1;//MSB OR LSB + uint8_t need_print : 1; + uint8_t revert_bits : 1; // MSB OR LSB uint8_t cache[IMAGE_MAX]; // 48x192bytes(384x192 pixels) ,max - -}ImageCache; -typedef struct _CONFIG -{ +} ImageCache; + +typedef struct _CONFIG { uint8_t state; uint8_t line_space; uint8_t align; - uint8_t reverse; //reverse print + uint8_t reverse; // reverse print uint8_t orient; uint8_t under_line; uint8_t feed_pitch; - uint8_t density:4; //0-f,300+density*46 HEAT_TIME + uint8_t density : 4; // 0-f,300+density*46 HEAT_TIME - uint16_t wordgap:10;//1023 max - uint8_t max_pts;// max pts in print_dots_8bit_split + uint16_t wordgap : 10; // 1023 max + uint8_t max_pts; // max pts in print_dots_8bit_split uint8_t lock; - + int16_t degree; // char rotate 0,90,180,270, -90,-180,-270 + Margin margin; - FONT*font; + FONT *font; ImageCache *img; - FILE*fp; - + FILE *fp; + FT_Face face; FT_Library ft; - int (*printf)(struct _CONFIG*, char*, ...); + int (*printf)(struct _CONFIG *, char *, ...); -}CONFIG; +} CONFIG; - -typedef struct _SerialCache{ +typedef struct _SerialCache { uint8_t idx; - uint8_t utf8idx;//0-4 + uint8_t utf8idx; // 0-4 // uint8_t data[77];//384/5, minium size font 5 pixel - uint32_t data[MAX_DOTS];//uint32_t for utf8 characters -}SerialCache; + uint32_t data[MAX_DOTS]; // uint32_t for utf8 characters +} SerialCache; -typedef struct _TimeRec{ +typedef struct _TimeRec { unsigned int time; uint8_t last_status; uint8_t check; - -}TimeRec; -void PrintDots8bit(uint8_t *Array, uint8_t characters,uint8_t feed_num); +} TimeRec; + +void PrintDots8bit(uint8_t *Array, uint8_t characters, uint8_t feed_num); uint8_t invert_bit(uint8_t a); diff --git a/Code/thermal_printer/devterm_thermal_printer.c b/Code/thermal_printer/devterm_thermal_printer.c index bcaf25d..774fdd8 100644 --- a/Code/thermal_printer/devterm_thermal_printer.c +++ b/Code/thermal_printer/devterm_thermal_printer.c @@ -1,15 +1,15 @@ // for ltp02-245 -// 203 dpi, 384dots in 48mm(1.88976inch) every dots == 0.125mm, 1byte==8dots==1mm -// make clean && make && ./*.elf +// 203 dpi, 384dots in 48mm(1.88976inch) every dots == 0.125mm, +// 1byte==8dots==1mm make clean && make && ./*.elf //#include +#include +#include +#include #include #include -#include #include -#include #include #include -#include #include @@ -23,8 +23,8 @@ #include "ttf_Px437_PS2thin2_8x16.h" #include "config.h" -#include "utils.h" #include "printer.h" +#include "utils.h" #include "ftype.h" #include @@ -51,85 +51,90 @@ CONFIG g_config; TimeRec battery_chk_tm; -int printf_out(CONFIG*cfg, char *format, ...) { - va_list args; - int rv; +int printf_out(CONFIG *cfg, char *format, ...) { + va_list args; + int rv; - va_start(args, format); - if(cfg->fp != NULL) - rv = vfprintf(cfg->fp, format, args); - else { - rv = -1; - } - va_end(args); + va_start(args, format); + if (cfg->fp != NULL) + rv = vfprintf(cfg->fp, format, args); + else { + rv = -1; + } + va_end(args); - return rv; + return rv; } -//void printer_set_font(CONFIG*cfg,uint8_t fnbits); -//void parse_serial_stream(CONFIG*cfg,uint8_t input_ch); +// void printer_set_font(CONFIG*cfg,uint8_t fnbits); +// void parse_serial_stream(CONFIG*cfg,uint8_t input_ch); -void reset_cmd(){ +void reset_cmd() { cmd_idx = 0; - ser_cache.idx=0; + ser_cache.idx = 0; g_config.state = PRINT_STATE; } -void init_printer(){ +void init_printer() { char *error = NULL; - memset(cmd,0,10); + memset(cmd, 0, 10); newline = 0; cmd_idx = 0; - img_cache.idx=0; - img_cache.num=0; - img_cache.width=0; - - img_cache.need_print=0; + img_cache.idx = 0; + img_cache.num = 0; + img_cache.width = 0; + + img_cache.need_print = 0; img_cache.revert_bits = 0; -/* - current_font.width=5; current_font.height=7; current_font.data = font_pcf_5x7_ISO8859_1_5x7; - current_font.width=6;current_font.height=12; current_font.data = font_pcf_6x12_ISO8859_1_6x12; - current_font.width=7; current_font.height=14; current_font.data = font_pcf_7x14_ISO8859_1_7x14; + /* + current_font.width=5; current_font.height=7; current_font.data = + font_pcf_5x7_ISO8859_1_5x7; current_font.width=6;current_font.height=12; + current_font.data = font_pcf_6x12_ISO8859_1_6x12; current_font.width=7; + current_font.height=14; current_font.data = font_pcf_7x14_ISO8859_1_7x14; - //current_font.width=8;current_font.height=16; current_font.data= font_ttf_Px437_ISO8_8x16; - //current_font.width=8;current_font.height=16; current_font.data= font_ttf_Px437_ISO9_8x16; - - current_font.width=8;current_font.height=16; current_font.data= font_ttf_Px437_PS2thin2_8x16; -*/ + //current_font.width=8;current_font.height=16; current_font.data= + font_ttf_Px437_ISO8_8x16; + //current_font.width=8;current_font.height=16; current_font.data= + font_ttf_Px437_ISO9_8x16; + + current_font.width=8;current_font.height=16; current_font.data= + font_ttf_Px437_PS2thin2_8x16; + */ current_font.width = 16; current_font.height = 16; - current_font.data= font_ttf_Px437_PS2thin1_8x16; + current_font.data = font_ttf_Px437_PS2thin1_8x16; current_font.file = "NotoSansCJK-Regular.ttf"; current_font.mode = FONT_MODE_1; - - ser_cache.idx=0; + + ser_cache.idx = 0; ser_cache.utf8idx = 0; - - if( init_ft(current_font.file, &face,&ft,current_font.width,current_font.height,&error)) { + + if (init_ft(current_font.file, &face, &ft, current_font.width, + current_font.height, &error)) { g_config.face = face; - g_config.ft = ft; - }else { - printf("init_ft error %s\n",error); + g_config.ft = ft; + } else { + printf("init_ft error %s\n", error); g_config.face = NULL; - g_config.ft = NULL; + g_config.ft = NULL; } - - g_config.line_space=0; + + g_config.line_space = 0; g_config.align = ALIGN_LEFT; g_config.reverse = 0; - + g_config.margin.width = 0; - g_config.margin.esgs = 0; - + g_config.margin.esgs = 0; + g_config.orient = FORWARD; g_config.wordgap = 0; g_config.font = ¤t_font; - + g_config.under_line = 0; g_config.state = PRINT_STATE; @@ -140,83 +145,78 @@ void init_printer(){ g_config.feed_pitch = 2; g_config.max_pts = 2; g_config.lock = 0; - - + g_config.degree = 0; + battery_chk_tm.time = millis(); battery_chk_tm.last_status = 0; battery_chk_tm.check = 0; } -const char url[] ={"Powered by clockworkpi.com"}; +const char url[] = {"Powered by clockworkpi.com"}; -void label_print_f(CONFIG*cfg,char*label,float m,char*last){ +void label_print_f(CONFIG *cfg, char *label, float m, char *last) { char buf[48]; - uint8_t i,j; + uint8_t i, j; - - if(m == -1.0) - sprintf(buf,"%s",last); + if (m == -1.0) + sprintf(buf, "%s", last); else - sprintf(buf,"%0.2f%s",m,last); - + sprintf(buf, "%0.2f%s", m, last); + j = strlen(buf); - i = 48-strlen(label)-j-1; + i = 48 - strlen(label) - j - 1; - if(m == -1.0) - sprintf(buf,"%s%*s%s",label,i,"",last); + if (m == -1.0) + sprintf(buf, "%s%*s%s", label, i, "", last); else - sprintf(buf,"%s%*s%0.2f%s",label,i,"",m,last); - - - printer_set_font(cfg,4); + sprintf(buf, "%s%*s%0.2f%s", label, i, "", m, last); + + printer_set_font(cfg, 4); reset_cmd(); - for(i=0;idensity = 6; - - k = (os120_width/8)*os120_height; - memcpy(cfg->img->cache,os120_bits,k); - cfg->img->width = os120_width/8; + + k = (os120_width / 8) * os120_height; + memcpy(cfg->img->cache, os120_bits, k); + cfg->img->width = os120_width / 8; cfg->img->num = k; - cfg->img->revert_bits=1; + cfg->img->revert_bits = 1; cfg->align = ALIGN_CENTER; print_image8(cfg); - - cfg->img->revert_bits=0; + + cfg->img->revert_bits = 0; cfg->align = ALIGN_LEFT; - feed_pitch1(15,cfg->orient); + feed_pitch1(15, cfg->orient); cfg->align = ALIGN_CENTER; /* //selftest1 for(i=0;i<5;i++){ printer_set_font(cfg,0); reset_cmd(); - for(j=0;jalign = ALIGN_LEFT; - - feed_pitch1(32,cfg->orient); -//--------------------------------------------- + feed_pitch1(32, cfg->orient); - for(i=1;i<4;i++){ - printer_set_font_mode(cfg,FONT_MODE_0); - printer_set_font(cfg,0); + //--------------------------------------------- + + for (i = 1; i < 4; i++) { + printer_set_font_mode(cfg, FONT_MODE_0); + printer_set_font(cfg, 0); reset_cmd(); - for(j=0;jorient); + parse_serial_stream(cfg, 10); + // Serial.println(); + feed_pitch1(48, cfg->orient); } - printer_set_font_mode(cfg,FONT_MODE_0); - printer_set_font(cfg,0); + printer_set_font_mode(cfg, FONT_MODE_0); + printer_set_font(cfg, 0); reset_cmd(); - for(j=0;jorient); + parse_serial_stream(cfg, 10); - printer_set_font_mode(cfg,FONT_MODE_0); - printer_set_font(cfg,0); + printer_set_font_mode(cfg, FONT_MODE_0); + printer_set_font(cfg, 0); reset_cmd(); - for(j=0;jorient); + parse_serial_stream(cfg, 10); + // Serial.println(); + feed_pitch1(48, cfg->orient); -//------------------------------------------- + printer_set_font_mode(cfg, FONT_MODE_0); + printer_set_font(cfg, 0); + reset_cmd(); + for (j = 0; j < strlen(font_names[0]); j++) { + parse_serial_stream(cfg, font_names[4][j]); + } + parse_serial_stream(cfg, 10); + + printer_set_font_mode(cfg, FONT_MODE_0); + printer_set_font(cfg, 4); + reset_cmd(); + for (ch = 33; ch < 127; ch++) { + parse_serial_stream(cfg, ch); + // Serial.print(ch,DEC); + } + parse_serial_stream(cfg, 10); + // Serial.println(); + feed_pitch1(28, cfg->orient); + + //------------------------------------------- k = temperature(); - label_print_i(cfg,"Temperature:",k," C"); -//-------------------------------------------------------- + label_print_i(cfg, "Temperature:", k, " C"); + //-------------------------------------------------------- - label_print_i(cfg,"Darkness setting:",cfg->density," (Light 0-15 Dark)"); - - label_print_i(cfg,"Paper width:",-1,"58mm"); - label_print_i(cfg,"Print width:",-1,"48mm"); - - label_print_i(cfg,"Baudrate:",115200,""); - label_print_i(cfg,"Data bits:",8,""); - label_print_i(cfg,"Stop bits:",1,""); -//------------------------------------------ + label_print_i(cfg, "Darkness setting:", cfg->density, " (Light 0-15 Dark)"); -//------------------------------------------ - label_print_f(cfg,"Firmware version:",0.1,""); - - feed_pitch1(cfg->font->height,cfg->orient); -//-------------------------------------------------------------- - printer_set_font_mode(cfg,FONT_MODE_0); - printer_set_font(cfg,0); + label_print_i(cfg, "Paper width:", -1, "58mm"); + label_print_i(cfg, "Print width:", -1, "48mm"); + + label_print_i(cfg, "Baudrate:", 115200, ""); + label_print_i(cfg, "Data bits:", 8, ""); + label_print_i(cfg, "Stop bits:", 1, ""); + //------------------------------------------ + + //------------------------------------------ + label_print_f(cfg, "Firmware version:", 0.1, ""); + + feed_pitch1(cfg->font->height, cfg->orient); + //-------------------------------------------------------------- + printer_set_font_mode(cfg, FONT_MODE_0); + printer_set_font(cfg, 0); reset_cmd(); - - //Serial.println(strlen(url),DEC); - for(i=0;ifont->height*2,cfg->orient); - + */ + //-------------------------------------------------------- + feed_pitch1(cfg->font->height * 2, cfg->orient); } -void printer_set_font_mode(CONFIG*cfg, int mode){ +void printer_set_font_mode(CONFIG *cfg, int mode) { cfg->font->mode = mode; return; } -void printer_set_font(CONFIG*cfg,uint8_t fnbits){ - uint8_t ret; - ret = MID(fnbits,0,3); +void printer_set_font(CONFIG *cfg, uint8_t fnbits) { + uint8_t ret; + ret = MID(fnbits, 0, 3); - if(cfg->font->mode == 0) { - if(ret==0) { - cfg->font->width = 8 ; - cfg->font->height = 16; - cfg->font->data = font_ttf_Px437_PS2thin1_8x16; - } - - if(ret==1){ - cfg->font->width = 5; - cfg->font->height = 7; - cfg->font->data = font_pcf_5x7_ISO8859_1_5x7; - } - - if(ret==2){ - cfg->font->width = 6; - cfg->font->height = 12; - cfg->font->data = font_pcf_6x12_ISO8859_1_6x12; - } - - if(ret==3){ - cfg->font->width = 7; - cfg->font->height = 14; - cfg->font->data = font_pcf_7x14_ISO8859_1_7x14; - } - - if(ret == 4){ - cfg->font->width = 8 ; - cfg->font->height = 16; - cfg->font->data = font_ttf_Px437_PS2thin2_8x16; - } - } - - if(cfg->font->mode == 1 ){ - cfg->font->width = 16; - cfg->font->height = 16; - - } - + if (cfg->font->mode == 0) { + if (ret == 0) { + cfg->font->width = 8; + cfg->font->height = 16; + cfg->font->data = font_ttf_Px437_PS2thin1_8x16; + } + + if (ret == 1) { + cfg->font->width = 5; + cfg->font->height = 7; + cfg->font->data = font_pcf_5x7_ISO8859_1_5x7; + } + + if (ret == 2) { + cfg->font->width = 6; + cfg->font->height = 12; + cfg->font->data = font_pcf_6x12_ISO8859_1_6x12; + } + + if (ret == 3) { + cfg->font->width = 7; + cfg->font->height = 14; + cfg->font->data = font_pcf_7x14_ISO8859_1_7x14; + } + + if (ret == 4) { + cfg->font->width = 8; + cfg->font->height = 16; + cfg->font->data = font_ttf_Px437_PS2thin2_8x16; + } + } + + if (cfg->font->mode == 1) { + cfg->font->width = 16; + cfg->font->height = 16; + } } -void parse_cmd(CONFIG*cfg,uint8_t *cmd, uint8_t cmdidx){ - +void parse_cmd(CONFIG *cfg, uint8_t *cmd, uint8_t cmdidx) { + uint8_t ret; - - if(cmdidx >1){ - //ESC 2 - if(cmd[0] == ASCII_ESC && cmd[1] == 0x32){ - cfg->line_space = cfg->font->height+8; + if (cmdidx > 1) { + // ESC 2 + if (cmd[0] == ASCII_ESC && cmd[1] == 0x32) { + cfg->line_space = cfg->font->height + 8; reset_cmd(); } - //ESC @ - if(cmd[0] == ASCII_ESC && cmd[1] == 0x40){ + // ESC @ + if (cmd[0] == ASCII_ESC && cmd[1] == 0x40) { init_printer(); reset_cmd(); - } - //DC2 T printer test page - if(cmd[0] == ASCII_DC2 && cmd[1] == 0x54){ + // DC2 T printer test page + if (cmd[0] == ASCII_DC2 && cmd[1] == 0x54) { reset_cmd(); printer_test(cfg); - } } - - if(cmdidx > 2){ - //ESC j n - if(cmd[0] == ASCII_ESC && cmd[1] == 0x4a){ - - if( print_lines8(cfg) == 0) { feed_pitch1(cmd[2],cfg->orient); } - reset_cmd(); - } - //ESC d n - if(cmd[0] == ASCII_ESC && cmd[1] == 0x64){ - - if( print_lines8(cfg) == 0) { feed_pitch1(cmd[2]*cfg->font->height,cfg->orient); } - reset_cmd(); - } - //ESC ! n - if(cmd[0] == ASCII_ESC && cmd[1] == 0x21){ - printer_set_font(cfg,cmd[2]); - reset_cmd(); - } - //ESC 3 n - if(cmd[0] == ASCII_ESC && cmd[1] == 0x33){ - cfg->line_space = cmd[2]; - reset_cmd(); - } - - // ESC v n - if(cmd[0] == ASCII_ESC && cmd[1] == 0x76){ - if(temperature() > 70){ + if (cmdidx > 2) { + // ESC j n + if (cmd[0] == ASCII_ESC && cmd[1] == 0x4a) { + + if (print_lines8(cfg) == 0) { + feed_pitch1(cmd[2], cfg->orient); + } + reset_cmd(); + } + // ESC d n + if (cmd[0] == ASCII_ESC && cmd[1] == 0x64) { + + if (print_lines8(cfg) == 0) { + feed_pitch1(cmd[2] * cfg->font->height, cfg->orient); + } + reset_cmd(); + } + // ESC ! n + if (cmd[0] == ASCII_ESC && cmd[1] == 0x21) { + printer_set_font(cfg, cmd[2]); + reset_cmd(); + } + + // ESC 3 n + if (cmd[0] == ASCII_ESC && cmd[1] == 0x33) { + cfg->line_space = cmd[2]; + reset_cmd(); + } + + // ESC v n + if (cmd[0] == ASCII_ESC && cmd[1] == 0x76) { + if (temperature() > 70) { ret |= 1 << 6; - } - if ( (IsPaper() & NO_PAPER) > 0 ) { + } + if ((IsPaper() & NO_PAPER) > 0) { ret |= 1 << 2; - } - // 1<< 3 == power error - - cfg->printf(cfg,"%d",ret); - reset_cmd(); - return; - } - //ESC a n - if(cmd[0] == ASCII_ESC && cmd[1] == 0x61){ - ret = cmd[2]; - if(ret == 0 || ret == 48){ - cfg->align = ALIGN_LEFT; - } - if(ret == 1 || ret == 49){ - cfg->align = ALIGN_CENTER; - } - if(ret == 2 || ret == 50){ - cfg->align = ALIGN_RIGHT; - } - - reset_cmd(); - } - //ESC - n - if(cmd[0] == ASCII_ESC && cmd[1] == 0x2d){ - ret = cmd[2]; - if(ret == 0 || ret == 48){ - cfg->under_line =0; - } - if(ret == 1 || ret == 49){ - cfg->under_line = 1; - } - if(ret == 2 || ret == 50){ - cfg->under_line = 2; - } - - reset_cmd(); - - } + } + // 1<< 3 == power error - //ESC SP n - if(cmd[0] == ASCII_ESC && cmd[1] == 0x20){ - ret = cmd[2]; - if( ret + cfg->margin.width wordgap = ret; - } - reset_cmd(); - return; - } + cfg->printf(cfg, "%d", ret); + reset_cmd(); + return; + } + // ESC a n + if (cmd[0] == ASCII_ESC && cmd[1] == 0x61) { + ret = cmd[2]; + if (ret == 0 || ret == 48) { + cfg->align = ALIGN_LEFT; + } + if (ret == 1 || ret == 49) { + cfg->align = ALIGN_CENTER; + } + if (ret == 2 || ret == 50) { + cfg->align = ALIGN_RIGHT; + } - //DC2 # n - if(cmd[0] == ASCII_DC2 && cmd[1] == 0x23){ - ret = cmd[2]; - cfg->density = ret; - reset_cmd(); - } + reset_cmd(); + } + // ESC - n + if (cmd[0] == ASCII_ESC && cmd[1] == 0x2d) { + ret = cmd[2]; + if (ret == 0 || ret == 48) { + cfg->under_line = 0; + } + if (ret == 1 || ret == 49) { + cfg->under_line = 1; + } + if (ret == 2 || ret == 50) { + cfg->under_line = 2; + } + reset_cmd(); + } - //GS V \0 or GS V \1 - if(cmd[0] == ASCII_GS && cmd[1] == 0x56){ - - ret = cmd[2]; - reset_cmd();//When using parse_serial_stream function internally, reset_cmd() first - - print_cut_line(cfg); - - return; - } - + // ESC SP n + if (cmd[0] == ASCII_ESC && cmd[1] == 0x20) { + ret = cmd[2]; + if (ret + cfg->margin.width < MAX_DOTS) { + cfg->wordgap = ret; + } + reset_cmd(); + return; + } + + // DC2 # n + if (cmd[0] == ASCII_DC2 && cmd[1] == 0x23) { + ret = cmd[2]; + cfg->density = ret; + reset_cmd(); + } + + // GS V \0 or GS V \1 + if (cmd[0] == ASCII_GS && cmd[1] == 0x56) { + + ret = cmd[2]; + reset_cmd(); // When using parse_serial_stream function internally, + // reset_cmd() first + + print_cut_line(cfg); + + return; + } + + // ESC V n + if (cmd[0] == ASCII_ESC && cmd[1] == 0x56) { + ret = cmd[2]; + if (ret == 0x00 || ret == 0x30) { + cfg->degree = 0; + } + if (ret == 0x01 || ret == 0x31) { + cfg->degree = 90; + } + if (ret == 0x02 || ret == 0x32) { + cfg->degree = 180; + } + + if (ret == 0x03 || ret == 0x33) { + cfg->degree = 270; + } + printf("set printer degree, %d\n", cfg->degree); + return; + } } - if(cmdidx > 3){ - //GS L nL nH - if(cmd[0] == ASCII_GS && cmd[1] == 0x4c){ + if (cmdidx > 3) { + // GS L nL nH + if (cmd[0] == ASCII_GS && cmd[1] == 0x4c) { uint16_t k; - k = cmd[2]+cmd[3]*256; - if (k < MAX_DOTS - cfg->font->width){ + k = cmd[2] + cmd[3] * 256; + if (k < MAX_DOTS - cfg->font->width) { cfg->margin.width = k; } reset_cmd(); } - } - if(cmdidx > 4){ + if (cmdidx > 4) { /* if(cmd[0] == ASCII_ESC && cmd[1] == 0x2a){ if( cmd[2] == 0 || cmd[2] == 1){ @@ -603,143 +614,141 @@ void parse_cmd(CONFIG*cfg,uint8_t *cmd, uint8_t cmdidx){ cfg->img->idx = 0; } } - + reset_cmd(); } */ } - if(cmdidx > 7){ - // GS v 0 p wL wH hL hH d1…dk - if(cmd[0] == ASCII_GS && cmd[1] == 118 && cmd[2] == 48 ) { - uint16_t width = cmd[4] + cmd[5]*256; - uint16_t height = cmd[6]+cmd[7]*256; - uint16_t k; - k = width * height; - if(k<= IMAGE_MAX){ + if (cmdidx > 7) { + // GS v 0 p wL wH hL hH d1…dk + if (cmd[0] == ASCII_GS && cmd[1] == 118 && cmd[2] == 48) { + uint16_t width = cmd[4] + cmd[5] * 256; + uint16_t height = cmd[6] + cmd[7] * 256; + uint16_t k; + k = width * height; + if (k <= IMAGE_MAX) { cfg->state = GET_IMAGE; cfg->img->num = k; cfg->img->idx = 0; cfg->img->width = width; - cfg->img->need_print=1; - - } - // do not reset_cmd() - cmd_idx = 0; - ser_cache.idx=0; - + cfg->img->need_print = 1; + } + // do not reset_cmd() + cmd_idx = 0; + ser_cache.idx = 0; } } - } -void parse_serial_stream(CONFIG*cfg,uint8_t input_ch){ +void parse_serial_stream(CONFIG *cfg, uint8_t input_ch) { uint16_t a; uint8_t bskip; - - if(cfg->state == GET_IMAGE){ - cfg->img->cache[cfg->img->idx] = input_ch; - cfg->img->idx++; - if(cfg->img->idx >= cfg->img->num){//image full - if(cfg->img->need_print==1){ - print_image8(cfg); + + if (cfg->state == GET_IMAGE) { + cfg->img->cache[cfg->img->idx] = input_ch; + cfg->img->idx++; + if (cfg->img->idx >= cfg->img->num) { // image full + if (cfg->img->need_print == 1) { + print_image8(cfg); + } + reset_cmd(); + cfg->state = PRINT_STATE; + } + } else if (cfg->state == ESC_STATE) { + cmd[cmd_idx] = input_ch; + cmd_idx++; + if (cmd_idx < 10) { + parse_cmd(cfg, cmd, cmd_idx); + } else { + reset_cmd(); + } + } else { // PRINT_STATE + switch (input_ch) { + case ASCII_LF: + if (ser_cache.idx == 0) { + feed_pitch1(cfg->font->height, cfg->orient); + } + print_lines8(cfg); + reset_cmd(); + break; + case ASCII_FF: + + print_lines8(cfg); + reset_cmd(); + break; + case ASCII_DC2: + cmd[cmd_idx] = input_ch; + cfg->state = ESC_STATE; + cmd_idx++; + break; + case ASCII_GS: + cmd[cmd_idx] = input_ch; + cfg->state = ESC_STATE; + cmd_idx++; + break; + case ASCII_ESC: + cmd[cmd_idx] = input_ch; + cfg->state = ESC_STATE; + cmd_idx++; + break; + default: + if (input_ch < 128) { + ser_cache.data[ser_cache.idx] = input_ch; + ser_cache.idx++; + } else { // utf8 + // 10xxxxxx bskip == 1 + bskip = get_slice_len(input_ch); + + if (bskip == 1) { + // append this to int32_t [8:8:8:8] 0xffffffff 4294967295 + ser_cache.data[ser_cache.idx] |= input_ch + << (8 * (ser_cache.utf8idx)); + if (ser_cache.utf8idx == + get_slice_len(ser_cache.data[ser_cache.idx] & 0xff) - 1) { + ser_cache.idx++; + ser_cache.utf8idx = 0; // next character + } else { + ser_cache.utf8idx++; + } + } + + if (bskip > 1) { + ser_cache.utf8idx = 1; + ser_cache.data[ser_cache.idx] = input_ch; + } + } + // read utf8 codename + // + if (cfg->font->mode == FONT_MODE_1) { + + a = get_serial_cache_font_width(&g_config); + a += (ser_cache.idx) * 0 + g_config.margin.width; + + } else { + a = (ser_cache.idx + 1) * current_font.width + (ser_cache.idx) * 0 + + g_config.margin.width; + } + if (a >= MAX_DOTS) // got enough points to print + { + if (cfg->font->mode == FONT_MODE_1) { + print_lines_ft(cfg); + } else { + print_lines8(cfg); } reset_cmd(); - cfg->state = PRINT_STATE; - } - }else if(cfg->state == ESC_STATE) { - cmd[cmd_idx] = input_ch; - cmd_idx++; - if(cmd_idx < 10){ - parse_cmd(cfg,cmd,cmd_idx); - }else{ - reset_cmd(); - } - }else{ //PRINT_STATE - switch(input_ch){ - case ASCII_LF: - if(ser_cache.idx == 0){ - feed_pitch1(cfg->font->height,cfg->orient); - } - print_lines8(cfg); - reset_cmd(); - break; - case ASCII_FF: - - print_lines8(cfg); - reset_cmd(); - break; - case ASCII_DC2: - cmd[cmd_idx] = input_ch; - cfg->state = ESC_STATE; - cmd_idx++; - break; - case ASCII_GS: - cmd[cmd_idx] = input_ch; - cfg->state = ESC_STATE; - cmd_idx++; - break; - case ASCII_ESC: - cmd[cmd_idx] = input_ch; - cfg->state = ESC_STATE; - cmd_idx++; - break; - default: - if(input_ch < 128) { - ser_cache.data[ser_cache.idx]=input_ch; - ser_cache.idx++; - }else {//utf8 - //10xxxxxx bskip == 1 - bskip = get_slice_len(input_ch); - - if(bskip == 1) { - //append this to int32_t [8:8:8:8] 0xffffffff 4294967295 - ser_cache.data[ser_cache.idx] |= input_ch << (8 * (ser_cache.utf8idx)); - if( ser_cache.utf8idx == get_slice_len( ser_cache.data[ser_cache.idx] & 0xff) -1 ) { - ser_cache.idx++; - ser_cache.utf8idx=0;//next character - }else { - ser_cache.utf8idx++; - } - } - - if(bskip > 1) { - ser_cache.utf8idx =1; - ser_cache.data[ser_cache.idx] = input_ch; - } - - } - //read utf8 codename - // - if(cfg->font->mode == FONT_MODE_1) { - - a = get_serial_cache_font_width(&g_config); - a+= (ser_cache.idx)*0+ g_config.margin.width; - - }else { - a = (ser_cache.idx+1)*current_font.width+(ser_cache.idx)*0+ g_config.margin.width; - - } - if( a >= MAX_DOTS)//got enough points to print - { - if(cfg->font->mode == FONT_MODE_1){ - print_lines_ft(cfg); - }else { - print_lines8(cfg); - } - reset_cmd(); - } - break; } + break; } - + } } /* Virtual serial port created by socat - socat -d -d pty,link=/tmp/DEVTERM_PRINTER_OUT,raw,echo=0 pty,link=/tmp/DEVTERM_PRINTER_IN,raw,echo=0 + socat -d -d pty,link=/tmp/DEVTERM_PRINTER_OUT,raw,echo=0 + pty,link=/tmp/DEVTERM_PRINTER_IN,raw,echo=0 */ -int read_bat_cap(CONFIG*cfg) { +int read_bat_cap(CONFIG *cfg) { long ret; char c[12]; FILE *fptr; @@ -750,101 +759,93 @@ int read_bat_cap(CONFIG*cfg) { } fscanf(fptr, "%[^\n]", c); - //printf("Data from the file:%s\n", c); + // printf("Data from the file:%s\n", c); fclose(fptr); - ret = strtol(c, NULL, 10); - + ret = strtol(c, NULL, 10); + return (int)ret; - } -int bat_cap_to_pts(CONFIG*cfg,int bat) { +int bat_cap_to_pts(CONFIG *cfg, int bat) { int pts; - - pts = (int)round( (float)bat/10.0 ) + 1; + + pts = (int)round((float)bat / 10.0) + 1; return pts; } +void print_lowpower(CONFIG *cfg) { -void print_lowpower(CONFIG*cfg) { - int i; - char*msg = "Low Power,please charge"; + char *msg = "Low Power,please charge"; reset_cmd(); - printer_set_font(cfg,4); - - for(i=0;iorient); - printer_set_font(cfg,0); - - PRINTF("%s\n",msg); + feed_pitch1(128, cfg->orient); + printer_set_font(cfg, 0); + PRINTF("%s\n", msg); } -int check_battery(CONFIG*cfg){ +int check_battery(CONFIG *cfg) { int bat_cap; - + bat_cap = 0; - - if( millis() - battery_chk_tm.time > 200) { - + + if (millis() - battery_chk_tm.time > 200) { + bat_cap = read_bat_cap(cfg); - - if( bat_cap < 0){ - cfg->max_pts = 1;//no battery ,so set to the slowest - cfg->lock = 0;// unlock printer anyway + + if (bat_cap < 0) { + cfg->max_pts = 1; // no battery ,so set to the slowest + cfg->lock = 0; // unlock printer anyway PRINTF("no battery,slowest printing\n"); } - - if(bat_cap >=0 && bat_cap <= BAT_THRESHOLD) { - - if(cfg->lock == 0) { + + if (bat_cap >= 0 && bat_cap <= BAT_THRESHOLD) { + + if (cfg->lock == 0) { print_lowpower(cfg); - } - cfg->lock =1; + cfg->lock = 1; PRINTF("printer locked\n"); reset_cmd(); // clear all serial_cache - }else { - - cfg->max_pts = bat_cap_to_pts(cfg,bat_cap); - + } else { + + cfg->max_pts = bat_cap_to_pts(cfg, bat_cap); + cfg->lock = 0; } - + battery_chk_tm.time = millis(); - } - - if(cfg->lock == 1) { + + if (cfg->lock == 1) { reset_cmd(); } return 0; - } #define FIFO_FILE "/tmp/DEVTERM_PRINTER_OUT" void loop() { - + /* if (Serial.available() > 0) { // read the incoming byte @@ -852,66 +853,61 @@ void loop() { parse_serial_stream(&g_config,buf[0]); } */ - - FILE*fp=NULL; + + FILE *fp = NULL; char readbuf[2]; - - while(1) { + + while (1) { fp = NULL; - fp = fopen(FIFO_FILE,"r+b"); + fp = fopen(FIFO_FILE, "r+b"); if (fp != NULL) { - g_config.fp = fp; - while(1) - { - fread(readbuf,1, 1,fp); + g_config.fp = fp; + while (1) { + fread(readbuf, 1, 1, fp); check_battery(&g_config); - - if(g_config.lock ==0) { - //printf("read %x",readbuf[0]); - if(g_config.state == PRINT_STATE) { - if(readbuf[0] == ASCII_TAB) { - readbuf[0] = ' '; - parse_serial_stream(&g_config,readbuf[0]); - parse_serial_stream(&g_config,readbuf[0]); - } else {//not a tab - parse_serial_stream(&g_config,readbuf[0]); - } - } else { //g_config.state == PRINT_STATE - parse_serial_stream(&g_config,readbuf[0]); - } + + if (g_config.lock == 0) { + // printf("read %x",readbuf[0]); + if (g_config.state == PRINT_STATE) { + if (readbuf[0] == ASCII_TAB) { + readbuf[0] = ' '; + parse_serial_stream(&g_config, readbuf[0]); + parse_serial_stream(&g_config, readbuf[0]); + } else { // not a tab + parse_serial_stream(&g_config, readbuf[0]); + } + } else { // g_config.state != PRINT_STATE + parse_serial_stream(&g_config, readbuf[0]); + } } } fclose(fp); g_config.fp = NULL; } - + sleep(1); } -//------------------------------------------ - //printer_test(&g_config); - + //------------------------------------------ + // printer_test(&g_config); } void setup() { - + wiringPiSetupGpio(); header_init(); header_init1(); - + clear_printer_buffer(); - - //Serial.begin(115200); + + // Serial.begin(115200); init_printer(); - g_config.printf = &printf_out; - + g_config.printf = &printf_out; } -int main(int argc,char**argv) { - - - setup(); - loop(); - +int main(int argc, char **argv) { + + setup(); + loop(); } diff --git a/Code/thermal_printer/ftype.c b/Code/thermal_printer/ftype.c index 667881b..b63ba12 100644 --- a/Code/thermal_printer/ftype.c +++ b/Code/thermal_printer/ftype.c @@ -4,55 +4,49 @@ static const UTF32 utf32_space[2] = {' ', 0}; +bool init_ft(const char *ttf_file, FT_Face *face, FT_Library *ft, + int req_size_w, int req_size_h, char **error) { -bool init_ft (const char *ttf_file, FT_Face *face, FT_Library *ft, - int req_size_w,int req_size_h, char **error) -{ - bool ret = false; - if (FT_Init_FreeType (ft) == 0) { + if (FT_Init_FreeType(ft) == 0) { if (FT_New_Face(*ft, ttf_file, 0, face) == 0) { - - if(FT_Set_Pixel_Sizes(*face, req_size_w, req_size_h) == 0){ + + if (FT_Set_Pixel_Sizes(*face, req_size_w, req_size_h) == 0) { ret = true; } else { if (error) - *error = strdup ("Can't set font size"); + *error = strdup("Can't set font size"); } - + } else { if (error) - *error = strdup ("Can't load TTF file"); + *error = strdup("Can't load TTF file"); } - - }else{ + + } else { if (error) - *error = strdup ("Can't init freetype library"); + *error = strdup("Can't init freetype library"); } return ret; } /*=========================================================================== - done_ft + done_ft Clean up after we've finished wih the FreeType librar =========================================================================*/ -void done_ft(FT_Library ft) -{ - FT_Done_FreeType (ft); -} +void done_ft(FT_Library ft) { FT_Done_FreeType(ft); } /*=========================================================================== face_get_line_spacing - Get the nominal line spacing, that is, the distance between glyph + Get the nominal line spacing, that is, the distance between glyph baselines for vertically-adjacent rows of text. This is "nominal" because, in "real" typesetting, we'd need to add extra room for accents, etc. =========================================================================*/ -int face_get_line_spacing (FT_Face face) -{ +int face_get_line_spacing(FT_Face face) { return face->size->metrics.height / 64; // There are other possibilities the give subtly different results: // return (face->bbox.yMax - face->bbox.yMin) / 64; @@ -61,42 +55,42 @@ int face_get_line_spacing (FT_Face face) int get_slice_len(const char lb) { - if( ( lb & 0x80 ) == 0 ) return 1; - else if( ( lb & 0xE0) == 0xC0) return 2; - else if( ( lb & 0xF0) == 0xE0) return 3; - else if( ( lb & 0xF8) == 0xF0) return 4; + if ((lb & 0x80) == 0) + return 1; + else if ((lb & 0xE0) == 0xC0) + return 2; + else if ((lb & 0xF0) == 0xE0) + return 3; + else if ((lb & 0xF8) == 0xF0) + return 4; return 1; } -UTF32 *cjk_utf8_to_utf32 (const char *word) -{ - assert (word != NULL); +UTF32 *cjk_utf8_to_utf32(const char *word) { + assert(word != NULL); int l = strlen(word); int u8l = utf8_strlen(word); - + char buf[5]; - - UTF32 *ret = malloc ((u8l + 1) * sizeof (UTF32)); - int i=0,j=0; - int bskip=1; - - while( i 1) { - ret[j] = (UTF32)utf8_to_utf32(buf); - }else { - ret[j] = (UTF32)buf[0]; - } - - j++; - i+=bskip; + + UTF32 *ret = malloc((u8l + 1) * sizeof(UTF32)); + int i = 0, j = 0; + int bskip = 1; + + while (i < l) { + + bskip = get_slice_len(word[i]); + strncpy(buf, &word[i], bskip); + if (bskip > 1) { + ret[j] = (UTF32)utf8_to_utf32(buf); + } else { + ret[j] = (UTF32)buf[0]; } - + + j++; + i += bskip; + } + ret[u8l] = 0; return ret; } - - diff --git a/Code/thermal_printer/ftype.h b/Code/thermal_printer/ftype.h index 49812a0..a1ce9c7 100644 --- a/Code/thermal_printer/ftype.h +++ b/Code/thermal_printer/ftype.h @@ -1,12 +1,12 @@ #ifndef FTYPE_H #define FTYPE_H +#include +#include #include #include -#include -#include - #include + #include #ifndef UTF8 @@ -17,10 +17,10 @@ typedef unsigned char UTF8; typedef int32_t UTF32; #endif -bool init_ft (const char *ttf_file, FT_Face *face, FT_Library *ft, - int req_size_w,int req_size_h, char **error); +bool init_ft(const char *ttf_file, FT_Face *face, FT_Library *ft, + int req_size_w, int req_size_h, char **error); -int face_get_line_spacing (FT_Face face); +int face_get_line_spacing(FT_Face face); int get_slice_len(const char lb); diff --git a/Code/thermal_printer/printer.c b/Code/thermal_printer/printer.c index 438636f..dda7f51 100644 --- a/Code/thermal_printer/printer.c +++ b/Code/thermal_printer/printer.c @@ -1,14 +1,13 @@ +#include +#include +#include #include #include -#include #include -#include -#include #include #include - #include "config.h" #include "utils.h" @@ -18,7 +17,7 @@ extern FONT current_font; extern SerialCache ser_cache; -uint16_t STBx[] = {STB1_PIN,STB2_PIN,STB3_PIN,STB4_PIN,STB5_PIN,STB6_PIN}; +uint16_t STBx[] = {STB1_PIN, STB2_PIN, STB3_PIN, STB4_PIN, STB5_PIN, STB6_PIN}; uint8_t as; static unsigned int printer_vps_time; @@ -27,333 +26,311 @@ static uint8_t printer_temp_check; static char adc_file_path[128]; - -void printer_send_data8(uint8_t w) -{ +void printer_send_data8(uint8_t w) { /* - digitalWrite(SPI1_NSS_PIN, LOW); // manually take CSN low for SPI_1 transmission - SPI.transfer(w); //Send the HEX data 0x55 over SPI-1 port and store the received byte to the variable. + digitalWrite(SPI1_NSS_PIN, LOW); // manually take CSN low for SPI_1 + transmission SPI.transfer(w); //Send the HEX data 0x55 over SPI-1 port and + store the received byte to the variable. //SPI.transfer16(w); - digitalWrite(SPI1_NSS_PIN, HIGH); // manually take CSN high between spi transmissions + digitalWrite(SPI1_NSS_PIN, HIGH); // manually take CSN high between spi + transmissions */ - wiringPiSPIDataRW (0, &w, 1); - + wiringPiSPIDataRW(0, &w, 1); } +void clear_printer_buffer() { + uint8_t i = 0; + + for (i = 0; i < 48; i++) + printer_send_data8(0x00); -void clear_printer_buffer() -{ - uint8_t i= 0; - - for(i=0;i<48;i++) - printer_send_data8(0x00); - LATCH_ENABLE; delayus(1); LATCH_DISABLE; delayus(1); } - -uint8_t IsPaper() -{ +uint8_t IsPaper() { uint8_t status; uint8_t tmp; return IS_PAPER; - - if( millis() - printer_vps_time > 10) { + + if (millis() - printer_vps_time > 10) { ENABLE_PEM; - if(ASK4PAPER==LOW) // * LOW is what we want** - {status = IS_PAPER;} - else - {status = NO_PAPER; PRINTF("Error:NO PAPER\n"); } + if (ASK4PAPER == LOW) // * LOW is what we want** + { + status = IS_PAPER; + } else { + status = NO_PAPER; + PRINTF("Error:NO PAPER\n"); + } DISABLE_PEM; - if(printer_temp_check > 20) { + if (printer_temp_check > 20) { tmp = temperature(); - - if (tmp >= HOT){ + + if (tmp >= HOT) { PRINTF("Printer too Hot\n"); status |= HOT_PRINTER; } - printer_temp_check = 0; + printer_temp_check = 0; - }else { - printer_temp_check++; + } else { + printer_temp_check++; } - }else { + } else { status = printer_vps_last_status; } - - + printer_vps_last_status = status; printer_vps_time = millis(); - + return status; } - uint8_t header_init() { - - uint8_t pin[] = {THERMISTORPIN}; - - uint8_t x; - pinMode(LATCH_PIN,OUTPUT); - for(x=0; x < STB_NUMBER; x++){ - pinMode(STBx[x],OUTPUT); - digitalWrite(STBx[x],LOW); + uint8_t pin[] = {THERMISTORPIN}; + + uint8_t x; + pinMode(LATCH_PIN, OUTPUT); + + for (x = 0; x < STB_NUMBER; x++) { + pinMode(STBx[x], OUTPUT); + digitalWrite(STBx[x], LOW); } - + LATCH_DISABLE; - pinMode(VH_PIN,OUTPUT); - digitalWrite(VH_PIN,LOW); + pinMode(VH_PIN, OUTPUT); + digitalWrite(VH_PIN, LOW); - pinMode(PEM_PIN,INPUT); - //pinMode(PEM_CTL_PIN,OUTPUT); + pinMode(PEM_PIN, INPUT); + // pinMode(PEM_CTL_PIN,OUTPUT); + + // adc.setChannels(pin, 1); //this is actually the pin you want to measure + + pinMode(THERMISTORPIN, INPUT); // 数字io没有 模拟接口。adc 读温度暂时不搞 - - //adc.setChannels(pin, 1); //this is actually the pin you want to measure - - pinMode(THERMISTORPIN,INPUT); // 数字io没有 模拟接口。adc 读温度暂时不搞 - /* //SPI.begin(); //Initialize the SPI_1 port. SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order SPI.setDataMode(SPI_MODE0); //Set the SPI_1 data mode 0 - SPI.setClockDivider(SPI_CLOCK_DIV16); // Slow speed (72 / 16 = 4.5 MHz SPI_1 speed) - SPI.setDataSize(DATA_SIZE_8BIT); - SPI.begin(); //Initialize the SPI_1 port. + SPI.setClockDivider(SPI_CLOCK_DIV16); // Slow speed (72 / 16 = 4.5 MHz + SPI_1 speed) SPI.setDataSize(DATA_SIZE_8BIT); SPI.begin(); //Initialize the + SPI_1 port. */ - if (!wiringPiSPISetup (0, 4500000 )) { - PRINTF("SPI init failed,exiting...\n"); + if (!wiringPiSPISetup(0, 4500000)) { + PRINTF("SPI init failed,exiting...\n"); } - + /* - pinMode(SPI1_NSS_PIN, OUTPUT); + pinMode(SPI1_NSS_PIN, OUTPUT); digitalWrite(SPI1_NSS_PIN,HIGH); */ - + printer_vps_time = 0; printer_vps_last_status = IS_PAPER; - printer_temp_check= 0; + printer_temp_check = 0; glob_file(ADC_FILE_PAT); - } - #if 1 -uint8_t current_pos = 1; +uint8_t current_pos = 1; uint8_t header_init1() { - - pinMode(PA_PIN,OUTPUT); - pinMode(PNA_PIN,OUTPUT); - pinMode(PB_PIN,OUTPUT); - pinMode(PNB_PIN,OUTPUT); + + pinMode(PA_PIN, OUTPUT); + pinMode(PNA_PIN, OUTPUT); + pinMode(PB_PIN, OUTPUT); + pinMode(PNB_PIN, OUTPUT); as = 0; return ASK4PAPER; } -void motor_stepper_pos2(uint8_t position)//forward +void motor_stepper_pos2(uint8_t position) // forward { -// position = 9 - position; -// position = (position+1)/2; + // position = 9 - position; + // position = (position+1)/2; delayMicroseconds(6700); - switch(position){ - case 0: - digitalWrite(PA_PIN,LOW); - digitalWrite(PNA_PIN,LOW); - digitalWrite(PB_PIN,LOW); - digitalWrite(PNB_PIN,LOW); - break; - case 1: - digitalWrite(PA_PIN,HIGH); - digitalWrite(PNA_PIN,LOW); - digitalWrite(PB_PIN,LOW); - digitalWrite(PNB_PIN,HIGH); - break; - case 2: - digitalWrite(PA_PIN,HIGH); - digitalWrite(PNA_PIN,LOW); - digitalWrite(PB_PIN,HIGH); - digitalWrite(PNB_PIN,LOW); + switch (position) { + case 0: + digitalWrite(PA_PIN, LOW); + digitalWrite(PNA_PIN, LOW); + digitalWrite(PB_PIN, LOW); + digitalWrite(PNB_PIN, LOW); break; - case 3: - digitalWrite(PA_PIN,LOW); - digitalWrite(PNA_PIN,HIGH); - digitalWrite(PB_PIN,HIGH); - digitalWrite(PNB_PIN,LOW); + case 1: + digitalWrite(PA_PIN, HIGH); + digitalWrite(PNA_PIN, LOW); + digitalWrite(PB_PIN, LOW); + digitalWrite(PNB_PIN, HIGH); break; - case 4: - digitalWrite(PA_PIN,LOW); - digitalWrite(PNA_PIN,HIGH); - digitalWrite(PB_PIN,LOW); - digitalWrite(PNB_PIN,HIGH); + case 2: + digitalWrite(PA_PIN, HIGH); + digitalWrite(PNA_PIN, LOW); + digitalWrite(PB_PIN, HIGH); + digitalWrite(PNB_PIN, LOW); + break; + case 3: + digitalWrite(PA_PIN, LOW); + digitalWrite(PNA_PIN, HIGH); + digitalWrite(PB_PIN, HIGH); + digitalWrite(PNB_PIN, LOW); + break; + case 4: + digitalWrite(PA_PIN, LOW); + digitalWrite(PNA_PIN, HIGH); + digitalWrite(PB_PIN, LOW); + digitalWrite(PNB_PIN, HIGH); break; - } } -uint8_t feed_pitch1(uint64_t lines, uint8_t forward_backward) -{ +uint8_t feed_pitch1(uint64_t lines, uint8_t forward_backward) { uint8_t pos = current_pos; - uint8_t restor = ~forward_backward; - + uint8_t restor = ~forward_backward; + restor &= 0x01; - - if(lines>0) - { + + if (lines > 0) { MOTOR_ENABLE1; MOTOR_ENABLE2; ENABLE_VH; - while(lines>0) - { - motor_stepper_pos2(pos); /* 0.0625mm */ - - if(pos >= 1 && pos <= 4) - pos = pos + (1 - 2*forward_backward); // adding or subtracting - if(pos < 1 || pos > 4) - pos = pos + (4 - 8*restor); // restoring pos + while (lines > 0) { + motor_stepper_pos2(pos); /* 0.0625mm */ + + if (pos >= 1 && pos <= 4) + pos = pos + (1 - 2 * forward_backward); // adding or subtracting + if (pos < 1 || pos > 4) + pos = pos + (4 - 8 * restor); // restoring pos lines--; } MOTOR_DISABLE1; MOTOR_DISABLE2; DISABLE_VH; - - } - else - { + + } else { return ERROR_FEED_PITCH; } current_pos = pos; return 0; - } -void print_dots_8bit_split(CONFIG*cfg,uint8_t *Array, uint8_t characters) -{ - uint8_t i=0,y=0, MAX=MAXPIXELS; +void print_dots_8bit_split(CONFIG *cfg, uint8_t *Array, uint8_t characters) { + uint8_t i = 0, y = 0, MAX = MAXPIXELS; uint8_t blank; uint16_t pts; uint8_t temp[MAXPIXELS]; uint8_t _array[MAXPIXELS]; pts = 0; - memcpy(_array,Array,MAXPIXELS); - - while( (i< characters) && (i < MAX)) { + memcpy(_array, Array, MAXPIXELS); + + while ((i < characters) && (i < MAX)) { pts = pts + bits_number(Array[i]); - - if(pts > cfg->max_pts) { - memset(temp,0,MAXPIXELS); - memcpy(temp,_array,i); - print_dots_8bit(cfg,temp,characters,0); + + if (pts > cfg->max_pts) { + memset(temp, 0, MAXPIXELS); + memcpy(temp, _array, i); + print_dots_8bit(cfg, temp, characters, 0); pts = bits_number(_array[i]); - memset(_array,0,i); - }else if(pts==cfg->max_pts) { - memset(temp,0,MAXPIXELS); - memcpy(temp,_array,i+1); - print_dots_8bit(cfg,temp,characters,0); - pts=0; - memset(_array,0,i+1); + memset(_array, 0, i); + } else if (pts == cfg->max_pts) { + memset(temp, 0, MAXPIXELS); + memcpy(temp, _array, i + 1); + print_dots_8bit(cfg, temp, characters, 0); + pts = 0; + memset(_array, 0, i + 1); } i++; } - if(pts >0){ - print_dots_8bit(cfg,_array,characters,0); + if (pts > 0) { + print_dots_8bit(cfg, _array, characters, 0); pts = 0; } - feed_pitch1(cfg->feed_pitch,cfg->orient); + feed_pitch1(cfg->feed_pitch, cfg->orient); return; } -void print_dots_8bit(CONFIG*cfg,uint8_t *Array, uint8_t characters,uint8_t feed_num) -{ - uint8_t i=0,y=0, MAX=MAXPIXELS; +void print_dots_8bit(CONFIG *cfg, uint8_t *Array, uint8_t characters, + uint8_t feed_num) { + uint8_t i = 0, y = 0, MAX = MAXPIXELS; uint8_t blank; - - ENABLE_VH; - if(cfg->align == 0) { - while((ialign==1){// center - blank = 0; - blank = (MAX-characters)/2; - - for(i=0;ialign==2){ - blank = MAX-characters; - for(i=0;idensity*46); - digitalWrite(STBx[y],LOW); - delayus(14); - i++; - } - - y++; - } + if (cfg->align == 0) { + while ((i < characters) && (i < MAX)) { + printer_send_data8(Array[i]); + i++; + } + while (i < MAX) { + printer_send_data8(0x00); + i++; + } + } else if (cfg->align == 1) { // center + blank = 0; + blank = (MAX - characters) / 2; + for (i = 0; i < blank; i++) { + printer_send_data8(0x00); + } + for (i = 0; i < characters; i++) { + printer_send_data8(Array[i]); + } + for (i = 0; i < (MAX - characters - blank); i++) { + printer_send_data8(0x00); + } + } else if (cfg->align == 2) { + blank = MAX - characters; + for (i = 0; i < blank; i++) { + printer_send_data8(0x00); + } + for (i = 0; i < characters; i++) { + printer_send_data8(Array[i]); + } + } - feed_pitch1(feed_num,cfg->orient); + LATCH_ENABLE; + delayus(1); + LATCH_DISABLE; + delayMicroseconds(1); - - DISABLE_VH; + i = 0; - return; + while (y < STB_NUMBER) { + + while (i < 10) { + + digitalWrite(STBx[y], HIGH); + delayus(HEAT_TIME + cfg->density * 46); + digitalWrite(STBx[y], LOW); + delayus(14); + i++; + } + + y++; + } + + feed_pitch1(feed_num, cfg->orient); + + DISABLE_VH; + + return; } -uint16_t read_adc(char*adc_file) { +uint16_t read_adc(char *adc_file) { long ret; char c[16]; FILE *fptr; @@ -363,217 +340,239 @@ uint16_t read_adc(char*adc_file) { return 0; } fscanf(fptr, "%[^\n]", c); - //printf("Data from the file:\n%s", c); + // printf("Data from the file:\n%s", c); fclose(fptr); ret = strtol(c, NULL, 10); - //printf("the number ret %d\n",ret); + // printf("the number ret %d\n",ret); return (uint16_t)ret; } - uint16_t temperature() { - - + double Rthermistor = 0, TempThermistor = 0; - uint16_t ADCSamples=0; + uint16_t ADCSamples = 0; int Sample = 1; uint16_t ADCConvertedValue; - - while(Sample<=NumSamples) - { - //ADCSamples += analogRead(THERMISTORPIN); //stm32 - ADCSamples += read_adc(adc_file_path); - Sample++; + while (Sample <= NumSamples) { + // ADCSamples += analogRead(THERMISTORPIN); //stm32 + ADCSamples += read_adc(adc_file_path); + Sample++; } - //Thermistor Resistance at x Kelvin - ADCConvertedValue = (double)ADCSamples/NumSamples; - Rthermistor = ( (double)ADCResolution/ ADCConvertedValue) - 1; - Rthermistor = (double)SeriesResistor/Rthermistor; - //Thermistor temperature in Kelvin - TempThermistor = Rthermistor / RthNominal ; - TempThermistor = log(TempThermistor); + // Thermistor Resistance at x Kelvin + ADCConvertedValue = (double)ADCSamples / NumSamples; + Rthermistor = ((double)ADCResolution / ADCConvertedValue) - 1; + Rthermistor = (double)SeriesResistor / Rthermistor; + // Thermistor temperature in Kelvin + TempThermistor = Rthermistor / RthNominal; + TempThermistor = log(TempThermistor); TempThermistor /= BCoefficent; - TempThermistor += (1/(TempNominal + 273.15)); - TempThermistor = 1/TempThermistor; + TempThermistor += (1 / (TempNominal + 273.15)); + TempThermistor = 1 / TempThermistor; - return (uint16_t)(TempThermistor - 273.15); - - - //return (uint16_t)(0); + return (uint16_t)(TempThermistor - 273.15); + + // return (uint16_t)(0); } -int glob_file(char*av) { +int glob_file(char *av) { glob_t globlist; - if (glob(av, GLOB_PERIOD|GLOB_NOSORT, NULL, &globlist) == GLOB_NOSPACE || glob(av, GLOB_PERIOD|GLOB_NOSORT, NULL, &globlist) == GLOB_NOMATCH) + if (glob(av, GLOB_PERIOD | GLOB_NOSORT, NULL, &globlist) == GLOB_NOSPACE || + glob(av, GLOB_PERIOD | GLOB_NOSORT, NULL, &globlist) == GLOB_NOMATCH) return -1; - if (glob(av, GLOB_PERIOD|GLOB_NOSORT, NULL, &globlist) == GLOB_ABORTED) + if (glob(av, GLOB_PERIOD | GLOB_NOSORT, NULL, &globlist) == GLOB_ABORTED) return 1; - if(globlist.gl_pathc > 0) { - strcpy(adc_file_path,globlist.gl_pathv[0]); + if (globlist.gl_pathc > 0) { + strcpy(adc_file_path, globlist.gl_pathv[0]); } return 0; - } #endif -uint16_t get_serial_cache_font_width(CONFIG*cfg) { - +uint16_t get_serial_cache_font_width(CONFIG *cfg) { + int i; uint8_t *ch; uint32_t codename; int w; w = 0; i = 0; - while( i face, codename); - FT_Load_Glyph ( cfg->face, gi, FT_LOAD_NO_BITMAP); - w += cfg->face->glyph->metrics.horiAdvance / 64; - i++; + while (i < ser_cache.idx) { + ch = (uint8_t *)&ser_cache.data[i]; + codename = utf8_to_utf32(ch); + FT_UInt gi = FT_Get_Char_Index(cfg->face, codename); + FT_Load_Glyph(cfg->face, gi, FT_LOAD_NO_BITMAP); + w += cfg->face->glyph->metrics.horiAdvance / 64; + i++; } - return w+cfg->font->width; + return w + cfg->font->width; } -//print with freetype font dots glyph -uint8_t print_lines_ft(CONFIG*cfg) { - uint8_t i,j,k; +// print with freetype font dots glyph +uint8_t print_lines_ft(CONFIG *cfg) { + uint8_t i, j, k; int8_t w; uint8_t dot_line_data[MAXPIXELS]; - uint8_t dot_line_idx=0; - uint8_t dot_line_bitsidx=0; - - uint8_t lastidx,lastw,lastj; - uint8_t row,row_cnt; + uint8_t dot_line_idx = 0; + uint8_t dot_line_bitsidx = 0; + + uint8_t lastidx, lastw, lastj; + uint8_t row, row_cnt; uint16_t line_bits; - - int8_t left = ser_cache.idx; + + int8_t left = ser_cache.idx; uint8_t rv; - - line_bits=cfg->margin.width; - dot_line_idx = line_bits/8; - dot_line_bitsidx = line_bits%8; - + + line_bits = cfg->margin.width; + dot_line_idx = line_bits / 8; + dot_line_bitsidx = line_bits % 8; + lastidx = 0; lastw = 0; lastj = 0; uint32_t codename; uint8_t *ch; - printf("left = %d\n",left); - int line_height = (cfg->face->size->metrics.ascender - cfg->face->size->metrics.descender) >> 6; - int baseline_height = abs(cfg->face->descender) * current_font.height / cfg->face->units_per_EM; - int dpx = 64; - while( left>0 ) { + printf("left = %d\n", left); + int line_height = (cfg->face->size->metrics.ascender - + cfg->face->size->metrics.descender) >> + 6; + int baseline_height = + abs(cfg->face->descender) * current_font.height / cfg->face->units_per_EM; + int dpx = 64; + FT_Matrix matrix; + + while (left > 0) { i = lastidx; row_cnt = 0; row = 0; - while(row< line_height ){ - line_bits=cfg->margin.width; - dot_line_idx = line_bits/8; - dot_line_bitsidx = line_bits%8; - memset(dot_line_data,0,MAXPIXELS); - //line by line bitmap dots to print + while (row < line_height) { + line_bits = cfg->margin.width; + dot_line_idx = line_bits / 8; + dot_line_bitsidx = line_bits % 8; + memset(dot_line_data, 0, MAXPIXELS); + // line by line bitmap dots to print i = lastidx; - - while( i face, codename); - FT_Load_Glyph (cfg->face, gi, FT_LOAD_DEFAULT); - int y_off = line_height - baseline_height - cfg->face->glyph->metrics.horiBearingY / dpx; - int glyph_width = cfg->face->glyph->metrics.width / dpx; + + matrix.xx = (FT_Fixed)(cos(((double)cfg->degree / 360) * 3.14159 * 2) * + 0x10000L); + matrix.xy = (FT_Fixed)(-sin(((double)cfg->degree / 360) * 3.14159 * 2) * + 0x10000L); + matrix.yx = (FT_Fixed)(sin(((double)cfg->degree / 360) * 3.14159 * 2) * + 0x10000L); + matrix.yy = (FT_Fixed)(cos(((double)cfg->degree / 360) * 3.14159 * 2) * + 0x10000L); + FT_Set_Transform(cfg->face, &matrix, NULL); + + FT_UInt gi = FT_Get_Char_Index(cfg->face, codename); + FT_Load_Glyph(cfg->face, gi, FT_LOAD_DEFAULT); + int y_off = line_height - baseline_height - + cfg->face->glyph->metrics.horiBearingY / dpx; + int glyph_width = cfg->face->glyph->metrics.width / dpx; int glyph_height = cfg->face->glyph->metrics.height / dpx; int advance = cfg->face->glyph->metrics.horiAdvance / dpx; - int x_off = (advance - glyph_width) / 2; + int x_off = (advance - glyph_width) / 2; - int bitmap_rows = cfg->face->glyph->bitmap.rows; - int bitmap_width = cfg->face->glyph->bitmap.width; - //FT_Render_Glyph(cfg->face->glyph, FT_RENDER_MODE_NORMAL); - FT_Render_Glyph(cfg->face->glyph, FT_RENDER_MODE_MONO); //disable AA - - j = 0; w= 0; - if(lastj !=0){j= lastj;} - if(lastw !=0) { w = lastw;} - while(w < advance ) { - //if(w > 0 && (w%8) == 0) j++; - if(dot_line_bitsidx > 7 ){ + int bitmap_rows = cfg->face->glyph->bitmap.rows; + int bitmap_width = cfg->face->glyph->bitmap.width; + // FT_Render_Glyph(cfg->face->glyph, FT_RENDER_MODE_NORMAL); + FT_Render_Glyph(cfg->face->glyph, FT_RENDER_MODE_MONO); // disable AA + + j = 0; + w = 0; + if (lastj != 0) { + j = lastj; + } + if (lastw != 0) { + w = lastw; + } + while (w < advance) { + // if(w > 0 && (w%8) == 0) j++; + if (dot_line_bitsidx > 7) { dot_line_idx++; - dot_line_bitsidx=0; + dot_line_bitsidx = 0; } - - //unsigned char p = cfg->face->glyph->bitmap.buffer[row * cfg->face->glyph->bitmap.pitch + w]; - unsigned char p = 0; - int pitch = abs(cfg->face->glyph->bitmap.pitch); - - if( w>= x_off && row >= y_off ) { - row_cnt = row-y_off; - if(row_cnt < bitmap_rows) { - //p = (cfg->face->glyph->bitmap.buffer[row_cnt*cfg->face->glyph->bitmap.pitch+j] >> (7-w%8)) & 1;//disable AA - j = (w-x_off)/8; - p = cfg->face->glyph->bitmap.buffer[row_cnt*pitch+j]; - p = p & (128 >> ((w-x_off)&7)); - } - } - if(p) { - printf("#"); - dot_line_data[dot_line_idx ] |= 1<<(7-dot_line_bitsidx); - }else { - printf("0"); - } + // unsigned char p = cfg->face->glyph->bitmap.buffer[row * + // cfg->face->glyph->bitmap.pitch + w]; + unsigned char p = 0; + int pitch = abs(cfg->face->glyph->bitmap.pitch); + + if (w >= x_off && row >= y_off) { + row_cnt = row - y_off; + if (row_cnt < bitmap_rows) { + // p = + // (cfg->face->glyph->bitmap.buffer[row_cnt*cfg->face->glyph->bitmap.pitch+j] + // >> (7-w%8)) & 1;//disable AA + j = (w - x_off) / 8; + p = cfg->face->glyph->bitmap.buffer[row_cnt * pitch + j]; + p = p & (128 >> ((w - x_off) & 7)); + } + } + + if (p) { + printf("#"); + dot_line_data[dot_line_idx] |= 1 << (7 - dot_line_bitsidx); + } else { + printf("0"); + } dot_line_bitsidx++; w++; line_bits++; - if(line_bits >= MAX_DOTS) break; + if (line_bits >= MAX_DOTS) + break; } - //word gap + // word gap k = 0; - while(k < cfg->wordgap) { - if(dot_line_bitsidx>7){ + while (k < cfg->wordgap) { + if (dot_line_bitsidx > 7) { dot_line_idx++; - dot_line_bitsidx=0; + dot_line_bitsidx = 0; } k++; dot_line_bitsidx++; line_bits++; - if(line_bits >= MAX_DOTS)break; + if (line_bits >= MAX_DOTS) + break; } - - if(line_bits < MAX_DOTS){ + + if (line_bits < MAX_DOTS) { i++; } - - if(line_bits >= MAX_DOTS || i >=ser_cache.idx){ - - if(row == (line_height-1)) {// last of the row loop - if(w >= advance ){ - lastidx = i+1; - lastw =0; - lastj =0; - }else { + + if (line_bits >= MAX_DOTS || i >= ser_cache.idx) { + + if (row == (line_height - 1)) { // last of the row loop + if (w >= advance) { + lastidx = i + 1; + lastw = 0; + lastj = 0; + } else { lastidx = i; lastw = w; lastj = j; } } - + break; } } rv = IsPaper(); - if( rv == IS_PAPER) { - //DEBUG("dot_line_idx",dot_line_idx); - //DEBUG("dot_line_bits",dot_line_bitsidx); - print_dots_8bit_split(cfg,dot_line_data,dot_line_idx+1); + if (rv == IS_PAPER) { + // DEBUG("dot_line_idx",dot_line_idx); + // DEBUG("dot_line_bits",dot_line_bitsidx); + print_dots_8bit_split(cfg, dot_line_data, dot_line_idx + 1); } row++; printf("\n"); @@ -586,223 +585,221 @@ uint8_t print_lines_ft(CONFIG*cfg) { } */ } - } +uint8_t print_lines8(CONFIG *cfg) { -uint8_t print_lines8(CONFIG*cfg) { - - if(cfg->font->mode == FONT_MODE_1) { - return print_lines_ft(cfg); + if (cfg->font->mode == FONT_MODE_1) { + return print_lines_ft(cfg); } - uint8_t i,j,k; + uint8_t i, j, k; int8_t w; uint8_t *data; - uint8_t row,pad; + uint8_t row, pad; uint16_t addr; - - uint16_t line_bits; - - uint8_t dot_line_data[MAXPIXELS]; - uint8_t dot_line_idx=0; - uint8_t dot_line_bitsidx=0; - uint8_t lastidx,lastw,lastj; + uint16_t line_bits; + + uint8_t dot_line_data[MAXPIXELS]; + uint8_t dot_line_idx = 0; + uint8_t dot_line_bitsidx = 0; + + uint8_t lastidx, lastw, lastj; int8_t left; uint8_t rv; - - pad = current_font.width %BITS8; - - if(pad > 0){ + pad = current_font.width % BITS8; + + if (pad > 0) { pad = 1; } i = 0; - i = current_font.width/BITS8; - - pad = i+pad; - + i = current_font.width / BITS8; + + pad = i + pad; + row = 0; rv = IsPaper(); - - data = (uint8_t*)malloc(sizeof(uint8_t)*(pad+1)); - i=0; - - line_bits=cfg->margin.width; - - dot_line_idx = line_bits/8; - dot_line_bitsidx = line_bits%8; + data = (uint8_t *)malloc(sizeof(uint8_t) * (pad + 1)); + i = 0; + + line_bits = cfg->margin.width; + + dot_line_idx = line_bits / 8; + dot_line_bitsidx = line_bits % 8; left = ser_cache.idx; - lastidx=0; - lastw=0; - lastj=0; + lastidx = 0; + lastw = 0; + lastj = 0; - //DEBUG("left",left); - while(left>0){ + // DEBUG("left",left); + while (left > 0) { i = lastidx; - while(rowmargin.width; - dot_line_idx = line_bits/8; - dot_line_bitsidx = line_bits%8; - memset(dot_line_data,0,MAXPIXELS); + while (row < current_font.height) { + + line_bits = cfg->margin.width; + dot_line_idx = line_bits / 8; + dot_line_bitsidx = line_bits % 8; + memset(dot_line_data, 0, MAXPIXELS); i = lastidx; - //DEBUG("i",i) - //DEBUG("ser_cache.idx",ser_cache.idx) - while( i 0 && ( w%8) == 0)j++; - if(dot_line_bitsidx > 7){ - dot_line_idx++; - dot_line_bitsidx=0; - } - - k = (data[j] >> (7-(w%8))) &1; - //Serial.print(data[j],HEX); - if( k > 0){ - dot_line_data[dot_line_idx] |= 1 << (7-dot_line_bitsidx); - //Serial.print("1"); - } - - dot_line_bitsidx++; - w++; - line_bits++; - if(line_bits >= MAX_DOTS)break; + j = 0; + w = 0; + if (lastj != 0) { + j = lastj; + } + if (lastw != 0) { + w = lastw; + } + + while (w < current_font.width) { + if (w > 0 && (w % 8) == 0) + j++; + if (dot_line_bitsidx > 7) { + dot_line_idx++; + dot_line_bitsidx = 0; } - ///word gap - k=0; - while( k < cfg->wordgap ){ - if(dot_line_bitsidx > 7){ - dot_line_idx++; - dot_line_bitsidx=0; - } - - k++; - dot_line_bitsidx++; - line_bits++; - if(line_bits >= MAX_DOTS)break; + k = (data[j] >> (7 - (w % 8))) & 1; + // Serial.print(data[j],HEX); + if (k > 0) { + dot_line_data[dot_line_idx] |= 1 << (7 - dot_line_bitsidx); + // Serial.print("1"); } - - if(line_bits < MAX_DOTS){ + + dot_line_bitsidx++; + w++; + line_bits++; + if (line_bits >= MAX_DOTS) + break; + } + + /// word gap + k = 0; + while (k < cfg->wordgap) { + if (dot_line_bitsidx > 7) { + dot_line_idx++; + dot_line_bitsidx = 0; + } + + k++; + dot_line_bitsidx++; + line_bits++; + if (line_bits >= MAX_DOTS) + break; + } + + if (line_bits < MAX_DOTS) { i++; } - - if(line_bits >= MAX_DOTS || i >=ser_cache.idx){ - - if(row == (current_font.height-1)) {// last of the row loop - if(w >= current_font.width){ - lastidx = i+1; - lastw =0; - lastj =0; - }else { + + if (line_bits >= MAX_DOTS || i >= ser_cache.idx) { + + if (row == (current_font.height - 1)) { // last of the row loop + if (w >= current_font.width) { + lastidx = i + 1; + lastw = 0; + lastj = 0; + } else { lastidx = i; lastw = w; lastj = j; } } - + break; } } rv = IsPaper(); - if( rv == IS_PAPER){ - //DEBUG("dot_line_idx",dot_line_idx); - //DEBUG("dot_line_bits",dot_line_bitsidx); - print_dots_8bit_split(cfg,dot_line_data,dot_line_idx+1); - } + if (rv == IS_PAPER) { + // DEBUG("dot_line_idx",dot_line_idx); + // DEBUG("dot_line_bits",dot_line_bitsidx); + print_dots_8bit_split(cfg, dot_line_data, dot_line_idx + 1); + } row++; } left = left - lastidx; row = 0; - - if(cfg->line_space > cfg->font->height){ - feed_pitch1(cfg->line_space - cfg->font->height,cfg->orient); + + if (cfg->line_space > cfg->font->height) { + feed_pitch1(cfg->line_space - cfg->font->height, cfg->orient); } - } - - //Serial.println("print ever"); + + // Serial.println("print ever"); free(data); return rv; } - -uint8_t print_image8(CONFIG*cfg){ +uint8_t print_image8(CONFIG *cfg) { uint16_t height; - uint16_t x,y,addr; - + uint16_t x, y, addr; + uint8_t rv; uint8_t LinePixels[MAXPIXELS]; - uint8_t maxchars= PRINTER_BITS/8; - height = cfg->img->num / cfg->img->width; - y=0; + uint8_t maxchars = PRINTER_BITS / 8; + height = cfg->img->num / cfg->img->width; + y = 0; addr = 0; - + rv = IsPaper(); - while(y < height ) - { - x=0; - while( x < cfg->img->width ) - { - addr = x+y*cfg->img->width; + while (y < height) { + x = 0; + while (x < cfg->img->width) { + addr = x + y * cfg->img->width; - - if(cfg->img->revert_bits > 0)//LSB + if (cfg->img->revert_bits > 0) // LSB LinePixels[x] = invert_bit(cfg->img->cache[addr]); else LinePixels[x] = cfg->img->cache[addr]; - + x++; } rv = IsPaper(); - if( rv == IS_PAPER) { - print_dots_8bit_split(cfg,LinePixels,x); + if (rv == IS_PAPER) { + print_dots_8bit_split(cfg, LinePixels, x); } - - //feed_pitch1(FEED_PITCH,cfg->orient); + + // feed_pitch1(FEED_PITCH,cfg->orient); y++; } - //feed_pitch1(cfg->feed_pitch,cfg->orient); - cfg->img->need_print= 0; - + // feed_pitch1(cfg->feed_pitch,cfg->orient); + cfg->img->need_print = 0; + cfg->img->num = 0; cfg->img->idx = 0; cfg->img->width = 0; - + return rv; } -void print_cut_line(CONFIG*cfg){ - uint8_t bs,i; +void print_cut_line(CONFIG *cfg) { + uint8_t bs, i; + + bs = PRINTER_BITS / cfg->font->width; + bs -= 1; - bs= PRINTER_BITS/ cfg->font->width; - bs-=1; - reset_cmd(); - - for(i=0;i> 1) | ((a & 0x20) >> 3) | + ((a & 0x40) >> 5) | ((a & 0x80) >> 7); } -uint8_t invert_bit(uint8_t a){ - - return ((a&0x01)<<7)|((a&0x02)<<5)|((a&0x04)<<3)|((a&0x08)<<1)|((a&0x10)>>1)|((a&0x20)>>3)|((a&0x40)>>5)|((a&0x80)>>7); - +uint8_t bits_number(uint8_t n) // count bits "1" +{ + uint8_t count = 0; + while (n) { + count += n & 1; + n >>= 1; + } + return count; } - -uint8_t bits_number(uint8_t n)//count bits "1" -{ - uint8_t count = 0; - while (n) { - count += n & 1; - n >>= 1; - } - return count; -} - - - diff --git a/Code/thermal_printer/utils.h b/Code/thermal_printer/utils.h index 605b11c..42477b6 100644 --- a/Code/thermal_printer/utils.h +++ b/Code/thermal_printer/utils.h @@ -1,19 +1,26 @@ #ifndef UTILS_H #define UTILS_H +#include #include #include -#include #include #include #define SEP printf(" "); // a is string, b is number -#define DEBUG(a,b) printf(a);SEP;printf("%d\n",b); +#define DEBUG(a, b) \ + printf(a); \ + SEP; \ + printf("%d\n", b); #define ALINE printf("\n"); -#define PRINTF(...) { printf(__VA_ARGS__);fflush(stdout);} +#define PRINTF(...) \ + { \ + printf(__VA_ARGS__); \ + fflush(stdout); \ + } void delayus(unsigned int _us); @@ -21,5 +28,4 @@ uint8_t invert_bit(uint8_t a); uint8_t bits_number(uint8_t n); - #endif