add schematic pdfs and firmware code

This commit is contained in:
cuu
2021-03-29 19:32:40 +08:00
parent 7c8c69ab83
commit 9278b6bad3
35 changed files with 40112 additions and 6891 deletions

View 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)

View 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

View 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

View 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 = &current_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();
}

View File

@@ -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

View File

@@ -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
View 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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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);
}

View 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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,5 @@
#!/bin/bash
sleep 4
chmod 777 /tmp/DEVTERM_PRINTER_IN
chmod 777 /tmp/DEVTERM_PRINTER_OUT

View 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;
}

View 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