mirror of
https://github.com/clockworkpi/DevTerm.git
synced 2026-03-19 10:22:44 +01:00
add schematic pdfs and firmware code
This commit is contained in:
27
Code/thermal_printer/Makefile
Normal file
27
Code/thermal_printer/Makefile
Normal file
@@ -0,0 +1,27 @@
|
||||
CC = gcc
|
||||
|
||||
CFLAGS = -g -Wall
|
||||
LDFLAUS =
|
||||
INCLUDES =
|
||||
LIBS = -lwiringPi
|
||||
|
||||
MAIN = devterm_thermal_printer.elf
|
||||
|
||||
SRCS = printer.c devterm_thermal_printer.c utils.c
|
||||
OBJS = $(SRCS:.c=.o)
|
||||
|
||||
.PHONY: depend clean
|
||||
|
||||
all: $(MAIN)
|
||||
@echo compile $(MAIN)
|
||||
|
||||
$(MAIN): $(OBJS)
|
||||
$(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)
|
||||
|
||||
.c.o:
|
||||
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
|
||||
|
||||
clean:
|
||||
$(RM) *.o *~ $(MAIN)
|
||||
|
||||
|
||||
59
Code/thermal_printer/cmd.h
Normal file
59
Code/thermal_printer/cmd.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#ifndef CMD_H
|
||||
#define CMD_H
|
||||
|
||||
/*
|
||||
|
||||
ESC 2
|
||||
设置行间距为 32 点
|
||||
|
||||
ESC @
|
||||
ESC@命令初始化打印机
|
||||
|
||||
ESC j n
|
||||
打印缓冲区数据并走纸 n 点行
|
||||
|
||||
ESC d n
|
||||
打印缓冲区数据并走纸 n 行
|
||||
|
||||
ESC ! n
|
||||
设置打印字体,n为 0-4
|
||||
|
||||
ESC 3 n
|
||||
设置行间距为 n 点行
|
||||
|
||||
ESC v n
|
||||
向主机传送打印机状态
|
||||
|
||||
ESC a n
|
||||
设置对齐方式,左对齐0,右对齐2,居中对齐1
|
||||
|
||||
ESC - n
|
||||
设置下划线的点高度,n为0-2
|
||||
|
||||
ESC SP n
|
||||
设置字符间距n个点
|
||||
|
||||
DC2 # n
|
||||
n 为打印浓度代码:0-F
|
||||
GS L nL nH
|
||||
|
||||
GS v 0 p wL wH hL hH d1…dk
|
||||
位图打印
|
||||
p: 打印位图格式为0
|
||||
W=wL+wH*256 表示水平宽度字节数
|
||||
H=hL+hH*256 表示垂直高度点数
|
||||
位图使用 MSB 格式,最高位在打印位置的左边,先送的数据在打印位置 的左边。
|
||||
|
||||
LF
|
||||
打印行缓冲器里的内容并向前走纸一行
|
||||
|
||||
DC2 T
|
||||
打印测试页
|
||||
|
||||
GS V \0 or GS V \1
|
||||
切纸,打印一行分割示意条 ,=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
||||
224
Code/thermal_printer/config.h
Normal file
224
Code/thermal_printer/config.h
Normal file
@@ -0,0 +1,224 @@
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
///raspberry pi CM3
|
||||
|
||||
#define BCM_GPIO_28 28
|
||||
#define BCM_GPIO_29 29
|
||||
#define BCM_GPIO_30 30
|
||||
#define BCM_GPIO_31 31
|
||||
#define BCM_GPIO_32 32
|
||||
#define BCM_GPIO_33 33
|
||||
#define BCM_GPIO_34 34
|
||||
#define BCM_GPIO_35 35
|
||||
#define BCM_GPIO_36 36
|
||||
#define BCM_GPIO_37 37
|
||||
#define BCM_GPIO_38 38
|
||||
#define BCM_GPIO_39 39
|
||||
#define BCM_GPIO_40 40
|
||||
#define BCM_GPIO_41 41
|
||||
#define BCM_GPIO_42 42
|
||||
#define BCM_GPIO_43 43
|
||||
#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
|
||||
|
||||
#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 PEM_CTL_PIN BCM_GPIO_32 //3 VPS
|
||||
#define ENABLE_PEM digitalWrite(PEM_CTL_PIN,HIGH)
|
||||
#define DISABLE_PEM digitalWrite(PEM_CTL_PIN,LOW)
|
||||
*/
|
||||
//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
|
||||
// dtparam=spi=on
|
||||
// dtoverlay=spi-gpio35-39
|
||||
// then we can see GPIO38 GPIO39 in ALT0 Mode by `gpio readall`
|
||||
|
||||
#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
|
||||
|
||||
|
||||
#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 //
|
||||
#define PNA_PIN PH2_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 MOTOR_ENABLE1
|
||||
#define MOTOR_ENABLE2
|
||||
|
||||
#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 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 HOT 64
|
||||
|
||||
#define BCoefficent 3950
|
||||
#define RthNominal 30000
|
||||
#define TempNominal 25
|
||||
#define ADCResolution 4096
|
||||
#define SeriesResistor 30000
|
||||
|
||||
#define NumSamples 10
|
||||
|
||||
#define KELVIN 1
|
||||
#define CELSIUS 0
|
||||
|
||||
#define HEAT_TIME 300 // heat time,better not greater than 1000,300-1000 0-f
|
||||
|
||||
#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 Maxdotsperline ((uint16_t)384)
|
||||
#define nextcharactercolum ((uint8_t)Fontrows/8) // = 3
|
||||
#define Maxcharacterperline ((uint16_t)Maxdotsperline/FontColums) // 384/16=24
|
||||
|
||||
|
||||
|
||||
#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 PRINT_STATE 0
|
||||
#define ESC_STATE 1
|
||||
#define GET_IMAGE 2
|
||||
|
||||
|
||||
#define ALIGN_LEFT 0
|
||||
#define ALIGN_CENTER 1
|
||||
#define ALIGN_RIGHT 2
|
||||
|
||||
#define MAX_DOTS 384
|
||||
#define IMAGE_MAX 9224
|
||||
|
||||
#define BITS8 8
|
||||
#define PRINTER_BITS 384
|
||||
#define MAXPIXELS 48
|
||||
|
||||
//extract bits
|
||||
#define LAST(k,n) ((k) & ((1<<(n))-1))
|
||||
#define MID(k,m,n) LAST((k)>>(m),((n)-(m)))
|
||||
|
||||
|
||||
typedef struct _Margin{
|
||||
uint16_t width;
|
||||
uint8_t esgs;
|
||||
}Margin;
|
||||
|
||||
|
||||
typedef struct _FONT {
|
||||
|
||||
uint8_t width;//in bits
|
||||
uint8_t height;
|
||||
const uint8_t *data;
|
||||
}FONT;
|
||||
|
||||
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 cache[IMAGE_MAX]; // 48x192bytes(384x192 pixels) ,max
|
||||
|
||||
}ImageCache;
|
||||
|
||||
typedef struct _CONFIG
|
||||
{
|
||||
uint8_t state;
|
||||
uint8_t line_space;
|
||||
uint8_t align;
|
||||
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
|
||||
|
||||
uint16_t wordgap:10;//1023 max
|
||||
|
||||
Margin margin;
|
||||
FONT*font;
|
||||
ImageCache *img;
|
||||
}CONFIG;
|
||||
|
||||
|
||||
typedef struct _SerialCache{
|
||||
uint8_t idx;
|
||||
uint8_t data[77];//384/5
|
||||
}SerialCache;
|
||||
|
||||
void PrintDots8bit(uint8_t *Array, uint8_t characters,uint8_t feed_num);
|
||||
|
||||
uint8_t invert_bit(uint8_t a);
|
||||
|
||||
#endif
|
||||
704
Code/thermal_printer/devterm_thermal_printer.c
Normal file
704
Code/thermal_printer/devterm_thermal_printer.c
Normal file
@@ -0,0 +1,704 @@
|
||||
// for ltp02-245
|
||||
// 203 dpi, 384dots in 48mm(1.88976inch) every dots == 0.125mm, 1byte==8dots==1mm
|
||||
// make clean && make && ./stm32duino_thermal_printer.bin
|
||||
//#include <SPI.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include "logo.h"
|
||||
|
||||
#include "pcf_5x7-ISO8859-1_5x7.h"
|
||||
#include "pcf_6x12-ISO8859-1_6x12.h"
|
||||
#include "pcf_7x14-ISO8859-1_7x14.h"
|
||||
|
||||
|
||||
#include "ttf_Px437_PS2thin1_8x16.h"
|
||||
#include "ttf_Px437_PS2thin2_8x16.h"
|
||||
|
||||
|
||||
|
||||
#include "config.h"
|
||||
#include "utils.h"
|
||||
#include "printer.h"
|
||||
|
||||
SerialCache ser_cache;
|
||||
|
||||
uint8_t cmd[10];
|
||||
uint8_t cmd_idx;
|
||||
|
||||
uint8_t newline;
|
||||
char buf[2];
|
||||
|
||||
unsigned long time;
|
||||
|
||||
ImageCache img_cache;
|
||||
|
||||
FONT current_font;
|
||||
|
||||
CONFIG g_config;
|
||||
|
||||
|
||||
//void printer_set_font(CONFIG*cfg,uint8_t fnbits);
|
||||
//void parse_serial_stream(CONFIG*cfg,uint8_t input_ch);
|
||||
|
||||
void reset_cmd(){
|
||||
cmd_idx = 0;
|
||||
ser_cache.idx=0;
|
||||
g_config.state = PRINT_STATE;
|
||||
}
|
||||
|
||||
void init_printer(){
|
||||
|
||||
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.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=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_PS2thin1_8x16;
|
||||
|
||||
|
||||
ser_cache.idx=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.orient = FORWARD;
|
||||
|
||||
g_config.wordgap = 0;
|
||||
|
||||
g_config.font = ¤t_font;
|
||||
|
||||
g_config.under_line = 0;
|
||||
|
||||
g_config.state = PRINT_STATE;
|
||||
|
||||
g_config.img = &img_cache;
|
||||
g_config.density = 0;
|
||||
|
||||
g_config.feed_pitch = 2;
|
||||
|
||||
}
|
||||
|
||||
const char url[] ={"Powered by clockworkpi.com"};
|
||||
|
||||
void label_print_f(CONFIG*cfg,char*label,float m,char*last){
|
||||
char buf[48];
|
||||
uint8_t i,j;
|
||||
|
||||
|
||||
if(m == -1.0)
|
||||
sprintf(buf,"%s",last);
|
||||
else
|
||||
sprintf(buf,"%0.2f%s",m,last);
|
||||
|
||||
j = strlen(buf);
|
||||
i = 48-strlen(label)-j-1;
|
||||
|
||||
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);
|
||||
reset_cmd();
|
||||
|
||||
for(i=0;i<strlen(buf);i++){
|
||||
parse_serial_stream(cfg,buf[i]);
|
||||
}
|
||||
parse_serial_stream(cfg,10);
|
||||
reset_cmd();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void label_print_i(CONFIG*cfg,char*label,int m,char*last){
|
||||
char buf[48];
|
||||
uint8_t i,j;
|
||||
|
||||
if(m == -1)
|
||||
sprintf(buf,"%s",last);
|
||||
else
|
||||
sprintf(buf,"%d%s",m,last);
|
||||
|
||||
j = strlen(buf);
|
||||
i = 48-strlen(label)-j-1;
|
||||
|
||||
if(m == -1)
|
||||
sprintf(buf,"%s%*s%s",label,i,"",last);
|
||||
else
|
||||
sprintf(buf,"%s%*s%d%s",label,i,"",m,last);
|
||||
|
||||
printer_set_font(cfg,4);
|
||||
reset_cmd();
|
||||
|
||||
for(i=0;i<strlen(buf);i++){
|
||||
parse_serial_stream(cfg,buf[i]);
|
||||
}
|
||||
parse_serial_stream(cfg,10);
|
||||
reset_cmd();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void printer_test(CONFIG*cfg){
|
||||
|
||||
uint8_t i,j;
|
||||
uint8_t ch;
|
||||
uint16_t k;
|
||||
|
||||
char buf[48];
|
||||
char *font_names[]={"8x16thin_1","5x7_ISO8859_1","6x12_ISO8859_1","7x14_ISO8859_1","8x16thin_2",NULL};
|
||||
|
||||
/*
|
||||
char *selftest1[] = {
|
||||
" _ __ _ _ ",
|
||||
" ___ ___| |/ _| | |_ ___ ___| |_ ",
|
||||
"/ __|/ _ \\ | |_ | __/ _ \\/ __| __|",
|
||||
"\\__ \\ __/ | _| | || __/\\__ \\ |_ ",
|
||||
"|___/\\___|_|_| \\__\\___||___/\\__|",
|
||||
NULL
|
||||
};
|
||||
*/
|
||||
char *selftest2[] = {
|
||||
" #### ###### # ###### ##### ###### #### #####",
|
||||
"# # # # # # # # ",
|
||||
" #### ##### # ##### # ##### #### # ",
|
||||
" # # # # # # # # ",
|
||||
"# # # # # # # # # # ",
|
||||
" #### ###### ###### # # ###### #### # ",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
cfg->density = 4;
|
||||
|
||||
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->align = ALIGN_CENTER;
|
||||
print_image8(cfg);
|
||||
|
||||
cfg->img->revert_bits=0;
|
||||
cfg->align = ALIGN_LEFT;
|
||||
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;j<strlen(selftest1[i]);j++){
|
||||
parse_serial_stream(cfg,selftest1[i][j]);
|
||||
}
|
||||
parse_serial_stream(cfg,10);
|
||||
}
|
||||
*/
|
||||
|
||||
for(i=0;i<6;i++){
|
||||
printer_set_font(cfg,1);
|
||||
reset_cmd();
|
||||
|
||||
for(j=0;j<strlen(selftest2[i]);j++){
|
||||
parse_serial_stream(cfg,selftest2[i][j]);
|
||||
}
|
||||
parse_serial_stream(cfg,10);
|
||||
}
|
||||
cfg->align = ALIGN_LEFT;
|
||||
|
||||
feed_pitch1(32,cfg->orient);
|
||||
|
||||
//---------------------------------------------
|
||||
|
||||
for(i=1;i<4;i++){
|
||||
printer_set_font(cfg,0);
|
||||
reset_cmd();
|
||||
for(j=0;j<strlen(font_names[i]);j++){
|
||||
|
||||
parse_serial_stream(cfg,font_names[i][j]);
|
||||
}
|
||||
parse_serial_stream(cfg,10);
|
||||
|
||||
printer_set_font(cfg,i);
|
||||
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(48,cfg->orient);
|
||||
}
|
||||
|
||||
|
||||
printer_set_font(cfg,0);
|
||||
reset_cmd();
|
||||
for(j=0;j<strlen(font_names[0]);j++){
|
||||
parse_serial_stream(cfg,font_names[0][j]);
|
||||
}
|
||||
parse_serial_stream(cfg,10);
|
||||
|
||||
printer_set_font(cfg,0);
|
||||
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(48,cfg->orient);
|
||||
|
||||
|
||||
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(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,"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_f(cfg,"Firmware version:",0.1,"");
|
||||
|
||||
feed_pitch1(cfg->font->height,cfg->orient);
|
||||
//--------------------------------------------------------------
|
||||
printer_set_font(cfg,0);
|
||||
reset_cmd();
|
||||
|
||||
//Serial.println(strlen(url),DEC);
|
||||
for(i=0;i<strlen(url);i++){
|
||||
parse_serial_stream(cfg,url[i]);
|
||||
|
||||
}
|
||||
parse_serial_stream(cfg,10);
|
||||
reset_cmd();
|
||||
|
||||
|
||||
//-----------------------------------
|
||||
//grid
|
||||
|
||||
for(ch = 0;ch <16;ch++){
|
||||
if(ch%2==0)
|
||||
j = 0xff;
|
||||
else
|
||||
j = 0x00;
|
||||
|
||||
for(k=0;k<8;k++){
|
||||
for(i=0;i<48;i++){
|
||||
if(i % 2==0) {
|
||||
buf[i]=j;
|
||||
}else{
|
||||
buf[i]=0xff-j;
|
||||
}
|
||||
}
|
||||
print_dots_8bit_split(cfg,(uint8_t*)buf,48);
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------
|
||||
feed_pitch1(cfg->font->height*2,cfg->orient);
|
||||
|
||||
}
|
||||
|
||||
void printer_set_font(CONFIG*cfg,uint8_t fnbits){
|
||||
uint8_t ret;
|
||||
ret = MID(fnbits,0,3);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
reset_cmd();
|
||||
}
|
||||
|
||||
//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){
|
||||
reset_cmd();
|
||||
printer_test(cfg);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(cmdidx > 2){
|
||||
//ESC j n
|
||||
if(cmd[0] == ASCII_ESC && cmd[1] == 0x4a){
|
||||
|
||||
print_lines8(cfg);
|
||||
feed_pitch1(cmd[2],BACKWARD);
|
||||
reset_cmd();
|
||||
}
|
||||
//ESC d n
|
||||
if(cmd[0] == ASCII_ESC && cmd[1] == 0x64){
|
||||
|
||||
print_lines8(cfg);
|
||||
|
||||
feed_pitch1(cmd[2]*cfg->font->height,BACKWARD);
|
||||
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 ) {
|
||||
ret |= 1 << 2;
|
||||
}
|
||||
|
||||
printf("%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();
|
||||
|
||||
}
|
||||
|
||||
//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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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){
|
||||
cfg->margin.width = k;
|
||||
}
|
||||
|
||||
reset_cmd();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(cmdidx > 4){
|
||||
/*
|
||||
if(cmd[0] == ASCII_ESC && cmd[1] == 0x2a){
|
||||
if( cmd[2] == 0 || cmd[2] == 1){
|
||||
uint16_t k;
|
||||
k = cmd[3] + 256*cmd[4];
|
||||
if(k<= IMAGE_MAX){
|
||||
cfg->state = GET_IMAGE;
|
||||
cfg->img->num = k;
|
||||
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){
|
||||
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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void parse_serial_stream(CONFIG*cfg,uint8_t input_ch){
|
||||
uint16_t a;
|
||||
|
||||
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:
|
||||
ser_cache.data[ser_cache.idx]=input_ch;
|
||||
ser_cache.idx++;
|
||||
|
||||
a = (ser_cache.idx+1)*current_font.width+(ser_cache.idx)*0+ g_config.margin.width;
|
||||
if( a >= MAX_DOTS)
|
||||
{
|
||||
print_lines8(cfg);
|
||||
reset_cmd();
|
||||
}
|
||||
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
|
||||
*/
|
||||
|
||||
#define FIFO_FILE "/tmp/DEVTERM_PRINTER_OUT"
|
||||
|
||||
void loop() {
|
||||
|
||||
/*
|
||||
if (Serial.available() > 0) {
|
||||
// read the incoming byte
|
||||
Serial.readBytes(buf,1);
|
||||
parse_serial_stream(&g_config,buf[0]);
|
||||
}
|
||||
*/
|
||||
|
||||
int fp;
|
||||
char readbuf[2];
|
||||
|
||||
while(1) {
|
||||
fp = -1;
|
||||
fp = open(FIFO_FILE, O_RDONLY, 0666);
|
||||
if (fp != -1) {
|
||||
while(1)
|
||||
{
|
||||
read(fp,readbuf, 1);
|
||||
//printf("read %x",readbuf[0]);
|
||||
parse_serial_stream(&g_config,readbuf[0]);
|
||||
}
|
||||
close(fp);
|
||||
}
|
||||
|
||||
sleep(1);
|
||||
}
|
||||
//------------------------------------------
|
||||
//printer_test(&g_config);
|
||||
|
||||
}
|
||||
|
||||
void setup() {
|
||||
|
||||
wiringPiSetupGpio();
|
||||
header_init();
|
||||
header_init1();
|
||||
|
||||
clear_printer_buffer();
|
||||
|
||||
//Serial.begin(115200);
|
||||
|
||||
init_printer();
|
||||
|
||||
}
|
||||
|
||||
int main(int argc,char**argv) {
|
||||
|
||||
|
||||
setup();
|
||||
loop();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=devterm printer main process
|
||||
After=devterm-socat
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/local/bin/devterm_thermal_printer.elf
|
||||
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=socat as virtual serial port
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=socat -d -d pty,link=/tmp/DEVTERM_PRINTER_OUT,raw,echo=0 pty,link=/tmp/DEVTERM_PRINTER_IN,raw,echo=0
|
||||
ExecStartPost=/usr/local/bin/devterm_socat.sh
|
||||
Restart=on-failure
|
||||
RestartSec=2
|
||||
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
160
Code/thermal_printer/logo.h
Normal file
160
Code/thermal_printer/logo.h
Normal file
@@ -0,0 +1,160 @@
|
||||
#ifndef LOGO_H
|
||||
#define LOGO_H
|
||||
|
||||
#define os120_width 120
|
||||
#define os120_height 120
|
||||
|
||||
const unsigned char os120_bits[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x1f,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
|
||||
0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
|
||||
0x1f, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x80, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x01,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x01, 0x00, 0x00, 0x00,
|
||||
0x80, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xf8, 0x01, 0x00, 0xc0, 0x7f,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff,
|
||||
0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00,
|
||||
0xff, 0xff, 0xff, 0x07, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0,
|
||||
0x1f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xf8, 0x07, 0x00, 0x00,
|
||||
0x00, 0x00, 0xf0, 0x0f, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0,
|
||||
0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00, 0xfe, 0xff, 0xff, 0xff,
|
||||
0xff, 0x01, 0xe0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x07, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfe,
|
||||
0x00, 0xc0, 0xff, 0xff, 0xff, 0x7f, 0xfc, 0x0f, 0x00, 0x7f, 0x00, 0x00,
|
||||
0x00, 0x00, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x3f, 0xf0, 0x1f, 0x00,
|
||||
0xfe, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x3f,
|
||||
0xe0, 0x3f, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0xf8, 0xff,
|
||||
0xff, 0xff, 0x7f, 0x80, 0x7f, 0x00, 0xf8, 0x03, 0x00, 0x00, 0xe0, 0x0f,
|
||||
0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x01, 0x7f, 0x00, 0xf0, 0x07, 0x00,
|
||||
0x00, 0xe0, 0x07, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0x00,
|
||||
0xe0, 0x07, 0x00, 0x00, 0xf0, 0x03, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
|
||||
0x0f, 0xfc, 0x01, 0xc0, 0x0f, 0x00, 0x00, 0xf8, 0x03, 0x00, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x1f, 0xfc, 0x01, 0xc0, 0x1f, 0x00, 0x00, 0xfc, 0x01,
|
||||
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8, 0x03, 0x80, 0x3f, 0x00,
|
||||
0x00, 0xfc, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, 0x07,
|
||||
0x00, 0x3f, 0x00, 0x00, 0x7e, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xf0, 0x07, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0xc0, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x7e, 0x00, 0x00, 0x3f, 0x00,
|
||||
0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0f, 0x00, 0xfc, 0x00,
|
||||
0x00, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
|
||||
0x00, 0xfc, 0x00, 0x80, 0x1f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xef, 0x1f, 0x00, 0xf8, 0x01, 0x80, 0x0f, 0x00, 0xe0, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xc7, 0x1f, 0x00, 0xf0, 0x01, 0xc0, 0x0f, 0x00,
|
||||
0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x1f, 0x00, 0xf0, 0x03,
|
||||
0xc0, 0x07, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x3f,
|
||||
0x00, 0xe0, 0x03, 0xe0, 0x07, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xef, 0x3f, 0x00, 0xe0, 0x07, 0xe0, 0x03, 0x00, 0xf0, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x07, 0xf0, 0x03, 0x00,
|
||||
0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0x0f,
|
||||
0xf0, 0x03, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
|
||||
0x00, 0xc0, 0x0f, 0xf0, 0x01, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x7f, 0x00, 0x80, 0x0f, 0xf8, 0x01, 0x00, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0x1f, 0xf8, 0x01, 0xc0,
|
||||
0x0f, 0xfc, 0xff, 0xff, 0x07, 0x3e, 0x80, 0xff, 0x7f, 0x00, 0x80, 0x1f,
|
||||
0xf8, 0x00, 0xe0, 0x03, 0xf0, 0xff, 0xff, 0x01, 0xf0, 0x00, 0xfc, 0x7f,
|
||||
0x00, 0x00, 0x1f, 0xf8, 0x00, 0xe0, 0x00, 0xc0, 0xf1, 0x7f, 0x00, 0xe0,
|
||||
0x01, 0xf0, 0x7f, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x70, 0xf8, 0x83, 0x03,
|
||||
0x3f, 0xf8, 0xc1, 0x03, 0xc0, 0x7f, 0x00, 0x00, 0x3f, 0x7c, 0x00, 0x38,
|
||||
0xfc, 0x07, 0x07, 0x1c, 0xfe, 0x87, 0x03, 0x80, 0x7f, 0x00, 0x00, 0x3e,
|
||||
0x7c, 0x00, 0x38, 0xfe, 0x0f, 0x07, 0x1c, 0xff, 0x0f, 0x07, 0x00, 0xff,
|
||||
0x00, 0x00, 0x3e, 0x7c, 0x00, 0x1c, 0xf7, 0x1f, 0x0e, 0x0e, 0xfb, 0x1f,
|
||||
0x07, 0x00, 0xff, 0x00, 0x00, 0x3e, 0x7c, 0x00, 0x1c, 0xf3, 0x3f, 0x0e,
|
||||
0x8e, 0xf1, 0x1f, 0x0e, 0x00, 0xfe, 0x00, 0x00, 0x3e, 0x7e, 0x00, 0x8c,
|
||||
0xf3, 0x3f, 0x0c, 0x86, 0xf9, 0x3f, 0x1e, 0x00, 0xfe, 0x00, 0x00, 0x7e,
|
||||
0x7e, 0x00, 0x8c, 0xf9, 0x7f, 0x1c, 0x87, 0xf9, 0x3f, 0xfc, 0xff, 0xff,
|
||||
0x01, 0x00, 0x7e, 0x3e, 0x00, 0x8e, 0xf9, 0x7f, 0x1c, 0xc7, 0xf8, 0x3f,
|
||||
0xfc, 0xff, 0x9f, 0x01, 0x00, 0x7c, 0x3e, 0x00, 0x8e, 0xf9, 0x7f, 0x1c,
|
||||
0xc7, 0xfc, 0x7f, 0x0c, 0x00, 0x80, 0x01, 0x00, 0x7c, 0x3e, 0x00, 0x8e,
|
||||
0xf9, 0x7f, 0x1c, 0xc7, 0xfc, 0x7f, 0x0c, 0x00, 0x80, 0x03, 0x00, 0x7c,
|
||||
0x3e, 0x00, 0x8e, 0xf9, 0x7f, 0x1c, 0xc7, 0xf8, 0x7f, 0x0c, 0x00, 0x80,
|
||||
0x03, 0x00, 0x7c, 0x3e, 0x00, 0x8c, 0xf1, 0x7f, 0x1c, 0x87, 0xf9, 0x7f,
|
||||
0x0c, 0x00, 0x80, 0x01, 0x00, 0x7c, 0x3e, 0x00, 0x8c, 0xf3, 0x7f, 0x1c,
|
||||
0x86, 0xf9, 0x3f, 0x0c, 0x00, 0xc0, 0x01, 0x00, 0x7c, 0x3e, 0x00, 0x1c,
|
||||
0xe3, 0x7f, 0x1c, 0x8e, 0xf1, 0x3f, 0x0c, 0x00, 0xfe, 0x00, 0x00, 0x7c,
|
||||
0x3e, 0x00, 0x1c, 0xc7, 0x3f, 0x0c, 0x0e, 0xe3, 0x3f, 0xfe, 0xff, 0xff,
|
||||
0x00, 0x00, 0x7c, 0x3e, 0x00, 0x38, 0xc6, 0x3f, 0x0e, 0x1e, 0xc6, 0x1f,
|
||||
0xfe, 0x9f, 0xff, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x38, 0xfc, 0x1f, 0x0e,
|
||||
0x1f, 0xce, 0x1f, 0x07, 0xc0, 0xff, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x70,
|
||||
0xf8, 0x0f, 0xc7, 0x3f, 0xf8, 0x8f, 0x07, 0xf0, 0xff, 0x00, 0x00, 0x7c,
|
||||
0x3e, 0x00, 0xf0, 0xf0, 0x87, 0xf3, 0x7f, 0xf0, 0x83, 0x03, 0xfc, 0xff,
|
||||
0x00, 0x00, 0x7c, 0x3e, 0x00, 0xe0, 0x01, 0xc0, 0xff, 0xff, 0x00, 0xe0,
|
||||
0x01, 0xff, 0xff, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0xc0, 0x03, 0xe0, 0xff,
|
||||
0xff, 0x03, 0xf0, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x7c, 0x7e, 0x00, 0x80,
|
||||
0x1f, 0xfc, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7e,
|
||||
0x7e, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x00, 0x00, 0x7e, 0x7c, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x0f, 0xfe, 0xff,
|
||||
0xff, 0xff, 0xff, 0x00, 0x00, 0x3e, 0x7c, 0x00, 0x00, 0xf0, 0xff, 0xff,
|
||||
0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3e, 0x7c, 0x00, 0x00,
|
||||
0xf0, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3e,
|
||||
0x7c, 0x00, 0x00, 0xf0, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
|
||||
0x00, 0x00, 0x3e, 0xfc, 0x00, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0xff,
|
||||
0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0xf0, 0xff, 0x07,
|
||||
0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
|
||||
0xf0, 0xff, 0x01, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1f,
|
||||
0xf8, 0x01, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
|
||||
0x00, 0x80, 0x1f, 0xf8, 0x01, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00,
|
||||
0xfe, 0xff, 0xff, 0x01, 0x80, 0x1f, 0xf0, 0x01, 0x00, 0xf0, 0x1f, 0x00,
|
||||
0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0x80, 0x0f, 0xf0, 0x03, 0x00,
|
||||
0xf8, 0x0f, 0x01, 0x00, 0x00, 0x3c, 0xf8, 0xff, 0xff, 0x01, 0xc0, 0x0f,
|
||||
0xf0, 0x03, 0x00, 0xf8, 0x87, 0x07, 0x00, 0x80, 0x7f, 0xf8, 0xff, 0xff,
|
||||
0x01, 0xc0, 0x0f, 0xe0, 0x03, 0x00, 0xf8, 0xc7, 0x7f, 0x00, 0xf0, 0x7f,
|
||||
0xf8, 0xff, 0xff, 0x03, 0xc0, 0x07, 0xe0, 0x07, 0x00, 0xf8, 0x8f, 0xff,
|
||||
0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x03, 0xe0, 0x07, 0xc0, 0x07, 0x00,
|
||||
0xfc, 0x0f, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x03, 0xe0, 0x03,
|
||||
0xc0, 0x0f, 0x00, 0xfc, 0x1f, 0xfc, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff,
|
||||
0x07, 0xf0, 0x03, 0x80, 0x0f, 0x00, 0xfc, 0x3f, 0xe0, 0xff, 0x3f, 0x00,
|
||||
0x3f, 0xff, 0xff, 0x07, 0xf0, 0x01, 0x80, 0x1f, 0x00, 0xfe, 0x7f, 0x00,
|
||||
0x00, 0x00, 0x80, 0x3f, 0xff, 0xff, 0x0f, 0xf8, 0x01, 0x00, 0x3f, 0x00,
|
||||
0xfe, 0xff, 0x01, 0x00, 0x00, 0xe0, 0x1f, 0xfe, 0xff, 0x0f, 0xfc, 0x00,
|
||||
0x00, 0x3f, 0x00, 0xfe, 0xf3, 0x03, 0x00, 0x00, 0xf8, 0x0f, 0xfe, 0xff,
|
||||
0x1f, 0xfc, 0x00, 0x00, 0x7e, 0x00, 0xff, 0xc3, 0x0f, 0x00, 0x00, 0xff,
|
||||
0x03, 0xfe, 0xff, 0x3f, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0xff, 0x83, 0x1f,
|
||||
0x00, 0x80, 0xff, 0x00, 0xfc, 0xff, 0x3f, 0x7e, 0x00, 0x00, 0xfc, 0x80,
|
||||
0xff, 0x03, 0x3e, 0x00, 0xe0, 0x3f, 0x00, 0xfc, 0xff, 0x7f, 0x3f, 0x00,
|
||||
0x00, 0xfc, 0x81, 0xff, 0x03, 0x7c, 0x00, 0xf0, 0x0f, 0x00, 0xfc, 0xff,
|
||||
0xff, 0x3f, 0x00, 0x00, 0xf8, 0xc3, 0xff, 0x01, 0xf8, 0x01, 0xfc, 0x03,
|
||||
0x00, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf0, 0xe3, 0xff, 0x01, 0xf0,
|
||||
0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xe7,
|
||||
0xff, 0x01, 0xe0, 0xff, 0x7f, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x07, 0x00,
|
||||
0x00, 0xe0, 0xff, 0xff, 0x01, 0xc0, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0xff,
|
||||
0xff, 0x07, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x01, 0x00, 0xff, 0x0f, 0x00,
|
||||
0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00,
|
||||
0xf8, 0x01, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff,
|
||||
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00,
|
||||
0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
|
||||
0x7f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xe0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf0,
|
||||
0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0x00, 0x00,
|
||||
0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
|
||||
0x07, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x80, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x01,
|
||||
0x00, 0x00, 0x00, 0x80, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x80, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0xf8,
|
||||
0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff,
|
||||
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xf8, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
|
||||
#endif
|
||||
2824
Code/thermal_printer/pcf_5x7-ISO8859-1_5x7.h
Normal file
2824
Code/thermal_printer/pcf_5x7-ISO8859-1_5x7.h
Normal file
File diff suppressed because it is too large
Load Diff
4104
Code/thermal_printer/pcf_6x12-ISO8859-1_6x12.h
Normal file
4104
Code/thermal_printer/pcf_6x12-ISO8859-1_6x12.h
Normal file
File diff suppressed because it is too large
Load Diff
4616
Code/thermal_printer/pcf_7x14-ISO8859-1_7x14.h
Normal file
4616
Code/thermal_printer/pcf_7x14-ISO8859-1_7x14.h
Normal file
File diff suppressed because it is too large
Load Diff
570
Code/thermal_printer/printer.c
Normal file
570
Code/thermal_printer/printer.c
Normal file
@@ -0,0 +1,570 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <wiringPiSPI.h>
|
||||
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
#include "printer.h"
|
||||
|
||||
extern FONT current_font;
|
||||
extern SerialCache ser_cache;
|
||||
|
||||
uint16_t STBx[] = {STB1_PIN,STB2_PIN,STB3_PIN,STB4_PIN,STB5_PIN,STB6_PIN};
|
||||
uint8_t as;
|
||||
|
||||
static unsigned int printer_vps_time;
|
||||
static uint8_t printer_vps_last_status;
|
||||
|
||||
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 <data> variable.
|
||||
//SPI.transfer16(w);
|
||||
digitalWrite(SPI1_NSS_PIN, HIGH); // manually take CSN high between spi transmissions
|
||||
*/
|
||||
wiringPiSPIDataRW (0, &w, 1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
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 status;
|
||||
uint8_t tmp;
|
||||
|
||||
if( millis() - printer_vps_time > 10) {
|
||||
ENABLE_PEM;
|
||||
if(ASK4PAPER==HIGH) // * temporary set,LOW is what we want**
|
||||
{status = IS_PAPER;}
|
||||
else
|
||||
{status = NO_PAPER;printf("Error:NO PAPER\n");}
|
||||
DISABLE_PEM;
|
||||
}else {
|
||||
status = printer_vps_last_status;
|
||||
}
|
||||
printer_vps_last_status = status;
|
||||
|
||||
tmp = temperature();
|
||||
if (tmp >= HOT){
|
||||
printf("Printer too Hot\n");
|
||||
status |= HOT_PRINTER;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
LATCH_DISABLE;
|
||||
|
||||
pinMode(VH_PIN,OUTPUT);
|
||||
digitalWrite(VH_PIN,LOW);
|
||||
|
||||
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_ANALOG); // 数字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.
|
||||
*/
|
||||
if (!wiringPiSPISetup (0, 4500000 )) {
|
||||
printf("SPI init failed,exiting...\n");
|
||||
}
|
||||
|
||||
/*
|
||||
pinMode(SPI1_NSS_PIN, OUTPUT);
|
||||
digitalWrite(SPI1_NSS_PIN,HIGH);
|
||||
*/
|
||||
|
||||
printer_vps_time = 0;
|
||||
printer_vps_last_status = IS_PAPER;
|
||||
}
|
||||
|
||||
|
||||
#if 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);
|
||||
|
||||
as = 0;
|
||||
|
||||
return ASK4PAPER;
|
||||
}
|
||||
|
||||
void motor_stepper_pos2(uint8_t position)//forward
|
||||
{
|
||||
// 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);
|
||||
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 pos = current_pos;
|
||||
uint8_t restor = ~forward_backward;
|
||||
|
||||
restor &= 0x01;
|
||||
|
||||
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
|
||||
|
||||
lines--;
|
||||
}
|
||||
MOTOR_DISABLE1;
|
||||
MOTOR_DISABLE2;
|
||||
DISABLE_VH;
|
||||
|
||||
}
|
||||
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=48;
|
||||
uint8_t blank;
|
||||
uint16_t pts;
|
||||
uint8_t temp[48];
|
||||
uint8_t _array[48];
|
||||
pts = 0;
|
||||
memcpy(_array,Array,48);
|
||||
|
||||
while( (i< characters) && (i < MAX)) {
|
||||
|
||||
pts = pts + bits_number(Array[i]);
|
||||
|
||||
if(pts > MAX_PRINT_PTS) {
|
||||
memset(temp,0,48);
|
||||
memcpy(temp,_array,i);
|
||||
print_dots_8bit(cfg,temp,characters,0);
|
||||
pts = bits_number(_array[i]);
|
||||
memset(_array,0,i);
|
||||
}else if(pts==MAX_PRINT_PTS) {
|
||||
memset(temp,0,48);
|
||||
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);
|
||||
pts = 0;
|
||||
}
|
||||
|
||||
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=48;
|
||||
uint8_t blank;
|
||||
|
||||
ENABLE_VH;
|
||||
|
||||
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]);
|
||||
}
|
||||
}
|
||||
|
||||
LATCH_ENABLE;
|
||||
delayus(1);
|
||||
LATCH_DISABLE;
|
||||
delayMicroseconds(1);
|
||||
|
||||
i =0;
|
||||
|
||||
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 temperature() {
|
||||
|
||||
/*
|
||||
double Rthermistor = 0, TempThermistor = 0;
|
||||
uint16 ADCSamples=0;
|
||||
int Sample = 1;
|
||||
uint16_t ADCConvertedValue;
|
||||
|
||||
|
||||
while(Sample<=NumSamples)
|
||||
{
|
||||
ADCSamples += analogRead(THERMISTORPIN);
|
||||
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);
|
||||
TempThermistor /= BCoefficent;
|
||||
TempThermistor += (1/(TempNominal + 273.15));
|
||||
TempThermistor = 1/TempThermistor;
|
||||
|
||||
return (uint16_t)(TempThermistor - 273.15);
|
||||
*/
|
||||
|
||||
return (uint16_t)(0);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
void print_lines8(CONFIG*cfg) {
|
||||
uint8_t i,j,k;
|
||||
int8_t w;
|
||||
uint8_t *data;
|
||||
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;
|
||||
int8_t left;
|
||||
pad = current_font.width %BITS8;
|
||||
|
||||
if(pad > 0){
|
||||
pad = 1;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
i = current_font.width/BITS8;
|
||||
|
||||
pad = i+pad;
|
||||
|
||||
row = 0;
|
||||
|
||||
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;
|
||||
|
||||
//DEBUG("left",left);
|
||||
while(left>0){
|
||||
i = lastidx;
|
||||
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 <ser_cache.idx){
|
||||
addr = pad*ser_cache.data[i]*current_font.height;
|
||||
for(j=0;j<pad;j++){
|
||||
data[j] = current_font.data[addr+row*pad+j];
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
///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 {
|
||||
lastidx = i;
|
||||
lastw = w;
|
||||
lastj = j;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(IsPaper()== 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Serial.println("print ever");
|
||||
|
||||
free(data);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void print_image8(CONFIG*cfg){
|
||||
|
||||
uint16_t height;
|
||||
uint16_t x,y,addr;
|
||||
|
||||
uint8_t LinePixels[MAXPIXELS];
|
||||
|
||||
uint8_t maxchars= PRINTER_BITS/8;
|
||||
height = cfg->img->num / cfg->img->width;
|
||||
y=0;
|
||||
addr = 0;
|
||||
|
||||
while(y < height )
|
||||
{
|
||||
x=0;
|
||||
while( x < cfg->img->width )
|
||||
{
|
||||
addr = x+y*cfg->img->width;
|
||||
|
||||
|
||||
if(cfg->img->revert_bits > 0)//LSB
|
||||
LinePixels[x] = invert_bit(cfg->img->cache[addr]);
|
||||
else
|
||||
LinePixels[x] = cfg->img->cache[addr];
|
||||
|
||||
x++;
|
||||
}
|
||||
|
||||
if(IsPaper()== IS_PAPER) print_dots_8bit_split(cfg,LinePixels,x);
|
||||
|
||||
//feed_pitch1(FEED_PITCH,BACKWARD);
|
||||
y++;
|
||||
}
|
||||
//feed_pitch1(cfg->feed_pitch,cfg->orient);
|
||||
cfg->img->need_print= 0;
|
||||
|
||||
cfg->img->num = 0;
|
||||
cfg->img->idx = 0;
|
||||
cfg->img->width = 0;
|
||||
|
||||
}
|
||||
|
||||
void print_cut_line(CONFIG*cfg){
|
||||
uint8_t bs,i;
|
||||
|
||||
bs= PRINTER_BITS/ cfg->font->width;
|
||||
bs-=1;
|
||||
|
||||
reset_cmd();
|
||||
|
||||
for(i=0;i<bs;i++){
|
||||
if(i%2==0){
|
||||
parse_serial_stream(cfg,'=');
|
||||
}else{
|
||||
parse_serial_stream(cfg,'-');
|
||||
}
|
||||
}
|
||||
parse_serial_stream(cfg,ASCII_FF);
|
||||
|
||||
}
|
||||
43
Code/thermal_printer/printer.h
Normal file
43
Code/thermal_printer/printer.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#ifndef PRINTER_H
|
||||
#define PRINTER_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#define PRINT_SPLIT 6 // max points printed at the same time, 384/PRINT_SPLIT==96
|
||||
#define MAX_PRINT_PTS 24
|
||||
|
||||
void printer_send_data8(uint8_t);
|
||||
|
||||
void clear_printer_buffer();
|
||||
uint8_t IsPaper();
|
||||
|
||||
uint8_t header_init();
|
||||
uint8_t header_init1();
|
||||
|
||||
void motor_stepper_pos1(uint8_t Position);
|
||||
|
||||
void motor_stepper_pos2(uint8_t Position);
|
||||
|
||||
uint8_t feed_pitch1(uint64_t lines, uint8_t forward_backward);
|
||||
|
||||
uint8_t bits_number(uint8_t n);
|
||||
|
||||
void print_dots_8bit_split(CONFIG*cfg,uint8_t *Array, uint8_t characters);
|
||||
|
||||
void print_dots_8bit(CONFIG*cfg,uint8_t *Array, uint8_t characters,uint8_t feed_num);
|
||||
|
||||
uint16_t temperature();
|
||||
|
||||
void print_lines8(CONFIG*);
|
||||
|
||||
uint8_t invert_bit(uint8_t a);
|
||||
|
||||
void print_image8(CONFIG*);
|
||||
void print_cut_line(CONFIG*);
|
||||
|
||||
void printer_set_font(CONFIG*cfg,uint8_t fnbits);
|
||||
void parse_serial_stream(CONFIG*cfg,uint8_t input_ch);
|
||||
|
||||
void reset_cmd();
|
||||
|
||||
#endif
|
||||
5128
Code/thermal_printer/ttf_Px437_PS2thin1_8x16.h
Normal file
5128
Code/thermal_printer/ttf_Px437_PS2thin1_8x16.h
Normal file
File diff suppressed because it is too large
Load Diff
5128
Code/thermal_printer/ttf_Px437_PS2thin2_8x16.h
Normal file
5128
Code/thermal_printer/ttf_Px437_PS2thin2_8x16.h
Normal file
File diff suppressed because it is too large
Load Diff
5
Code/thermal_printer/usr/local/bin/devterm_socat.sh
Executable file
5
Code/thermal_printer/usr/local/bin/devterm_socat.sh
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
sleep 4
|
||||
chmod 777 /tmp/DEVTERM_PRINTER_IN
|
||||
chmod 777 /tmp/DEVTERM_PRINTER_OUT
|
||||
21
Code/thermal_printer/utils.c
Normal file
21
Code/thermal_printer/utils.c
Normal file
@@ -0,0 +1,21 @@
|
||||
#include "utils.h"
|
||||
|
||||
void delayus(unsigned int _us){
|
||||
delayMicroseconds(_us);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
23
Code/thermal_printer/utils.h
Normal file
23
Code/thermal_printer/utils.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef UTILS_H
|
||||
#define UTILS_H
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#define SEP printf(" ");
|
||||
// a is string, b is number
|
||||
#define DEBUG(a,b) printf(a);SEP;printf("%d\n",b);
|
||||
|
||||
#define ALINE printf("\n");
|
||||
|
||||
void delayus(unsigned int _us);
|
||||
|
||||
uint8_t invert_bit(uint8_t a);
|
||||
|
||||
uint8_t bits_number(uint8_t n);
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user