mirror of
https://github.com/clockworkpi/DevTerm.git
synced 2025-12-13 18:58:49 +01:00
Merge pull request #20 from clockworkpi/develop
Develop devterm-printer now with cjk freetype
This commit is contained in:
commit
e9d66e78ac
@ -8,35 +8,35 @@
|
|||||||
|
|
||||||
int bcmToGpioCPi[64] =
|
int bcmToGpioCPi[64] =
|
||||||
{
|
{
|
||||||
106, 107, // 0, 1
|
58, 57, // 0, 1
|
||||||
104, 10, // 2, 3
|
167, 0, // 2, 3
|
||||||
3, 9, // 4 5
|
1, 2, // 4 5
|
||||||
4, 90, // 6, 7
|
3, 4, // 6, 7
|
||||||
92, 158, // 8, 9
|
5, 6, // 8, 9
|
||||||
156, 105, //10,11
|
7, 8, //10,11
|
||||||
146, 150, //12,13
|
15, 54, //12,13
|
||||||
81, 80, //14,15
|
134, 135, //14,15
|
||||||
|
|
||||||
82, 83, //16,17
|
137, 136, //16,17
|
||||||
131, 132, //18,19
|
139, 138, //18,19
|
||||||
134, 135, //20,21
|
141, 140, //20,21
|
||||||
89, 88, //22,23
|
128, 129, //22,23
|
||||||
84, 85, //24,25
|
130, 131, //24,25
|
||||||
86, 87, //26,27
|
132, 133, //26,27
|
||||||
112, 113, //28,29
|
9, 201, //28,29
|
||||||
109, 157, //30,31
|
196, 199, //30,31
|
||||||
|
|
||||||
148, 147, //32,33
|
161, 160, //32,33
|
||||||
100, 101, //34,35
|
227, 198, //34,35
|
||||||
102, 103, //36,37
|
163, 166, //36,37
|
||||||
97, 98, //38,39
|
165, 164, //38,39
|
||||||
99, 96, //40,41
|
228, 224, //40,41
|
||||||
110, 111, //42,43
|
225, 226, //42,43
|
||||||
64, 65, //44,45
|
56, 55, //44,45
|
||||||
-1, -1, //46,47
|
-1, -1, //46,47
|
||||||
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,// ... 63
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,// ... 63
|
||||||
}
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -81,32 +81,60 @@ static char *alts [] =
|
|||||||
"IN", "OUT", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "OFF"
|
"IN", "OUT", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "OFF"
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
static char* get_pin_name(int pin)
|
||||||
|
{
|
||||||
|
static char name[10];
|
||||||
|
char c;
|
||||||
|
int b, d;
|
||||||
|
|
||||||
|
b = pin/32;
|
||||||
|
d = pin % 32;
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI_A04
|
||||||
|
|
||||||
|
if(b < 6)
|
||||||
|
c = b + 'C';
|
||||||
|
else
|
||||||
|
c = b - 6 + 'L';
|
||||||
|
sprintf(name, "P%c%d", c, d);
|
||||||
|
|
||||||
|
#elif defined(CONFIG_CLOCKWORKPI_A06)
|
||||||
|
|
||||||
|
c = d/8 + 'A';
|
||||||
|
sprintf(name, "%d%c%d", b, c, d % 8);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
void CPiReadAll(void)
|
void CPiReadAll(void)
|
||||||
{
|
{
|
||||||
int pin, pin2;
|
int pin, pin2;
|
||||||
int tmp = wiringPiDebug;
|
int tmp = wiringPiDebug;
|
||||||
wiringPiDebug = FALSE;
|
wiringPiDebug = FALSE;
|
||||||
|
|
||||||
printf (" +-----+------+------+---+-----+------+------+---+\n");
|
printf (" +-----+------+------+------+---+-----+------+------+------+---+\n");
|
||||||
printf (" | BCM | GPIO | Mode | V | BCM | GPIO | Mode | V |\n");
|
printf (" | BCM | GPIO | Name | Mode | V | BCM | GPIO | Name | Mode | V |\n");
|
||||||
printf (" +-----+------+------+---+-----+------+------+---+\n");
|
printf (" +-----+------+------+------+---+-----+------+------+------+---+\n");
|
||||||
|
|
||||||
for (pin = 0 ; pin < 23; pin ++) {
|
for (pin = 0 ; pin < 23; pin ++) {
|
||||||
printf (" | %3d", pin);
|
printf (" | %3d", pin);
|
||||||
printf (" | %4d", bcmToGpioCPi[pin]);
|
printf (" | %4d", bcmToGpioCPi[pin]);
|
||||||
|
printf (" | %-4s", get_pin_name(bcmToGpioCPi[pin]));
|
||||||
printf (" | %4s", alts [CPi_get_gpio_mode(bcmToGpioCPi[pin])]);
|
printf (" | %4s", alts [CPi_get_gpio_mode(bcmToGpioCPi[pin])]);
|
||||||
printf (" | %d", CPi_digitalRead(bcmToGpioCPi[pin])) ;
|
printf (" | %d", CPi_digitalRead(bcmToGpioCPi[pin])) ;
|
||||||
pin2 = pin + 23;
|
pin2 = pin + 23;
|
||||||
printf (" | %3d", pin2);
|
printf (" | %3d", pin2);
|
||||||
printf (" | %4d", bcmToGpioCPi[pin2]);
|
printf (" | %4d", bcmToGpioCPi[pin2]);
|
||||||
|
printf (" | %-4s", get_pin_name(bcmToGpioCPi[pin2]));
|
||||||
printf (" | %4s", alts [CPi_get_gpio_mode(bcmToGpioCPi[pin2])]);
|
printf (" | %4s", alts [CPi_get_gpio_mode(bcmToGpioCPi[pin2])]);
|
||||||
printf (" | %d", CPi_digitalRead(bcmToGpioCPi[pin2])) ;
|
printf (" | %d", CPi_digitalRead(bcmToGpioCPi[pin2])) ;
|
||||||
printf (" |\n") ;
|
printf (" |\n") ;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf (" +-----+------+------+---+-----+------+------+---+\n");
|
printf (" +-----+------+------+------+---+-----+------+------+------+---+\n");
|
||||||
printf (" | BCM | GPIO | Mode | V | BCM | GPIO | Mode | V |\n");
|
printf (" | BCM | GPIO | Name | Mode | V | BCM | GPIO | Name | Mode | V |\n");
|
||||||
printf (" +-----+------+------+---+-----+------+------+---+\n");
|
printf (" +-----+------+------+------+---+-----+------+------+------+---+\n");
|
||||||
|
|
||||||
wiringPiDebug = tmp;
|
wiringPiDebug = tmp;
|
||||||
}
|
}
|
||||||
@ -117,6 +145,38 @@ void CPiReadAllRaw(void)
|
|||||||
int tmp = wiringPiDebug;
|
int tmp = wiringPiDebug;
|
||||||
wiringPiDebug = FALSE;
|
wiringPiDebug = FALSE;
|
||||||
|
|
||||||
|
#ifdef CONFIG_CLOCKWORKPI_A04
|
||||||
|
|
||||||
|
printf (" +------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+\n");
|
||||||
|
printf (" | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V |\n");
|
||||||
|
printf (" +------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+\n");
|
||||||
|
|
||||||
|
for (pin = 0 ; pin < 27; pin++) {
|
||||||
|
pin2 = pin;
|
||||||
|
for(i = 0; i < 6; i++) {
|
||||||
|
if(CPi_get_gpio_mode(pin2) >= 0) {
|
||||||
|
printf (" | %4d", pin2) ;
|
||||||
|
printf (" | %-4s", get_pin_name(pin2));
|
||||||
|
printf (" | %4s", alts [CPi_get_gpio_mode(pin2)]) ;
|
||||||
|
printf (" | %d", CPi_digitalRead(pin2)) ;
|
||||||
|
} else {
|
||||||
|
printf (" | ") ;
|
||||||
|
printf (" | ") ;
|
||||||
|
printf (" | ") ;
|
||||||
|
printf (" | ") ;
|
||||||
|
}
|
||||||
|
pin2 += 32;
|
||||||
|
if(i == 1) pin2 += 64;
|
||||||
|
}
|
||||||
|
printf (" |\n") ;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf (" +------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+\n");
|
||||||
|
printf (" | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V | GPIO | Name | Mode | V |\n");
|
||||||
|
printf (" +------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+------+------+------+---+\n");
|
||||||
|
|
||||||
|
#elif defined(CONFIG_CLOCKWORKPI_A06)
|
||||||
|
|
||||||
printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
|
printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
|
||||||
printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n");
|
printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n");
|
||||||
printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
|
printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
|
||||||
@ -136,6 +196,8 @@ void CPiReadAllRaw(void)
|
|||||||
printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n");
|
printf (" | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V | GPIO | Mode | V |\n");
|
||||||
printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
|
printf (" +------+------+---+------+------+---+------+------+---+------+------+---+------+------+---+\n");
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
wiringPiDebug = tmp;
|
wiringPiDebug = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,22 +30,53 @@ static int wpimode = -1 ;
|
|||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A04
|
#ifdef CONFIG_CLOCKWORKPI_A04
|
||||||
|
|
||||||
int CPI_PIN_MASK[12][32] = //[BANK] [INDEX]
|
int bcmToGpioCPi[64] =
|
||||||
{
|
{
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PA
|
58, 57, // 0, 1
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PB
|
167, 0, // 2, 3
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PC
|
1, 2, // 4 5
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,16,-1,18,-1,-1,21,22,23,24,25,26,-1,-1,-1,-1,-1,},//PD
|
3, 4, // 6, 7
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PE
|
5, 6, // 8, 9
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PF
|
7, 8, //10,11
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PG
|
15, 54, //12,13
|
||||||
{-1,-1,-1, 3, 4, 5, 6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PH
|
134, 135, //14,15
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PI
|
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PJ
|
137, 136, //16,17
|
||||||
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PK
|
139, 138, //18,19
|
||||||
{-1,-1, 2, 3,-1,-1,-1,-1, 8,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PL
|
141, 140, //20,21
|
||||||
|
128, 129, //22,23
|
||||||
|
130, 131, //24,25
|
||||||
|
132, 133, //26,27
|
||||||
|
9, 201, //28,29
|
||||||
|
196, 199, //30,31
|
||||||
|
|
||||||
|
161, 160, //32,33
|
||||||
|
227, 198, //34,35
|
||||||
|
163, 166, //36,37
|
||||||
|
165, 164, //38,39
|
||||||
|
228, 224, //40,41
|
||||||
|
225, 226, //42,43
|
||||||
|
56, 55, //44,45
|
||||||
|
-1, -1, //46,47
|
||||||
|
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,// ... 63
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int CPI_PIN_MASK[8][32] = //[BANK] [INDEX]
|
||||||
|
{
|
||||||
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,},//PC 0
|
||||||
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,},//PD 32
|
||||||
|
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PE 64
|
||||||
|
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PF 96
|
||||||
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,},//PG 128
|
||||||
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,},//PH 160
|
||||||
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,},//PL 192
|
||||||
|
{ 1, 1, 1, 1, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},//PM 224
|
||||||
|
};
|
||||||
|
|
||||||
|
volatile uint32_t *gpio_base;
|
||||||
|
volatile uint32_t *gpioL_base;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
#ifdef CONFIG_CLOCKWORKPI_A06
|
||||||
@ -84,11 +115,11 @@ int bcmToGpioCPi[64] =
|
|||||||
|
|
||||||
int CPI_PIN_MASK[5][32] = //[BANK] [INDEX]
|
int CPI_PIN_MASK[5][32] = //[BANK] [INDEX]
|
||||||
{
|
{
|
||||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PA
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO0
|
||||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PB
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO1
|
||||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PC
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO2
|
||||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PD
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO3
|
||||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//PD
|
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},//GPIO4
|
||||||
};
|
};
|
||||||
|
|
||||||
volatile uint32_t *cru_base;
|
volatile uint32_t *cru_base;
|
||||||
@ -132,8 +163,17 @@ static unsigned int readR(unsigned int addr)
|
|||||||
return val;
|
return val;
|
||||||
|
|
||||||
#elif (defined CONFIG_CLOCKWORKPI_A04)
|
#elif (defined CONFIG_CLOCKWORKPI_A04)
|
||||||
|
|
||||||
uint32_t val = 0;
|
uint32_t val = 0;
|
||||||
|
uint32_t mmap_base = (addr & ~MAP_MASK);
|
||||||
|
uint32_t mmap_seek = ((addr - mmap_base) >> 2);
|
||||||
|
|
||||||
|
if (addr >= GPIOL_BASE)
|
||||||
|
val = *(gpioL_base + mmap_seek);
|
||||||
|
else
|
||||||
|
val = *(gpio_base + mmap_seek);
|
||||||
return val;
|
return val;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,6 +205,14 @@ static void writeR(unsigned int val, unsigned int addr)
|
|||||||
|
|
||||||
#elif (defined CONFIG_CLOCKWORKPI_A04)
|
#elif (defined CONFIG_CLOCKWORKPI_A04)
|
||||||
|
|
||||||
|
unsigned int mmap_base = (addr & ~MAP_MASK);
|
||||||
|
unsigned int mmap_seek = ((addr - mmap_base) >> 2);
|
||||||
|
|
||||||
|
if (addr >= GPIOL_BASE)
|
||||||
|
*(gpioL_base + mmap_seek) = val;
|
||||||
|
else
|
||||||
|
*(gpio_base + mmap_seek) = val;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,6 +224,9 @@ int CPi_get_gpio_mode(int pin)
|
|||||||
unsigned int phyaddr = 0;
|
unsigned int phyaddr = 0;
|
||||||
unsigned char mode = -1;
|
unsigned char mode = -1;
|
||||||
|
|
||||||
|
if (CPI_PIN_MASK[bank][index] < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
#ifdef CONFIG_CLOCKWORKPI_A06
|
||||||
|
|
||||||
unsigned int grf_phyaddr = 0, ddr_phyaddr = 0;
|
unsigned int grf_phyaddr = 0, ddr_phyaddr = 0;
|
||||||
@ -202,31 +253,29 @@ int CPi_get_gpio_mode(int pin)
|
|||||||
ddr_phyaddr = GPIO4_BASE + GPIO_SWPORTA_DDR_OFFSET;
|
ddr_phyaddr = GPIO4_BASE + GPIO_SWPORTA_DDR_OFFSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CPI_PIN_MASK[bank][index] != -1) {
|
|
||||||
regval = readR(grf_phyaddr);
|
regval = readR(grf_phyaddr);
|
||||||
mode = (regval >> (offset << 1)) & 0x3;
|
mode = (regval >> (offset << 1)) & 0x3;
|
||||||
|
|
||||||
if(mode == 0){
|
if(mode == 0){
|
||||||
regval = readR(ddr_phyaddr);
|
regval = readR(ddr_phyaddr);
|
||||||
return (regval >> index) & 1;
|
return (regval >> index) & 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mode + 1;
|
return mode + 1;
|
||||||
}
|
|
||||||
|
|
||||||
#elif (defined CONFIG_CLOCKWORKPI_A04)
|
#elif (defined CONFIG_CLOCKWORKPI_A04)
|
||||||
|
|
||||||
int offset = ((index - ((index >> 3) << 3)) << 2);
|
int offset = ((index - ((index >> 3) << 3)) << 2);
|
||||||
|
|
||||||
if (bank == 11) {
|
if (bank >= 6) {
|
||||||
phyaddr = GPIOL_BASE + ((index >> 3) << 2);
|
phyaddr = GPIOL_BASE + (bank -6) * 0x24 + ((index >> 3) << 2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2);
|
|
||||||
|
|
||||||
/* Ignore unused gpio */
|
|
||||||
if (CPI_PIN_MASK[bank][index] != -1) {
|
|
||||||
regval = readR(phyaddr);
|
regval = readR(phyaddr);
|
||||||
mode = (regval >> offset) & 7;
|
mode = (regval >> offset) & 7;
|
||||||
}
|
|
||||||
|
|
||||||
return mode;
|
return mode;
|
||||||
|
|
||||||
@ -243,21 +292,23 @@ int CPi_set_gpio_mode(int pin, int mode)
|
|||||||
unsigned int index = pin - (bank << 5);
|
unsigned int index = pin - (bank << 5);
|
||||||
unsigned int phyaddr = 0;
|
unsigned int phyaddr = 0;
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
#ifdef CONFIG_CLOCKWORKPI_A04
|
||||||
int offset = ((index - ((index >> 3) << 3)));
|
|
||||||
unsigned int cru_phyaddr, grf_phyaddr, gpio_phyaddr;
|
|
||||||
#elif (defined CONFIG_CLOCKWORKPI_A04)
|
|
||||||
int offset = ((index - ((index >> 3) << 3)) << 2);
|
int offset = ((index - ((index >> 3) << 3)) << 2);
|
||||||
|
|
||||||
if (bank == 11) {
|
if (bank >= 6) {
|
||||||
phyaddr = GPIOL_BASE + ((index >> 3) << 2);
|
phyaddr = GPIOL_BASE + (bank -6) * 0x24 + ((index >> 3) << 2);
|
||||||
} else {
|
} else {
|
||||||
phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2);
|
phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
#ifdef CONFIG_CLOCKWORKPI_A06
|
||||||
|
|
||||||
|
int offset = ((index - ((index >> 3) << 3)));
|
||||||
|
unsigned int cru_phyaddr, grf_phyaddr, gpio_phyaddr;
|
||||||
|
|
||||||
if(bank == 0){
|
if(bank == 0){
|
||||||
cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
|
cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
|
||||||
grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2);
|
grf_phyaddr = PMUGRF_BASE + ((index >> 3) << 2);
|
||||||
@ -295,7 +346,6 @@ int CPi_set_gpio_mode(int pin, int mode)
|
|||||||
if (wiringPiDebug)
|
if (wiringPiDebug)
|
||||||
printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index);
|
printf("Register[%#x]: %#x index:%d\n", phyaddr, regval, index);
|
||||||
|
|
||||||
/* Set Input */
|
|
||||||
if (INPUT == mode) {
|
if (INPUT == mode) {
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
#ifdef CONFIG_CLOCKWORKPI_A06
|
||||||
writeR(0xffff0180, cru_phyaddr);
|
writeR(0xffff0180, cru_phyaddr);
|
||||||
@ -317,7 +367,7 @@ int CPi_set_gpio_mode(int pin, int mode)
|
|||||||
if (wiringPiDebug)
|
if (wiringPiDebug)
|
||||||
printf("Input mode set over reg val: %#x\n",regval);
|
printf("Input mode set over reg val: %#x\n",regval);
|
||||||
#endif
|
#endif
|
||||||
} else if (OUTPUT == mode) { /* Set Output */
|
} else if (OUTPUT == mode) {
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
#ifdef CONFIG_CLOCKWORKPI_A06
|
||||||
writeR(0xffff0180, cru_phyaddr);
|
writeR(0xffff0180, cru_phyaddr);
|
||||||
regval = readR(grf_phyaddr);
|
regval = readR(grf_phyaddr);
|
||||||
@ -356,10 +406,10 @@ int CPi_set_gpio_alt(int pin, int mode)
|
|||||||
unsigned int phyaddr = 0;
|
unsigned int phyaddr = 0;
|
||||||
int offset = ((index - ((index >> 3) << 3)) << 2);
|
int offset = ((index - ((index >> 3) << 3)) << 2);
|
||||||
|
|
||||||
if (bank == 11) {
|
if (bank >= 6) {
|
||||||
phyaddr = GPIOL_BASE + ((index >> 3) << 2);
|
phyaddr = GPIOL_BASE + ((index >> 3) << 2);
|
||||||
}else
|
}else
|
||||||
phyaddr = GPIO_BASE_MAP + (bank * 36) + ((index >> 3) << 2);
|
phyaddr = GPIO_BASE_MAP + (bank * 0x24) + ((index >> 3) << 2);
|
||||||
|
|
||||||
/* Ignore unused gpio */
|
/* Ignore unused gpio */
|
||||||
if (CPI_PIN_MASK[bank][index] != -1) {
|
if (CPI_PIN_MASK[bank][index] != -1) {
|
||||||
@ -385,22 +435,22 @@ void CPi_digitalWrite(int pin, int value)
|
|||||||
unsigned int bank = pin >> 5;
|
unsigned int bank = pin >> 5;
|
||||||
unsigned int index = pin - (bank << 5);
|
unsigned int index = pin - (bank << 5);
|
||||||
unsigned int phyaddr = 0;
|
unsigned int phyaddr = 0;
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
|
||||||
unsigned int regval = 0;
|
|
||||||
unsigned int cru_phyaddr = 0;
|
|
||||||
|
|
||||||
#else
|
|
||||||
unsigned int regval = 0;
|
unsigned int regval = 0;
|
||||||
|
|
||||||
if (bank == 11) {
|
#ifdef CONFIG_CLOCKWORKPI_A04
|
||||||
phyaddr = GPIOL_BASE + 0x10;
|
|
||||||
|
if (bank >= 6) {
|
||||||
|
phyaddr = GPIOL_BASE + (bank -6) * 0x24 + 0x10;
|
||||||
|
} else {
|
||||||
|
phyaddr = GPIO_BASE_MAP + (bank * 0x24) + 0x10;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
phyaddr = GPIO_BASE_MAP + (bank * 36) + 0x10;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
#ifdef CONFIG_CLOCKWORKPI_A06
|
||||||
|
|
||||||
|
unsigned int cru_phyaddr = 0;
|
||||||
|
|
||||||
if(bank == 0){
|
if(bank == 0){
|
||||||
phyaddr = GPIO0_BASE + GPIO_SWPORTA_DR_OFFSET;
|
phyaddr = GPIO0_BASE + GPIO_SWPORTA_DR_OFFSET;
|
||||||
cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
|
cru_phyaddr = PMUCRU_BASE + PMUCRU_CLKGATE_CON1_OFFSET;
|
||||||
@ -450,9 +500,7 @@ void CPi_digitalWrite(int pin, int value)
|
|||||||
printf("HIGH val set over reg val: 0x%x\n", regval);
|
printf("HIGH val set over reg val: 0x%x\n", regval);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else
|
}
|
||||||
printf("unused pin\n");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -463,19 +511,20 @@ int CPi_digitalRead(int pin)
|
|||||||
int bank = pin >> 5;
|
int bank = pin >> 5;
|
||||||
int index = pin - (bank << 5);
|
int index = pin - (bank << 5);
|
||||||
int val;
|
int val;
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A04
|
|
||||||
|
|
||||||
unsigned int phyaddr;
|
unsigned int phyaddr;
|
||||||
|
|
||||||
if (bank == 11) {
|
#ifdef CONFIG_CLOCKWORKPI_A04
|
||||||
phyaddr = GPIOL_BASE + 0x10;
|
|
||||||
|
if (bank >= 6) {
|
||||||
|
phyaddr = GPIOL_BASE + (bank -6) * 0x24 + 0x10;
|
||||||
} else {
|
} else {
|
||||||
phyaddr = GPIO_BASE_MAP + (bank * 36) + 0x10;
|
phyaddr = GPIO_BASE_MAP + (bank * 0x24) + 0x10;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
#ifdef CONFIG_CLOCKWORKPI_A06
|
||||||
unsigned int phyaddr;
|
|
||||||
if(bank == 0)
|
if(bank == 0)
|
||||||
phyaddr = GPIO0_BASE + GPIO_EXT_PORTA_OFFSET;
|
phyaddr = GPIO0_BASE + GPIO_EXT_PORTA_OFFSET;
|
||||||
else if(bank == 1)
|
else if(bank == 1)
|
||||||
@ -486,6 +535,7 @@ int CPi_digitalRead(int pin)
|
|||||||
phyaddr = GPIO3_BASE + GPIO_EXT_PORTA_OFFSET;
|
phyaddr = GPIO3_BASE + GPIO_EXT_PORTA_OFFSET;
|
||||||
else if(bank == 4)
|
else if(bank == 4)
|
||||||
phyaddr = GPIO4_BASE + GPIO_EXT_PORTA_OFFSET;
|
phyaddr = GPIO4_BASE + GPIO_EXT_PORTA_OFFSET;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (CPI_PIN_MASK[bank][index] != -1) {
|
if (CPI_PIN_MASK[bank][index] != -1) {
|
||||||
@ -493,7 +543,7 @@ int CPi_digitalRead(int pin)
|
|||||||
val = val >> index;
|
val = val >> index;
|
||||||
val &= 1;
|
val &= 1;
|
||||||
if (wiringPiDebug)
|
if (wiringPiDebug)
|
||||||
printf("Read reg val: 0x%#x, bank:%d, index:%d\n", val, bank, index);
|
printf("Read reg val: 0x%#x, bank:%d, index:%d phyaddr: 0x%x\n", val, bank, index, phyaddr);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -504,9 +554,15 @@ int CPiSetup(int fd)
|
|||||||
{
|
{
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A04
|
#ifdef CONFIG_CLOCKWORKPI_A04
|
||||||
|
|
||||||
|
gpio_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIOA_BASE);
|
||||||
|
if ((int32_t)(unsigned long)gpio_base == -1)
|
||||||
|
return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror(errno));
|
||||||
|
gpioL_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIOL_BASE);
|
||||||
|
if ((int32_t)(unsigned long)gpioL_base == -1)
|
||||||
|
return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror(errno));
|
||||||
|
|
||||||
#elif defined(CONFIG_CLOCKWORKPI_A06)
|
#elif defined(CONFIG_CLOCKWORKPI_A06)
|
||||||
|
|
||||||
gpio0_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO0_BASE);
|
gpio0_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO0_BASE);
|
||||||
if ((int32_t)(unsigned long)gpio0_base == -1)
|
if ((int32_t)(unsigned long)gpio0_base == -1)
|
||||||
return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO0_BASE) failed: %s\n", strerror(errno));
|
return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (GPIO0_BASE) failed: %s\n", strerror(errno));
|
||||||
@ -535,6 +591,7 @@ int CPiSetup(int fd)
|
|||||||
pmugrf_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, PMUGRF_BASE);
|
pmugrf_base = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, PMUGRF_BASE);
|
||||||
if ((int32_t)(unsigned long)pmugrf_base == -1)
|
if ((int32_t)(unsigned long)pmugrf_base == -1)
|
||||||
return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (PMUGRF_BASE) failed: %s\n", strerror(errno));
|
return wiringPiFailure(WPI_ALMOST, "wiringPiSetup: mmap (PMUGRF_BASE) failed: %s\n", strerror(errno));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
wpimode = WPI_MODE_BCM;
|
wpimode = WPI_MODE_BCM;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,14 +2,11 @@
|
|||||||
#define _WIRING_CPI_H
|
#define _WIRING_CPI_H
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A04
|
#ifdef CONFIG_CLOCKWORKPI_A04
|
||||||
#define GPIOA_BASE (0x0300B000)
|
#define GPIOA_BASE 0x0300B000
|
||||||
#define GPIO_NUM (0x40)
|
#define GPIO_BASE_MAP (GPIOA_BASE + 0x24 * 2)
|
||||||
#define GPIO_BASE_MAP (0x0300B000)
|
|
||||||
#define MEM_INFO (1024)
|
|
||||||
#define GPIOL_BASE (0x07022000)
|
#define GPIOL_BASE (0x07022000)
|
||||||
#define GPIOL_BASE_MAP (0x07022000)
|
|
||||||
#define MAP_SIZE_L (4096 * 1)
|
|
||||||
#define GPIO_PWM_OP (0x0300A000)
|
#define GPIO_PWM_OP (0x0300A000)
|
||||||
|
#define GPIO_NUM (256)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI_A06
|
#ifdef CONFIG_CLOCKWORKPI_A06
|
||||||
@ -18,7 +15,6 @@
|
|||||||
#define GPIO2_BASE 0xff780000
|
#define GPIO2_BASE 0xff780000
|
||||||
#define GPIO3_BASE 0xff788000
|
#define GPIO3_BASE 0xff788000
|
||||||
#define GPIO4_BASE 0xff790000
|
#define GPIO4_BASE 0xff790000
|
||||||
#define GPIO_NUM (160)
|
|
||||||
#define GPIO_SWPORTA_DR_OFFSET 0x00
|
#define GPIO_SWPORTA_DR_OFFSET 0x00
|
||||||
#define GPIO_SWPORTA_DDR_OFFSET 0x04
|
#define GPIO_SWPORTA_DDR_OFFSET 0x04
|
||||||
#define GPIO_EXT_PORTA_OFFSET 0x50
|
#define GPIO_EXT_PORTA_OFFSET 0x50
|
||||||
@ -26,12 +22,12 @@
|
|||||||
#define GRF_BASE 0xff77e000
|
#define GRF_BASE 0xff77e000
|
||||||
#define CRU_BASE 0xff760000
|
#define CRU_BASE 0xff760000
|
||||||
#define PMUCRU_BASE 0xff750000
|
#define PMUCRU_BASE 0xff750000
|
||||||
#define CRU_CLKGATE_CON31_OFFSET 0x037c //bit 3 4 5
|
#define CRU_CLKGATE_CON31_OFFSET 0x037c
|
||||||
#define PMUCRU_CLKGATE_CON1_OFFSET 0x0104
|
#define PMUCRU_CLKGATE_CON1_OFFSET 0x0104
|
||||||
|
#define GPIO_NUM (160)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAP_SIZE_L (4*1024)
|
#define MAP_SIZE (4*1024)
|
||||||
#define MAP_SIZE MAP_SIZE_L
|
|
||||||
#define MAP_MASK (MAP_SIZE - 1)
|
#define MAP_MASK (MAP_SIZE - 1)
|
||||||
|
|
||||||
extern int CPi_set_gpio_mode(int pin, int mode);
|
extern int CPi_set_gpio_mode(int pin, int mode);
|
||||||
|
|||||||
@ -109,7 +109,7 @@ int wiringPiSPISetupMode (int channel, int speed, int mode)
|
|||||||
// Channel can be anything - lets hope for the best
|
// Channel can be anything - lets hope for the best
|
||||||
// channel &= 1 ; // Channel is 0 or 1
|
// channel &= 1 ; // Channel is 0 or 1
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKWORKPI
|
#ifdef CONFIG_CLOCKWORKPI_A06
|
||||||
snprintf (spiDev, 31, "/dev/spidev2.%d", channel) ;
|
snprintf (spiDev, 31, "/dev/spidev2.%d", channel) ;
|
||||||
#else
|
#else
|
||||||
snprintf (spiDev, 31, "/dev/spidev0.%d", channel) ;
|
snprintf (spiDev, 31, "/dev/spidev0.%d", channel) ;
|
||||||
|
|||||||
@ -35,7 +35,7 @@
|
|||||||
#define DRCN_ANALOG_READ 9
|
#define DRCN_ANALOG_READ 9
|
||||||
|
|
||||||
|
|
||||||
struct drcNetComStruct
|
typedef struct drcNetComStruct
|
||||||
{
|
{
|
||||||
uint32_t pin ;
|
uint32_t pin ;
|
||||||
uint32_t cmd ;
|
uint32_t cmd ;
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
|
|
||||||
CFLAGS = -g -Wall
|
CFLAGS = -O0 -g -Wall
|
||||||
LDFLAUS =
|
LDFLAGS =
|
||||||
INCLUDES =
|
INCLUDES = -I /usr/include/freetype2
|
||||||
LIBS = -lwiringPi -lm -lcrypt -lpthread -lrt
|
LIBS = -lwiringPi -lm -lcrypt -lpthread -lfreetype -lrt
|
||||||
|
|
||||||
MAIN = devterm_thermal_printer.elf
|
MAIN = devterm_thermal_printer.elf
|
||||||
|
|
||||||
SRCS = printer.c devterm_thermal_printer.c utils.c
|
SRCS = printer.c devterm_thermal_printer.c utils.c ftype.c utf8-utils.c
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
.PHONY: depend clean
|
.PHONY: depend clean
|
||||||
|
|||||||
BIN
Code/thermal_printer/NotoSansCJK-Regular.ttf
Normal file
BIN
Code/thermal_printer/NotoSansCJK-Regular.ttf
Normal file
Binary file not shown.
@ -1,6 +1,10 @@
|
|||||||
#ifndef CONFIG_H
|
#ifndef CONFIG_H
|
||||||
#define CONFIG_H
|
#define CONFIG_H
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
#include <freetype2/ft2build.h>
|
||||||
|
#include <freetype/freetype.h>
|
||||||
|
// clang-format on
|
||||||
/// raspberry pi CM3
|
/// raspberry pi CM3
|
||||||
|
|
||||||
#define BCM_GPIO_28 28
|
#define BCM_GPIO_28 28
|
||||||
@ -23,7 +27,8 @@
|
|||||||
#define BCM_GPIO_45 45
|
#define BCM_GPIO_45 45
|
||||||
|
|
||||||
// PA8-12 UART1
|
// PA8-12 UART1
|
||||||
//#define SPI1_NSS_PIN PA4 //SPI_1 Chip Select pin is PA4. //no use in DevTerm
|
//#define SPI1_NSS_PIN PA4 //SPI_1 Chip Select pin is PA4. //no use in
|
||||||
|
//DevTerm
|
||||||
|
|
||||||
#define VH_PIN BCM_GPIO_40 // ENABLE_VH required,PRT_EN
|
#define VH_PIN BCM_GPIO_40 // ENABLE_VH required,PRT_EN
|
||||||
|
|
||||||
@ -50,7 +55,6 @@
|
|||||||
#define MOSI_PIN BCM_GPIO_38
|
#define MOSI_PIN BCM_GPIO_38
|
||||||
#define CLK_PIN BCM_GPIO_39
|
#define CLK_PIN BCM_GPIO_39
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*@brief STB_NUMBER stand for STROBE NUMBER of lines, which means how many lines
|
*@brief STB_NUMBER stand for STROBE NUMBER of lines, which means how many lines
|
||||||
* are going to be activated
|
* are going to be activated
|
||||||
@ -64,7 +68,6 @@
|
|||||||
#define STB5_PIN STB1_PIN
|
#define STB5_PIN STB1_PIN
|
||||||
#define STB6_PIN STB1_PIN
|
#define STB6_PIN STB1_PIN
|
||||||
|
|
||||||
|
|
||||||
#define PH1_PIN BCM_GPIO_28
|
#define PH1_PIN BCM_GPIO_28
|
||||||
#define PH2_PIN BCM_GPIO_29
|
#define PH2_PIN BCM_GPIO_29
|
||||||
#define PH3_PIN BCM_GPIO_30
|
#define PH3_PIN BCM_GPIO_30
|
||||||
@ -76,14 +79,11 @@
|
|||||||
#define PB_PIN PH3_PIN //
|
#define PB_PIN PH3_PIN //
|
||||||
#define PNB_PIN PH4_PIN //
|
#define PNB_PIN PH4_PIN //
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//#define ENABLE1_PIN PA13
|
//#define ENABLE1_PIN PA13
|
||||||
//#define ENABLE2_PIN PA14
|
//#define ENABLE2_PIN PA14
|
||||||
|
|
||||||
#define THERMISTORPIN BCM_GPIO_35 // ADC,14
|
#define THERMISTORPIN BCM_GPIO_35 // ADC,14
|
||||||
|
|
||||||
|
|
||||||
#define MOTOR_ENABLE1
|
#define MOTOR_ENABLE1
|
||||||
#define MOTOR_ENABLE2
|
#define MOTOR_ENABLE2
|
||||||
|
|
||||||
@ -98,7 +98,6 @@
|
|||||||
|
|
||||||
#define ASK4PAPER digitalRead(PEM_PIN)
|
#define ASK4PAPER digitalRead(PEM_PIN)
|
||||||
|
|
||||||
|
|
||||||
#define ERROR_FEED_PITCH ((uint8_t)0x01)
|
#define ERROR_FEED_PITCH ((uint8_t)0x01)
|
||||||
#define IS_PAPER 0x00
|
#define IS_PAPER 0x00
|
||||||
#define NO_PAPER 0x01
|
#define NO_PAPER 0x01
|
||||||
@ -136,8 +135,6 @@
|
|||||||
|
|
||||||
#define nextcharactercolum ((uint8_t)Fontrows / 8) // = 3
|
#define nextcharactercolum ((uint8_t)Fontrows / 8) // = 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define ASCII_TAB '\t' // Horizontal tab
|
#define ASCII_TAB '\t' // Horizontal tab
|
||||||
#define ASCII_LF '\n' // Line feed,10
|
#define ASCII_LF '\n' // Line feed,10
|
||||||
#define ASCII_FF '\f' // Form feed
|
#define ASCII_FF '\f' // Form feed
|
||||||
@ -161,7 +158,6 @@
|
|||||||
|
|
||||||
#define BITS8 8
|
#define BITS8 8
|
||||||
|
|
||||||
|
|
||||||
#define MAX_DOTS 384
|
#define MAX_DOTS 384
|
||||||
#define PRINTER_BITS MAX_DOTS
|
#define PRINTER_BITS MAX_DOTS
|
||||||
#define MAXPIXELS 48
|
#define MAXPIXELS 48
|
||||||
@ -172,23 +168,25 @@
|
|||||||
#define MAXPIXELS 72
|
#define MAXPIXELS 72
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define FONT_MODE_0 0 // Internal
|
||||||
|
#define FONT_MODE_1 1 // External
|
||||||
|
|
||||||
// extract bits
|
// extract bits
|
||||||
#define LAST(k, n) ((k) & ((1 << (n)) - 1))
|
#define LAST(k, n) ((k) & ((1 << (n)) - 1))
|
||||||
#define MID(k, m, n) LAST((k) >> (m), ((n) - (m)))
|
#define MID(k, m, n) LAST((k) >> (m), ((n) - (m)))
|
||||||
|
|
||||||
|
|
||||||
typedef struct _Margin {
|
typedef struct _Margin {
|
||||||
uint16_t width;
|
uint16_t width;
|
||||||
uint8_t esgs;
|
uint8_t esgs;
|
||||||
} Margin;
|
} Margin;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _FONT {
|
typedef struct _FONT {
|
||||||
|
|
||||||
uint8_t width; // in bits
|
uint8_t width; // in bits
|
||||||
uint8_t height;
|
uint8_t height;
|
||||||
|
uint8_t mode; // 0 internal pcf font array,1 external ttf font file
|
||||||
const uint8_t *data;
|
const uint8_t *data;
|
||||||
|
char *file;
|
||||||
} FONT;
|
} FONT;
|
||||||
|
|
||||||
typedef struct _ImageCache {
|
typedef struct _ImageCache {
|
||||||
@ -203,8 +201,7 @@ typedef struct _ImageCache{
|
|||||||
|
|
||||||
} ImageCache;
|
} ImageCache;
|
||||||
|
|
||||||
typedef struct _CONFIG
|
typedef struct _CONFIG {
|
||||||
{
|
|
||||||
uint8_t state;
|
uint8_t state;
|
||||||
uint8_t line_space;
|
uint8_t line_space;
|
||||||
uint8_t align;
|
uint8_t align;
|
||||||
@ -217,20 +214,25 @@ typedef struct _CONFIG
|
|||||||
uint16_t wordgap : 10; // 1023 max
|
uint16_t wordgap : 10; // 1023 max
|
||||||
uint8_t max_pts; // max pts in print_dots_8bit_split
|
uint8_t max_pts; // max pts in print_dots_8bit_split
|
||||||
uint8_t lock;
|
uint8_t lock;
|
||||||
|
int16_t degree; // char rotate 0,90,180,270, -90,-180,-270
|
||||||
|
|
||||||
Margin margin;
|
Margin margin;
|
||||||
FONT *font;
|
FONT *font;
|
||||||
ImageCache *img;
|
ImageCache *img;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
|
FT_Face face;
|
||||||
|
FT_Library ft;
|
||||||
|
|
||||||
int (*printf)(struct _CONFIG *, char *, ...);
|
int (*printf)(struct _CONFIG *, char *, ...);
|
||||||
|
|
||||||
} CONFIG;
|
} CONFIG;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _SerialCache {
|
typedef struct _SerialCache {
|
||||||
uint8_t idx;
|
uint8_t idx;
|
||||||
uint8_t data[77];//384/5
|
uint8_t utf8idx; // 0-4
|
||||||
|
// uint8_t data[77];//384/5, minium size font 5 pixel
|
||||||
|
uint32_t data[MAX_DOTS]; // uint32_t for utf8 characters
|
||||||
} SerialCache;
|
} SerialCache;
|
||||||
|
|
||||||
typedef struct _TimeRec {
|
typedef struct _TimeRec {
|
||||||
|
|||||||
@ -1,15 +1,15 @@
|
|||||||
// for ltp02-245
|
// for ltp02-245
|
||||||
// 203 dpi, 384dots in 48mm(1.88976inch) every dots == 0.125mm, 1byte==8dots==1mm
|
// 203 dpi, 384dots in 48mm(1.88976inch) every dots == 0.125mm,
|
||||||
// make clean && make && ./*.elf
|
// 1byte==8dots==1mm make clean && make && ./*.elf
|
||||||
//#include <SPI.h>
|
//#include <SPI.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include <wiringPi.h>
|
#include <wiringPi.h>
|
||||||
|
|
||||||
@ -19,15 +19,15 @@
|
|||||||
#include "pcf_6x12-ISO8859-1_6x12.h"
|
#include "pcf_6x12-ISO8859-1_6x12.h"
|
||||||
#include "pcf_7x14-ISO8859-1_7x14.h"
|
#include "pcf_7x14-ISO8859-1_7x14.h"
|
||||||
|
|
||||||
|
|
||||||
#include "ttf_Px437_PS2thin1_8x16.h"
|
#include "ttf_Px437_PS2thin1_8x16.h"
|
||||||
#include "ttf_Px437_PS2thin2_8x16.h"
|
#include "ttf_Px437_PS2thin2_8x16.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "utils.h"
|
|
||||||
#include "printer.h"
|
#include "printer.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#include "ftype.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
SerialCache ser_cache;
|
SerialCache ser_cache;
|
||||||
|
|
||||||
@ -43,6 +43,10 @@ ImageCache img_cache;
|
|||||||
|
|
||||||
FONT current_font;
|
FONT current_font;
|
||||||
|
|
||||||
|
FT_Face face;
|
||||||
|
|
||||||
|
FT_Library ft;
|
||||||
|
|
||||||
CONFIG g_config;
|
CONFIG g_config;
|
||||||
|
|
||||||
TimeRec battery_chk_tm;
|
TimeRec battery_chk_tm;
|
||||||
@ -72,7 +76,7 @@ void reset_cmd(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void init_printer() {
|
void init_printer() {
|
||||||
|
char *error = NULL;
|
||||||
memset(cmd, 0, 10);
|
memset(cmd, 0, 10);
|
||||||
|
|
||||||
newline = 0;
|
newline = 0;
|
||||||
@ -85,20 +89,47 @@ void init_printer(){
|
|||||||
img_cache.need_print = 0;
|
img_cache.need_print = 0;
|
||||||
img_cache.revert_bits = 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;
|
ser_cache.idx = 0;
|
||||||
|
ser_cache.utf8idx = 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;
|
||||||
|
*/
|
||||||
|
// auto detect TTF ,switch to FONT_MODE_1
|
||||||
|
if (getenv("TTF") && access(getenv("TTF"), F_OK) != -1) {
|
||||||
|
printf("TTF=%s\n", getenv("TTF"));
|
||||||
|
current_font.width = 12;
|
||||||
|
current_font.height = 12;
|
||||||
|
current_font.data = NULL;
|
||||||
|
current_font.file = getenv("TTF");
|
||||||
|
current_font.mode = FONT_MODE_1;
|
||||||
|
|
||||||
|
if (init_ft(current_font.file, &face, &ft, current_font.width,
|
||||||
|
current_font.height, &error)) {
|
||||||
|
g_config.face = face;
|
||||||
|
g_config.ft = ft;
|
||||||
|
} else {
|
||||||
|
printf("init_ft error %s\n", error);
|
||||||
|
g_config.face = NULL;
|
||||||
|
g_config.ft = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
current_font.mode = FONT_MODE_0;
|
||||||
|
current_font.width = 8;
|
||||||
|
current_font.height = 16;
|
||||||
|
current_font.data = font_ttf_Px437_PS2thin2_8x16;
|
||||||
|
}
|
||||||
|
|
||||||
g_config.line_space = 0;
|
g_config.line_space = 0;
|
||||||
g_config.align = ALIGN_LEFT;
|
g_config.align = ALIGN_LEFT;
|
||||||
@ -123,7 +154,7 @@ void init_printer(){
|
|||||||
g_config.feed_pitch = 2;
|
g_config.feed_pitch = 2;
|
||||||
g_config.max_pts = 2;
|
g_config.max_pts = 2;
|
||||||
g_config.lock = 0;
|
g_config.lock = 0;
|
||||||
|
g_config.degree = 0;
|
||||||
|
|
||||||
battery_chk_tm.time = millis();
|
battery_chk_tm.time = millis();
|
||||||
battery_chk_tm.last_status = 0;
|
battery_chk_tm.last_status = 0;
|
||||||
@ -136,7 +167,6 @@ void label_print_f(CONFIG*cfg,char*label,float m,char*last){
|
|||||||
char buf[48];
|
char buf[48];
|
||||||
uint8_t i, j;
|
uint8_t i, j;
|
||||||
|
|
||||||
|
|
||||||
if (m == -1.0)
|
if (m == -1.0)
|
||||||
sprintf(buf, "%s", last);
|
sprintf(buf, "%s", last);
|
||||||
else
|
else
|
||||||
@ -150,7 +180,6 @@ void label_print_f(CONFIG*cfg,char*label,float m,char*last){
|
|||||||
else
|
else
|
||||||
sprintf(buf, "%s%*s%0.2f%s", label, i, "", m, last);
|
sprintf(buf, "%s%*s%0.2f%s", label, i, "", m, last);
|
||||||
|
|
||||||
|
|
||||||
printer_set_font(cfg, 4);
|
printer_set_font(cfg, 4);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
|
|
||||||
@ -159,8 +188,6 @@ void label_print_f(CONFIG*cfg,char*label,float m,char*last){
|
|||||||
}
|
}
|
||||||
parse_serial_stream(cfg, 10);
|
parse_serial_stream(cfg, 10);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void label_print_i(CONFIG *cfg, char *label, int m, char *last) {
|
void label_print_i(CONFIG *cfg, char *label, int m, char *last) {
|
||||||
@ -188,8 +215,6 @@ void label_print_i(CONFIG*cfg,char*label,int m,char*last){
|
|||||||
}
|
}
|
||||||
parse_serial_stream(cfg, 10);
|
parse_serial_stream(cfg, 10);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void printer_test(CONFIG *cfg) {
|
void printer_test(CONFIG *cfg) {
|
||||||
@ -199,7 +224,8 @@ void printer_test(CONFIG*cfg){
|
|||||||
uint16_t k;
|
uint16_t k;
|
||||||
|
|
||||||
char buf[MAXPIXELS];
|
char buf[MAXPIXELS];
|
||||||
char *font_names[]={"8x16thin_1","5x7_ISO8859_1","6x12_ISO8859_1","7x14_ISO8859_1","8x16thin_2",NULL};
|
char *font_names[] = {"8x16thin_1", "5x7_ISO8859_1", "6x12_ISO8859_1",
|
||||||
|
"7x14_ISO8859_1", "8x16thin_2", NULL};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
char *selftest1[] = {
|
char *selftest1[] = {
|
||||||
@ -218,9 +244,7 @@ NULL
|
|||||||
" # # # # # # # # ",
|
" # # # # # # # # ",
|
||||||
"# # # # # # # # # # ",
|
"# # # # # # # # # # ",
|
||||||
" #### ###### ###### # # ###### #### # ",
|
" #### ###### ###### # # ###### #### # ",
|
||||||
NULL
|
NULL};
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
cfg->density = 6;
|
cfg->density = 6;
|
||||||
|
|
||||||
@ -249,6 +273,7 @@ NULL
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
||||||
|
printer_set_font_mode(cfg, FONT_MODE_0);
|
||||||
printer_set_font(cfg, 1);
|
printer_set_font(cfg, 1);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
|
|
||||||
@ -264,6 +289,7 @@ NULL
|
|||||||
//---------------------------------------------
|
//---------------------------------------------
|
||||||
|
|
||||||
for (i = 1; i < 4; i++) {
|
for (i = 1; i < 4; i++) {
|
||||||
|
printer_set_font_mode(cfg, FONT_MODE_0);
|
||||||
printer_set_font(cfg, 0);
|
printer_set_font(cfg, 0);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
for (j = 0; j < strlen(font_names[i]); j++) {
|
for (j = 0; j < strlen(font_names[i]); j++) {
|
||||||
@ -272,6 +298,7 @@ NULL
|
|||||||
}
|
}
|
||||||
parse_serial_stream(cfg, 10);
|
parse_serial_stream(cfg, 10);
|
||||||
|
|
||||||
|
printer_set_font_mode(cfg, FONT_MODE_0);
|
||||||
printer_set_font(cfg, i);
|
printer_set_font(cfg, i);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
for (ch = 33; ch < 127; ch++) {
|
for (ch = 33; ch < 127; ch++) {
|
||||||
@ -283,7 +310,7 @@ NULL
|
|||||||
feed_pitch1(48, cfg->orient);
|
feed_pitch1(48, cfg->orient);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printer_set_font_mode(cfg, FONT_MODE_0);
|
||||||
printer_set_font(cfg, 0);
|
printer_set_font(cfg, 0);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
for (j = 0; j < strlen(font_names[0]); j++) {
|
for (j = 0; j < strlen(font_names[0]); j++) {
|
||||||
@ -291,6 +318,7 @@ NULL
|
|||||||
}
|
}
|
||||||
parse_serial_stream(cfg, 10);
|
parse_serial_stream(cfg, 10);
|
||||||
|
|
||||||
|
printer_set_font_mode(cfg, FONT_MODE_0);
|
||||||
printer_set_font(cfg, 0);
|
printer_set_font(cfg, 0);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
for (ch = 33; ch < 127; ch++) {
|
for (ch = 33; ch < 127; ch++) {
|
||||||
@ -301,7 +329,7 @@ NULL
|
|||||||
// Serial.println();
|
// Serial.println();
|
||||||
feed_pitch1(48, cfg->orient);
|
feed_pitch1(48, cfg->orient);
|
||||||
|
|
||||||
|
printer_set_font_mode(cfg, FONT_MODE_0);
|
||||||
printer_set_font(cfg, 0);
|
printer_set_font(cfg, 0);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
for (j = 0; j < strlen(font_names[0]); j++) {
|
for (j = 0; j < strlen(font_names[0]); j++) {
|
||||||
@ -309,6 +337,7 @@ NULL
|
|||||||
}
|
}
|
||||||
parse_serial_stream(cfg, 10);
|
parse_serial_stream(cfg, 10);
|
||||||
|
|
||||||
|
printer_set_font_mode(cfg, FONT_MODE_0);
|
||||||
printer_set_font(cfg, 4);
|
printer_set_font(cfg, 4);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
for (ch = 33; ch < 127; ch++) {
|
for (ch = 33; ch < 127; ch++) {
|
||||||
@ -340,18 +369,17 @@ NULL
|
|||||||
|
|
||||||
feed_pitch1(cfg->font->height, cfg->orient);
|
feed_pitch1(cfg->font->height, cfg->orient);
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
|
printer_set_font_mode(cfg, FONT_MODE_0);
|
||||||
printer_set_font(cfg, 0);
|
printer_set_font(cfg, 0);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
|
|
||||||
// Serial.println(strlen(url),DEC);
|
// Serial.println(strlen(url),DEC);
|
||||||
for (i = 0; i < strlen(url); i++) {
|
for (i = 0; i < strlen(url); i++) {
|
||||||
parse_serial_stream(cfg, url[i]);
|
parse_serial_stream(cfg, url[i]);
|
||||||
|
|
||||||
}
|
}
|
||||||
parse_serial_stream(cfg, 10);
|
parse_serial_stream(cfg, 10);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------
|
//-----------------------------------
|
||||||
// grid
|
// grid
|
||||||
/*
|
/*
|
||||||
@ -375,13 +403,17 @@ NULL
|
|||||||
*/
|
*/
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
feed_pitch1(cfg->font->height * 2, cfg->orient);
|
feed_pitch1(cfg->font->height * 2, cfg->orient);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printer_set_font_mode(CONFIG *cfg, int mode) {
|
||||||
|
cfg->font->mode = mode;
|
||||||
|
return;
|
||||||
|
}
|
||||||
void printer_set_font(CONFIG *cfg, uint8_t fnbits) {
|
void printer_set_font(CONFIG *cfg, uint8_t fnbits) {
|
||||||
uint8_t ret;
|
uint8_t ret;
|
||||||
ret = MID(fnbits, 0, 3);
|
ret = MID(fnbits, 0, 3);
|
||||||
|
|
||||||
|
if (cfg->font->mode == FONT_MODE_0) {
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
cfg->font->width = 8;
|
cfg->font->width = 8;
|
||||||
cfg->font->height = 16;
|
cfg->font->height = 16;
|
||||||
@ -413,11 +445,36 @@ void printer_set_font(CONFIG*cfg,uint8_t fnbits){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cfg->font->mode == FONT_MODE_1) {
|
||||||
|
if (ret == 0) {
|
||||||
|
cfg->font->width = 12;
|
||||||
|
cfg->font->height = 12;
|
||||||
|
}
|
||||||
|
if (ret == 1) {
|
||||||
|
cfg->font->width = 14;
|
||||||
|
cfg->font->height = 14;
|
||||||
|
}
|
||||||
|
if (ret == 2) {
|
||||||
|
cfg->font->width = 16;
|
||||||
|
cfg->font->height = 16;
|
||||||
|
}
|
||||||
|
if (ret == 3) {
|
||||||
|
cfg->font->width = 18;
|
||||||
|
cfg->font->height = 18;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret == 4) {
|
||||||
|
cfg->font->width = 20;
|
||||||
|
cfg->font->height = 20;
|
||||||
|
}
|
||||||
|
change_ft_size(cfg->face, cfg->font->width, cfg->font->height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void parse_cmd(CONFIG *cfg, uint8_t *cmd, uint8_t cmdidx) {
|
void parse_cmd(CONFIG *cfg, uint8_t *cmd, uint8_t cmdidx) {
|
||||||
|
|
||||||
uint8_t ret;
|
uint8_t ret;
|
||||||
|
|
||||||
|
|
||||||
if (cmdidx > 1) {
|
if (cmdidx > 1) {
|
||||||
// ESC 2
|
// ESC 2
|
||||||
if (cmd[0] == ASCII_ESC && cmd[1] == 0x32) {
|
if (cmd[0] == ASCII_ESC && cmd[1] == 0x32) {
|
||||||
@ -429,13 +486,11 @@ void parse_cmd(CONFIG*cfg,uint8_t *cmd, uint8_t cmdidx){
|
|||||||
if (cmd[0] == ASCII_ESC && cmd[1] == 0x40) {
|
if (cmd[0] == ASCII_ESC && cmd[1] == 0x40) {
|
||||||
init_printer();
|
init_printer();
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
|
|
||||||
}
|
}
|
||||||
// DC2 T printer test page
|
// DC2 T printer test page
|
||||||
if (cmd[0] == ASCII_DC2 && cmd[1] == 0x54) {
|
if (cmd[0] == ASCII_DC2 && cmd[1] == 0x54) {
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
printer_test(cfg);
|
printer_test(cfg);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,13 +498,17 @@ void parse_cmd(CONFIG*cfg,uint8_t *cmd, uint8_t cmdidx){
|
|||||||
// ESC j n
|
// ESC j n
|
||||||
if (cmd[0] == ASCII_ESC && cmd[1] == 0x4a) {
|
if (cmd[0] == ASCII_ESC && cmd[1] == 0x4a) {
|
||||||
|
|
||||||
if( print_lines8(cfg) == 0) { feed_pitch1(cmd[2],cfg->orient); }
|
if (print_lines8(cfg) == 0) {
|
||||||
|
feed_pitch1(cmd[2], cfg->orient);
|
||||||
|
}
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
}
|
}
|
||||||
// ESC d n
|
// ESC d n
|
||||||
if (cmd[0] == ASCII_ESC && cmd[1] == 0x64) {
|
if (cmd[0] == ASCII_ESC && cmd[1] == 0x64) {
|
||||||
|
|
||||||
if( print_lines8(cfg) == 0) { feed_pitch1(cmd[2]*cfg->font->height,cfg->orient); }
|
if (print_lines8(cfg) == 0) {
|
||||||
|
feed_pitch1(cmd[2] * cfg->font->height, cfg->orient);
|
||||||
|
}
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
}
|
}
|
||||||
// ESC ! n
|
// ESC ! n
|
||||||
@ -507,7 +566,6 @@ void parse_cmd(CONFIG*cfg,uint8_t *cmd, uint8_t cmdidx){
|
|||||||
}
|
}
|
||||||
|
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ESC SP n
|
// ESC SP n
|
||||||
@ -527,18 +585,37 @@ void parse_cmd(CONFIG*cfg,uint8_t *cmd, uint8_t cmdidx){
|
|||||||
reset_cmd();
|
reset_cmd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// GS V \0 or GS V \1
|
// GS V \0 or GS V \1
|
||||||
if (cmd[0] == ASCII_GS && cmd[1] == 0x56) {
|
if (cmd[0] == ASCII_GS && cmd[1] == 0x56) {
|
||||||
|
|
||||||
ret = cmd[2];
|
ret = cmd[2];
|
||||||
reset_cmd();//When using parse_serial_stream function internally, reset_cmd() first
|
reset_cmd(); // When using parse_serial_stream function internally,
|
||||||
|
// reset_cmd() first
|
||||||
|
|
||||||
print_cut_line(cfg);
|
print_cut_line(cfg);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ESC V n
|
||||||
|
if (cmd[0] == ASCII_ESC && cmd[1] == 0x56) {
|
||||||
|
ret = cmd[2];
|
||||||
|
if (ret == 0x00 || ret == 0x30) {
|
||||||
|
cfg->degree = 0;
|
||||||
|
}
|
||||||
|
if (ret == 0x01 || ret == 0x31) {
|
||||||
|
cfg->degree = 90;
|
||||||
|
}
|
||||||
|
if (ret == 0x02 || ret == 0x32) {
|
||||||
|
cfg->degree = 180;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret == 0x03 || ret == 0x33) {
|
||||||
|
cfg->degree = 270;
|
||||||
|
}
|
||||||
|
printf("set printer degree, %d\n", cfg->degree);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmdidx > 3) {
|
if (cmdidx > 3) {
|
||||||
@ -552,7 +629,6 @@ void parse_cmd(CONFIG*cfg,uint8_t *cmd, uint8_t cmdidx){
|
|||||||
|
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmdidx > 4) {
|
if (cmdidx > 4) {
|
||||||
@ -586,19 +662,17 @@ void parse_cmd(CONFIG*cfg,uint8_t *cmd, uint8_t cmdidx){
|
|||||||
cfg->img->idx = 0;
|
cfg->img->idx = 0;
|
||||||
cfg->img->width = width;
|
cfg->img->width = width;
|
||||||
cfg->img->need_print = 1;
|
cfg->img->need_print = 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
// do not reset_cmd()
|
// do not reset_cmd()
|
||||||
cmd_idx = 0;
|
cmd_idx = 0;
|
||||||
ser_cache.idx = 0;
|
ser_cache.idx = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_serial_stream(CONFIG *cfg, uint8_t input_ch) {
|
void parse_serial_stream(CONFIG *cfg, uint8_t input_ch) {
|
||||||
uint16_t a;
|
uint16_t a;
|
||||||
|
uint8_t bskip;
|
||||||
|
|
||||||
if (cfg->state == GET_IMAGE) {
|
if (cfg->state == GET_IMAGE) {
|
||||||
cfg->img->cache[cfg->img->idx] = input_ch;
|
cfg->img->cache[cfg->img->idx] = input_ch;
|
||||||
@ -628,6 +702,7 @@ void parse_serial_stream(CONFIG*cfg,uint8_t input_ch){
|
|||||||
reset_cmd();
|
reset_cmd();
|
||||||
break;
|
break;
|
||||||
case ASCII_FF:
|
case ASCII_FF:
|
||||||
|
|
||||||
print_lines8(cfg);
|
print_lines8(cfg);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
break;
|
break;
|
||||||
@ -647,23 +722,59 @@ void parse_serial_stream(CONFIG*cfg,uint8_t input_ch){
|
|||||||
cmd_idx++;
|
cmd_idx++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (input_ch < 128) {
|
||||||
ser_cache.data[ser_cache.idx] = input_ch;
|
ser_cache.data[ser_cache.idx] = input_ch;
|
||||||
ser_cache.idx++;
|
ser_cache.idx++;
|
||||||
|
} else { // utf8
|
||||||
|
// 10xxxxxx bskip == 1
|
||||||
|
bskip = get_slice_len(input_ch);
|
||||||
|
|
||||||
a = (ser_cache.idx+1)*current_font.width+(ser_cache.idx)*0+ g_config.margin.width;
|
if (bskip == 1) {
|
||||||
if( a >= MAX_DOTS)
|
// append this to int32_t [8:8:8:8] 0xffffffff 4294967295
|
||||||
|
ser_cache.data[ser_cache.idx] |= input_ch
|
||||||
|
<< (8 * (ser_cache.utf8idx));
|
||||||
|
if (ser_cache.utf8idx ==
|
||||||
|
get_slice_len(ser_cache.data[ser_cache.idx] & 0xff) - 1) {
|
||||||
|
ser_cache.idx++;
|
||||||
|
ser_cache.utf8idx = 0; // next character
|
||||||
|
} else {
|
||||||
|
ser_cache.utf8idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bskip > 1) {
|
||||||
|
ser_cache.utf8idx = 1;
|
||||||
|
ser_cache.data[ser_cache.idx] = input_ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// read utf8 codename
|
||||||
|
//
|
||||||
|
if (cfg->font->mode == FONT_MODE_1) {
|
||||||
|
|
||||||
|
a = get_serial_cache_font_width(&g_config);
|
||||||
|
a += (ser_cache.idx) * 0 + g_config.margin.width;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
a = (ser_cache.idx + 1) * current_font.width + (ser_cache.idx) * 0 +
|
||||||
|
g_config.margin.width;
|
||||||
|
}
|
||||||
|
if (a >= MAX_DOTS) // got enough points to print
|
||||||
{
|
{
|
||||||
|
if (cfg->font->mode == FONT_MODE_1) {
|
||||||
|
print_lines_ft(cfg);
|
||||||
|
} else {
|
||||||
print_lines8(cfg);
|
print_lines8(cfg);
|
||||||
|
}
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Virtual serial port created by socat
|
/* Virtual serial port created by socat
|
||||||
socat -d -d pty,link=/tmp/DEVTERM_PRINTER_OUT,raw,echo=0 pty,link=/tmp/DEVTERM_PRINTER_IN,raw,echo=0
|
socat -d -d pty,link=/tmp/DEVTERM_PRINTER_OUT,raw,echo=0
|
||||||
|
pty,link=/tmp/DEVTERM_PRINTER_IN,raw,echo=0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int read_bat_cap(CONFIG *cfg) {
|
int read_bat_cap(CONFIG *cfg) {
|
||||||
@ -683,7 +794,6 @@ int read_bat_cap(CONFIG*cfg) {
|
|||||||
ret = strtol(c, NULL, 10);
|
ret = strtol(c, NULL, 10);
|
||||||
|
|
||||||
return (int)ret;
|
return (int)ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int bat_cap_to_pts(CONFIG *cfg, int bat) {
|
int bat_cap_to_pts(CONFIG *cfg, int bat) {
|
||||||
@ -693,7 +803,6 @@ int bat_cap_to_pts(CONFIG*cfg,int bat) {
|
|||||||
return pts;
|
return pts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void print_lowpower(CONFIG *cfg) {
|
void print_lowpower(CONFIG *cfg) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
@ -705,14 +814,12 @@ void print_lowpower(CONFIG*cfg) {
|
|||||||
|
|
||||||
for (i = 0; i < strlen(msg); i++) {
|
for (i = 0; i < strlen(msg); i++) {
|
||||||
parse_serial_stream(cfg, msg[i]);
|
parse_serial_stream(cfg, msg[i]);
|
||||||
|
|
||||||
}
|
}
|
||||||
parse_serial_stream(cfg, 10);
|
parse_serial_stream(cfg, 10);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
|
|
||||||
for (i = 0; i < strlen(msg); i++) {
|
for (i = 0; i < strlen(msg); i++) {
|
||||||
parse_serial_stream(cfg, msg[i]);
|
parse_serial_stream(cfg, msg[i]);
|
||||||
|
|
||||||
}
|
}
|
||||||
parse_serial_stream(cfg, 10);
|
parse_serial_stream(cfg, 10);
|
||||||
reset_cmd();
|
reset_cmd();
|
||||||
@ -721,7 +828,6 @@ void print_lowpower(CONFIG*cfg) {
|
|||||||
printer_set_font(cfg, 0);
|
printer_set_font(cfg, 0);
|
||||||
|
|
||||||
PRINTF("%s\n", msg);
|
PRINTF("%s\n", msg);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_battery(CONFIG *cfg) {
|
int check_battery(CONFIG *cfg) {
|
||||||
@ -744,7 +850,6 @@ int check_battery(CONFIG*cfg){
|
|||||||
|
|
||||||
if (cfg->lock == 0) {
|
if (cfg->lock == 0) {
|
||||||
print_lowpower(cfg);
|
print_lowpower(cfg);
|
||||||
|
|
||||||
}
|
}
|
||||||
cfg->lock = 1;
|
cfg->lock = 1;
|
||||||
PRINTF("printer locked\n");
|
PRINTF("printer locked\n");
|
||||||
@ -757,7 +862,6 @@ int check_battery(CONFIG*cfg){
|
|||||||
}
|
}
|
||||||
|
|
||||||
battery_chk_tm.time = millis();
|
battery_chk_tm.time = millis();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg->lock == 1) {
|
if (cfg->lock == 1) {
|
||||||
@ -765,7 +869,6 @@ int check_battery(CONFIG*cfg){
|
|||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FIFO_FILE "/tmp/DEVTERM_PRINTER_OUT"
|
#define FIFO_FILE "/tmp/DEVTERM_PRINTER_OUT"
|
||||||
@ -788,8 +891,7 @@ void loop() {
|
|||||||
fp = fopen(FIFO_FILE, "r+b");
|
fp = fopen(FIFO_FILE, "r+b");
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
g_config.fp = fp;
|
g_config.fp = fp;
|
||||||
while(1)
|
while (1) {
|
||||||
{
|
|
||||||
fread(readbuf, 1, 1, fp);
|
fread(readbuf, 1, 1, fp);
|
||||||
check_battery(&g_config);
|
check_battery(&g_config);
|
||||||
|
|
||||||
@ -803,7 +905,7 @@ void loop() {
|
|||||||
} else { // not a tab
|
} else { // not a tab
|
||||||
parse_serial_stream(&g_config, readbuf[0]);
|
parse_serial_stream(&g_config, readbuf[0]);
|
||||||
}
|
}
|
||||||
} else { //g_config.state == PRINT_STATE
|
} else { // g_config.state != PRINT_STATE
|
||||||
parse_serial_stream(&g_config, readbuf[0]);
|
parse_serial_stream(&g_config, readbuf[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -816,7 +918,6 @@ void loop() {
|
|||||||
}
|
}
|
||||||
//------------------------------------------
|
//------------------------------------------
|
||||||
// printer_test(&g_config);
|
// printer_test(&g_config);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
@ -832,13 +933,10 @@ void setup() {
|
|||||||
init_printer();
|
init_printer();
|
||||||
|
|
||||||
g_config.printf = &printf_out;
|
g_config.printf = &printf_out;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
|
||||||
setup();
|
setup();
|
||||||
loop();
|
loop();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ After=devterm-socat
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
|
EnvironmentFile=/usr/local/etc/devterm-printer
|
||||||
StandardOutput=file:/tmp/devterm_printer.log
|
StandardOutput=file:/tmp/devterm_printer.log
|
||||||
StandardError=file:/tmp/devterm_printer.err.log
|
StandardError=file:/tmp/devterm_printer.err.log
|
||||||
ExecStart=/usr/local/bin/devterm_thermal_printer.elf
|
ExecStart=/usr/local/bin/devterm_thermal_printer.elf
|
||||||
|
|||||||
106
Code/thermal_printer/ftype.c
Normal file
106
Code/thermal_printer/ftype.c
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#include "ftype.h"
|
||||||
|
|
||||||
|
#include "utf8-utils.h"
|
||||||
|
|
||||||
|
static const UTF32 utf32_space[2] = {' ', 0};
|
||||||
|
|
||||||
|
bool init_ft(const char *ttf_file, FT_Face *face, FT_Library *ft,
|
||||||
|
int req_size_w, int req_size_h, char **error) {
|
||||||
|
|
||||||
|
bool ret = false;
|
||||||
|
if (FT_Init_FreeType(ft) == 0) {
|
||||||
|
if (FT_New_Face(*ft, ttf_file, 0, face) == 0) {
|
||||||
|
|
||||||
|
if (FT_Set_Pixel_Sizes(*face, req_size_w, req_size_h) == 0) {
|
||||||
|
ret = true;
|
||||||
|
} else {
|
||||||
|
if (error)
|
||||||
|
*error = strdup("Can't set font size");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (error)
|
||||||
|
*error = strdup("Can't load TTF file");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (error)
|
||||||
|
*error = strdup("Can't init freetype library");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool change_ft_size(FT_Face face, int req_size_w, int req_size_h) {
|
||||||
|
bool ret = false;
|
||||||
|
if (FT_Set_Pixel_Sizes(face, req_size_w, req_size_h) == 0) {
|
||||||
|
ret = true;
|
||||||
|
} else {
|
||||||
|
printf("Can't set font size");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
/*===========================================================================
|
||||||
|
done_ft
|
||||||
|
Clean up after we've finished wih the FreeType librar
|
||||||
|
=========================================================================*/
|
||||||
|
void done_ft(FT_Library ft) { FT_Done_FreeType(ft); }
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
|
||||||
|
face_get_line_spacing
|
||||||
|
|
||||||
|
Get the nominal line spacing, that is, the distance between glyph
|
||||||
|
baselines for vertically-adjacent rows of text. This is "nominal" because,
|
||||||
|
in "real" typesetting, we'd need to add extra room for accents, etc.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
int face_get_line_spacing(FT_Face face) {
|
||||||
|
return face->size->metrics.height / 64;
|
||||||
|
// There are other possibilities the give subtly different results:
|
||||||
|
// return (face->bbox.yMax - face->bbox.yMin) / 64;
|
||||||
|
// return face->height / 64;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_slice_len(const char lb) {
|
||||||
|
|
||||||
|
if ((lb & 0x80) == 0)
|
||||||
|
return 1;
|
||||||
|
else if ((lb & 0xE0) == 0xC0)
|
||||||
|
return 2;
|
||||||
|
else if ((lb & 0xF0) == 0xE0)
|
||||||
|
return 3;
|
||||||
|
else if ((lb & 0xF8) == 0xF0)
|
||||||
|
return 4;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
UTF32 *cjk_utf8_to_utf32(const char *word) {
|
||||||
|
assert(word != NULL);
|
||||||
|
int l = strlen(word);
|
||||||
|
int u8l = utf8_strlen(word);
|
||||||
|
|
||||||
|
char buf[5];
|
||||||
|
|
||||||
|
UTF32 *ret = malloc((u8l + 1) * sizeof(UTF32));
|
||||||
|
int i = 0, j = 0;
|
||||||
|
int bskip = 1;
|
||||||
|
|
||||||
|
while (i < l) {
|
||||||
|
|
||||||
|
bskip = get_slice_len(word[i]);
|
||||||
|
strncpy(buf, &word[i], bskip);
|
||||||
|
if (bskip > 1) {
|
||||||
|
ret[j] = (UTF32)utf8_to_utf32(buf);
|
||||||
|
} else {
|
||||||
|
ret[j] = (UTF32)buf[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
j++;
|
||||||
|
i += bskip;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret[u8l] = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
29
Code/thermal_printer/ftype.h
Normal file
29
Code/thermal_printer/ftype.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef FTYPE_H
|
||||||
|
#define FTYPE_H
|
||||||
|
// clang-format off
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <freetype2/ft2build.h>
|
||||||
|
|
||||||
|
#include <freetype/freetype.h>
|
||||||
|
// clang-format on
|
||||||
|
#ifndef UTF8
|
||||||
|
typedef unsigned char UTF8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef UTF32
|
||||||
|
typedef int32_t UTF32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool init_ft(const char *ttf_file, FT_Face *face, FT_Library *ft,
|
||||||
|
int req_size_w, int req_size_h, char **error);
|
||||||
|
|
||||||
|
bool change_ft_size(FT_Face face, int req_size_w, int req_size_h);
|
||||||
|
|
||||||
|
int face_get_line_spacing(FT_Face face);
|
||||||
|
|
||||||
|
int get_slice_len(const char lb);
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -1,14 +1,13 @@
|
|||||||
|
#include <glob.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
|
||||||
#include <glob.h>
|
|
||||||
|
|
||||||
#include <wiringPi.h>
|
#include <wiringPi.h>
|
||||||
#include <wiringPiSPI.h>
|
#include <wiringPiSPI.h>
|
||||||
|
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@ -27,22 +26,19 @@ static uint8_t printer_temp_check;
|
|||||||
|
|
||||||
static char adc_file_path[128];
|
static char adc_file_path[128];
|
||||||
|
|
||||||
|
void printer_send_data8(uint8_t w) {
|
||||||
void printer_send_data8(uint8_t w)
|
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
digitalWrite(SPI1_NSS_PIN, LOW); // manually take CSN low for SPI_1 transmission
|
digitalWrite(SPI1_NSS_PIN, LOW); // manually take CSN low for SPI_1
|
||||||
SPI.transfer(w); //Send the HEX data 0x55 over SPI-1 port and store the received byte to the <data> variable.
|
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);
|
//SPI.transfer16(w);
|
||||||
digitalWrite(SPI1_NSS_PIN, HIGH); // manually take CSN high between spi transmissions
|
digitalWrite(SPI1_NSS_PIN, HIGH); // manually take CSN high between spi
|
||||||
|
transmissions
|
||||||
*/
|
*/
|
||||||
wiringPiSPIDataRW(0, &w, 1);
|
wiringPiSPIDataRW(0, &w, 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear_printer_buffer() {
|
||||||
void clear_printer_buffer()
|
|
||||||
{
|
|
||||||
uint8_t i = 0;
|
uint8_t i = 0;
|
||||||
|
|
||||||
for (i = 0; i < 48; i++)
|
for (i = 0; i < 48; i++)
|
||||||
@ -54,9 +50,7 @@ void clear_printer_buffer()
|
|||||||
delayus(1);
|
delayus(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t IsPaper() {
|
||||||
uint8_t IsPaper()
|
|
||||||
{
|
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
uint8_t tmp;
|
uint8_t tmp;
|
||||||
return IS_PAPER;
|
return IS_PAPER;
|
||||||
@ -64,9 +58,12 @@ uint8_t IsPaper()
|
|||||||
if (millis() - printer_vps_time > 10) {
|
if (millis() - printer_vps_time > 10) {
|
||||||
ENABLE_PEM;
|
ENABLE_PEM;
|
||||||
if (ASK4PAPER == LOW) // * LOW is what we want**
|
if (ASK4PAPER == LOW) // * LOW is what we want**
|
||||||
{status = IS_PAPER;}
|
{
|
||||||
else
|
status = IS_PAPER;
|
||||||
{status = NO_PAPER; PRINTF("Error:NO PAPER\n"); }
|
} else {
|
||||||
|
status = NO_PAPER;
|
||||||
|
PRINTF("Error:NO PAPER\n");
|
||||||
|
}
|
||||||
DISABLE_PEM;
|
DISABLE_PEM;
|
||||||
|
|
||||||
if (printer_temp_check > 20) {
|
if (printer_temp_check > 20) {
|
||||||
@ -87,14 +84,12 @@ uint8_t IsPaper()
|
|||||||
status = printer_vps_last_status;
|
status = printer_vps_last_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
printer_vps_last_status = status;
|
printer_vps_last_status = status;
|
||||||
printer_vps_time = millis();
|
printer_vps_time = millis();
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t header_init() {
|
uint8_t header_init() {
|
||||||
|
|
||||||
uint8_t pin[] = {THERMISTORPIN};
|
uint8_t pin[] = {THERMISTORPIN};
|
||||||
@ -115,7 +110,6 @@ uint8_t header_init() {
|
|||||||
pinMode(PEM_PIN, INPUT);
|
pinMode(PEM_PIN, INPUT);
|
||||||
// pinMode(PEM_CTL_PIN,OUTPUT);
|
// pinMode(PEM_CTL_PIN,OUTPUT);
|
||||||
|
|
||||||
|
|
||||||
// adc.setChannels(pin, 1); //this is actually the pin you want to measure
|
// adc.setChannels(pin, 1); //this is actually the pin you want to measure
|
||||||
|
|
||||||
pinMode(THERMISTORPIN, INPUT); // 数字io没有 模拟接口。adc 读温度暂时不搞
|
pinMode(THERMISTORPIN, INPUT); // 数字io没有 模拟接口。adc 读温度暂时不搞
|
||||||
@ -124,9 +118,9 @@ uint8_t header_init() {
|
|||||||
//SPI.begin(); //Initialize the SPI_1 port.
|
//SPI.begin(); //Initialize the SPI_1 port.
|
||||||
SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order
|
SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order
|
||||||
SPI.setDataMode(SPI_MODE0); //Set the SPI_1 data mode 0
|
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.setClockDivider(SPI_CLOCK_DIV16); // Slow speed (72 / 16 = 4.5 MHz
|
||||||
SPI.setDataSize(DATA_SIZE_8BIT);
|
SPI_1 speed) SPI.setDataSize(DATA_SIZE_8BIT); SPI.begin(); //Initialize the
|
||||||
SPI.begin(); //Initialize the SPI_1 port.
|
SPI_1 port.
|
||||||
*/
|
*/
|
||||||
if (!wiringPiSPISetup(0, 4500000)) {
|
if (!wiringPiSPISetup(0, 4500000)) {
|
||||||
PRINTF("SPI init failed,exiting...\n");
|
PRINTF("SPI init failed,exiting...\n");
|
||||||
@ -142,10 +136,8 @@ uint8_t header_init() {
|
|||||||
printer_temp_check = 0;
|
printer_temp_check = 0;
|
||||||
|
|
||||||
glob_file(ADC_FILE_PAT);
|
glob_file(ADC_FILE_PAT);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
|
|
||||||
uint8_t current_pos = 1;
|
uint8_t current_pos = 1;
|
||||||
@ -198,24 +190,20 @@ void motor_stepper_pos2(uint8_t position)//forward
|
|||||||
digitalWrite(PB_PIN, LOW);
|
digitalWrite(PB_PIN, LOW);
|
||||||
digitalWrite(PNB_PIN, HIGH);
|
digitalWrite(PNB_PIN, HIGH);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t feed_pitch1(uint64_t lines, uint8_t forward_backward)
|
uint8_t feed_pitch1(uint64_t lines, uint8_t forward_backward) {
|
||||||
{
|
|
||||||
uint8_t pos = current_pos;
|
uint8_t pos = current_pos;
|
||||||
uint8_t restor = ~forward_backward;
|
uint8_t restor = ~forward_backward;
|
||||||
|
|
||||||
restor &= 0x01;
|
restor &= 0x01;
|
||||||
|
|
||||||
if(lines>0)
|
if (lines > 0) {
|
||||||
{
|
|
||||||
MOTOR_ENABLE1;
|
MOTOR_ENABLE1;
|
||||||
MOTOR_ENABLE2;
|
MOTOR_ENABLE2;
|
||||||
ENABLE_VH;
|
ENABLE_VH;
|
||||||
while(lines>0)
|
while (lines > 0) {
|
||||||
{
|
|
||||||
motor_stepper_pos2(pos); /* 0.0625mm */
|
motor_stepper_pos2(pos); /* 0.0625mm */
|
||||||
|
|
||||||
if (pos >= 1 && pos <= 4)
|
if (pos >= 1 && pos <= 4)
|
||||||
@ -229,18 +217,14 @@ uint8_t feed_pitch1(uint64_t lines, uint8_t forward_backward)
|
|||||||
MOTOR_DISABLE2;
|
MOTOR_DISABLE2;
|
||||||
DISABLE_VH;
|
DISABLE_VH;
|
||||||
|
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
return ERROR_FEED_PITCH;
|
return ERROR_FEED_PITCH;
|
||||||
}
|
}
|
||||||
current_pos = pos;
|
current_pos = pos;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_dots_8bit_split(CONFIG*cfg,uint8_t *Array, uint8_t characters)
|
void print_dots_8bit_split(CONFIG *cfg, uint8_t *Array, uint8_t characters) {
|
||||||
{
|
|
||||||
uint8_t i = 0, y = 0, MAX = MAXPIXELS;
|
uint8_t i = 0, y = 0, MAX = MAXPIXELS;
|
||||||
uint8_t blank;
|
uint8_t blank;
|
||||||
uint16_t pts;
|
uint16_t pts;
|
||||||
@ -279,21 +263,19 @@ void print_dots_8bit_split(CONFIG*cfg,uint8_t *Array, uint8_t characters)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_dots_8bit(CONFIG*cfg,uint8_t *Array, uint8_t characters,uint8_t feed_num)
|
void print_dots_8bit(CONFIG *cfg, uint8_t *Array, uint8_t characters,
|
||||||
{
|
uint8_t feed_num) {
|
||||||
uint8_t i = 0, y = 0, MAX = MAXPIXELS;
|
uint8_t i = 0, y = 0, MAX = MAXPIXELS;
|
||||||
uint8_t blank;
|
uint8_t blank;
|
||||||
|
|
||||||
ENABLE_VH;
|
ENABLE_VH;
|
||||||
|
|
||||||
if (cfg->align == 0) {
|
if (cfg->align == 0) {
|
||||||
while((i<characters) && (i < MAX))
|
while ((i < characters) && (i < MAX)) {
|
||||||
{
|
|
||||||
printer_send_data8(Array[i]);
|
printer_send_data8(Array[i]);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
while( i < MAX)
|
while (i < MAX) {
|
||||||
{
|
|
||||||
printer_send_data8(0x00);
|
printer_send_data8(0x00);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -327,12 +309,9 @@ void print_dots_8bit(CONFIG*cfg,uint8_t *Array, uint8_t characters,uint8_t feed_
|
|||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
while(y<STB_NUMBER)
|
while (y < STB_NUMBER) {
|
||||||
{
|
|
||||||
|
|
||||||
while(i <10)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
while (i < 10) {
|
||||||
|
|
||||||
digitalWrite(STBx[y], HIGH);
|
digitalWrite(STBx[y], HIGH);
|
||||||
delayus(HEAT_TIME + cfg->density * 46);
|
delayus(HEAT_TIME + cfg->density * 46);
|
||||||
@ -344,10 +323,8 @@ void print_dots_8bit(CONFIG*cfg,uint8_t *Array, uint8_t characters,uint8_t feed_
|
|||||||
y++;
|
y++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
feed_pitch1(feed_num, cfg->orient);
|
feed_pitch1(feed_num, cfg->orient);
|
||||||
|
|
||||||
|
|
||||||
DISABLE_VH;
|
DISABLE_VH;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -372,18 +349,14 @@ uint16_t read_adc(char*adc_file) {
|
|||||||
return (uint16_t)ret;
|
return (uint16_t)ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16_t temperature() {
|
uint16_t temperature() {
|
||||||
|
|
||||||
|
|
||||||
double Rthermistor = 0, TempThermistor = 0;
|
double Rthermistor = 0, TempThermistor = 0;
|
||||||
uint16_t ADCSamples = 0;
|
uint16_t ADCSamples = 0;
|
||||||
int Sample = 1;
|
int Sample = 1;
|
||||||
uint16_t ADCConvertedValue;
|
uint16_t ADCConvertedValue;
|
||||||
|
|
||||||
|
while (Sample <= NumSamples) {
|
||||||
while(Sample<=NumSamples)
|
|
||||||
{
|
|
||||||
// ADCSamples += analogRead(THERMISTORPIN); //stm32
|
// ADCSamples += analogRead(THERMISTORPIN); //stm32
|
||||||
ADCSamples += read_adc(adc_file_path);
|
ADCSamples += read_adc(adc_file_path);
|
||||||
Sample++;
|
Sample++;
|
||||||
@ -401,7 +374,6 @@ uint16_t temperature() {
|
|||||||
|
|
||||||
return (uint16_t)(TempThermistor - 273.15);
|
return (uint16_t)(TempThermistor - 273.15);
|
||||||
|
|
||||||
|
|
||||||
// return (uint16_t)(0);
|
// return (uint16_t)(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -409,7 +381,8 @@ int glob_file(char*av) {
|
|||||||
|
|
||||||
glob_t globlist;
|
glob_t globlist;
|
||||||
|
|
||||||
if (glob(av, GLOB_PERIOD|GLOB_NOSORT, NULL, &globlist) == GLOB_NOSPACE || glob(av, GLOB_PERIOD|GLOB_NOSORT, NULL, &globlist) == GLOB_NOMATCH)
|
if (glob(av, GLOB_PERIOD | GLOB_NOSORT, NULL, &globlist) == GLOB_NOSPACE ||
|
||||||
|
glob(av, GLOB_PERIOD | GLOB_NOSORT, NULL, &globlist) == GLOB_NOMATCH)
|
||||||
return -1;
|
return -1;
|
||||||
if (glob(av, GLOB_PERIOD | GLOB_NOSORT, NULL, &globlist) == GLOB_ABORTED)
|
if (glob(av, GLOB_PERIOD | GLOB_NOSORT, NULL, &globlist) == GLOB_ABORTED)
|
||||||
return 1;
|
return 1;
|
||||||
@ -418,13 +391,207 @@ int glob_file(char*av) {
|
|||||||
strcpy(adc_file_path, globlist.gl_pathv[0]);
|
strcpy(adc_file_path, globlist.gl_pathv[0]);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
uint16_t get_serial_cache_font_width(CONFIG *cfg) {
|
||||||
|
|
||||||
|
int i;
|
||||||
|
uint8_t *ch;
|
||||||
|
uint32_t codename;
|
||||||
|
int w;
|
||||||
|
w = 0;
|
||||||
|
i = 0;
|
||||||
|
while (i < ser_cache.idx) {
|
||||||
|
ch = (uint8_t *)&ser_cache.data[i];
|
||||||
|
codename = utf8_to_utf32(ch);
|
||||||
|
FT_UInt gi = FT_Get_Char_Index(cfg->face, codename);
|
||||||
|
FT_Load_Glyph(cfg->face, gi, FT_LOAD_NO_BITMAP);
|
||||||
|
w += cfg->face->glyph->metrics.horiAdvance / 64;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return w + cfg->font->width;
|
||||||
|
}
|
||||||
|
|
||||||
|
// print with freetype font dots glyph
|
||||||
|
uint8_t print_lines_ft(CONFIG *cfg) {
|
||||||
|
uint8_t i, j, k;
|
||||||
|
int8_t w;
|
||||||
|
uint8_t dot_line_data[MAXPIXELS];
|
||||||
|
uint8_t dot_line_idx = 0;
|
||||||
|
uint8_t dot_line_bitsidx = 0;
|
||||||
|
|
||||||
|
uint8_t lastidx, lastw, lastj;
|
||||||
|
uint8_t row, row_cnt;
|
||||||
|
uint16_t line_bits;
|
||||||
|
|
||||||
|
int8_t left = ser_cache.idx;
|
||||||
|
uint8_t rv;
|
||||||
|
|
||||||
|
line_bits = cfg->margin.width;
|
||||||
|
dot_line_idx = line_bits / 8;
|
||||||
|
dot_line_bitsidx = line_bits % 8;
|
||||||
|
|
||||||
|
lastidx = 0;
|
||||||
|
lastw = 0;
|
||||||
|
lastj = 0;
|
||||||
|
|
||||||
|
uint32_t codename;
|
||||||
|
uint8_t *ch;
|
||||||
|
printf("left = %d\n", left);
|
||||||
|
int line_height = (cfg->face->size->metrics.ascender -
|
||||||
|
cfg->face->size->metrics.descender) >>
|
||||||
|
6;
|
||||||
|
int baseline_height =
|
||||||
|
abs(cfg->face->descender) * current_font.height / cfg->face->units_per_EM;
|
||||||
|
int dpx = 64;
|
||||||
|
FT_Matrix matrix;
|
||||||
|
|
||||||
|
while (left > 0) {
|
||||||
|
i = lastidx;
|
||||||
|
row_cnt = 0;
|
||||||
|
row = 0;
|
||||||
|
while (row < line_height) {
|
||||||
|
line_bits = cfg->margin.width;
|
||||||
|
dot_line_idx = line_bits / 8;
|
||||||
|
dot_line_bitsidx = line_bits % 8;
|
||||||
|
memset(dot_line_data, 0, MAXPIXELS);
|
||||||
|
// line by line bitmap dots to print
|
||||||
|
i = lastidx;
|
||||||
|
|
||||||
|
while (i < ser_cache.idx) {
|
||||||
|
ch = (uint8_t *)&ser_cache.data[i];
|
||||||
|
codename = utf8_to_utf32(ch);
|
||||||
|
|
||||||
|
matrix.xx = (FT_Fixed)(cos(((double)cfg->degree / 360) * 3.14159 * 2) *
|
||||||
|
0x10000L);
|
||||||
|
matrix.xy = (FT_Fixed)(-sin(((double)cfg->degree / 360) * 3.14159 * 2) *
|
||||||
|
0x10000L);
|
||||||
|
matrix.yx = (FT_Fixed)(sin(((double)cfg->degree / 360) * 3.14159 * 2) *
|
||||||
|
0x10000L);
|
||||||
|
matrix.yy = (FT_Fixed)(cos(((double)cfg->degree / 360) * 3.14159 * 2) *
|
||||||
|
0x10000L);
|
||||||
|
FT_Set_Transform(cfg->face, &matrix, NULL);
|
||||||
|
|
||||||
|
FT_UInt gi = FT_Get_Char_Index(cfg->face, codename);
|
||||||
|
FT_Load_Glyph(cfg->face, gi, FT_LOAD_DEFAULT);
|
||||||
|
int y_off = line_height - baseline_height -
|
||||||
|
cfg->face->glyph->metrics.horiBearingY / dpx;
|
||||||
|
int glyph_width = cfg->face->glyph->metrics.width / dpx;
|
||||||
|
int glyph_height = cfg->face->glyph->metrics.height / dpx;
|
||||||
|
int advance = cfg->face->glyph->metrics.horiAdvance / dpx;
|
||||||
|
|
||||||
|
int x_off = (advance - glyph_width) / 2;
|
||||||
|
|
||||||
|
int bitmap_rows = cfg->face->glyph->bitmap.rows;
|
||||||
|
int bitmap_width = cfg->face->glyph->bitmap.width;
|
||||||
|
// FT_Render_Glyph(cfg->face->glyph, FT_RENDER_MODE_NORMAL);
|
||||||
|
FT_Render_Glyph(cfg->face->glyph, FT_RENDER_MODE_MONO); // disable AA
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
w = 0;
|
||||||
|
if (lastj != 0) {
|
||||||
|
j = lastj;
|
||||||
|
}
|
||||||
|
if (lastw != 0) {
|
||||||
|
w = lastw;
|
||||||
|
}
|
||||||
|
while (w < advance) {
|
||||||
|
// if(w > 0 && (w%8) == 0) j++;
|
||||||
|
if (dot_line_bitsidx > 7) {
|
||||||
|
dot_line_idx++;
|
||||||
|
dot_line_bitsidx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// unsigned char p = cfg->face->glyph->bitmap.buffer[row *
|
||||||
|
// cfg->face->glyph->bitmap.pitch + w];
|
||||||
|
unsigned char p = 0;
|
||||||
|
int pitch = abs(cfg->face->glyph->bitmap.pitch);
|
||||||
|
|
||||||
|
if (w >= x_off && row >= y_off) {
|
||||||
|
row_cnt = row - y_off;
|
||||||
|
if (row_cnt < bitmap_rows) {
|
||||||
|
// p =
|
||||||
|
// (cfg->face->glyph->bitmap.buffer[row_cnt*cfg->face->glyph->bitmap.pitch+j]
|
||||||
|
// >> (7-w%8)) & 1;//disable AA
|
||||||
|
j = (w - x_off) / 8;
|
||||||
|
p = cfg->face->glyph->bitmap.buffer[row_cnt * pitch + j];
|
||||||
|
p = p & (128 >> ((w - x_off) & 7));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p) {
|
||||||
|
printf("#");
|
||||||
|
dot_line_data[dot_line_idx] |= 1 << (7 - dot_line_bitsidx);
|
||||||
|
} else {
|
||||||
|
printf("0");
|
||||||
|
}
|
||||||
|
|
||||||
|
dot_line_bitsidx++;
|
||||||
|
w++;
|
||||||
|
line_bits++;
|
||||||
|
if (line_bits >= MAX_DOTS)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// 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 == (line_height - 1)) { // last of the row loop
|
||||||
|
if (w >= advance) {
|
||||||
|
lastidx = i + 1;
|
||||||
|
lastw = 0;
|
||||||
|
lastj = 0;
|
||||||
|
} else {
|
||||||
|
lastidx = i;
|
||||||
|
lastw = w;
|
||||||
|
lastj = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rv = IsPaper();
|
||||||
|
if (rv == IS_PAPER) {
|
||||||
|
// DEBUG("dot_line_idx",dot_line_idx);
|
||||||
|
// DEBUG("dot_line_bits",dot_line_bitsidx);
|
||||||
|
print_dots_8bit_split(cfg, dot_line_data, dot_line_idx + 1);
|
||||||
|
}
|
||||||
|
row++;
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
left = left - lastidx;
|
||||||
|
row = 0;
|
||||||
|
/*
|
||||||
|
if(cfg->line_space > cfg->font->height){
|
||||||
|
feed_pitch1(cfg->line_space - cfg->font->height,cfg->orient);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t print_lines8(CONFIG *cfg) {
|
uint8_t print_lines8(CONFIG *cfg) {
|
||||||
|
|
||||||
|
if (cfg->font->mode == FONT_MODE_1) {
|
||||||
|
return print_lines_ft(cfg);
|
||||||
|
}
|
||||||
uint8_t i, j, k;
|
uint8_t i, j, k;
|
||||||
int8_t w;
|
int8_t w;
|
||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
@ -458,7 +625,6 @@ uint8_t print_lines8(CONFIG*cfg) {
|
|||||||
data = (uint8_t *)malloc(sizeof(uint8_t) * (pad + 1));
|
data = (uint8_t *)malloc(sizeof(uint8_t) * (pad + 1));
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
|
|
||||||
line_bits = cfg->margin.width;
|
line_bits = cfg->margin.width;
|
||||||
|
|
||||||
dot_line_idx = line_bits / 8;
|
dot_line_idx = line_bits / 8;
|
||||||
@ -481,16 +647,22 @@ uint8_t print_lines8(CONFIG*cfg) {
|
|||||||
// DEBUG("i",i)
|
// DEBUG("i",i)
|
||||||
// DEBUG("ser_cache.idx",ser_cache.idx)
|
// DEBUG("ser_cache.idx",ser_cache.idx)
|
||||||
while (i < ser_cache.idx) {
|
while (i < ser_cache.idx) {
|
||||||
addr = pad*ser_cache.data[i]*current_font.height;
|
addr = pad * (uint8_t)ser_cache.data[i] * current_font.height;
|
||||||
for (j = 0; j < pad; j++) {
|
for (j = 0; j < pad; j++) {
|
||||||
data[j] = current_font.data[addr + row * pad + j];
|
data[j] = current_font.data[addr + row * pad + j];
|
||||||
}
|
}
|
||||||
j=0; w=0;
|
j = 0;
|
||||||
if(lastj !=0){j= lastj;}
|
w = 0;
|
||||||
if(lastw !=0) { w = lastw;}
|
if (lastj != 0) {
|
||||||
|
j = lastj;
|
||||||
|
}
|
||||||
|
if (lastw != 0) {
|
||||||
|
w = lastw;
|
||||||
|
}
|
||||||
|
|
||||||
while (w < current_font.width) {
|
while (w < current_font.width) {
|
||||||
if(w > 0 && ( w%8) == 0)j++;
|
if (w > 0 && (w % 8) == 0)
|
||||||
|
j++;
|
||||||
if (dot_line_bitsidx > 7) {
|
if (dot_line_bitsidx > 7) {
|
||||||
dot_line_idx++;
|
dot_line_idx++;
|
||||||
dot_line_bitsidx = 0;
|
dot_line_bitsidx = 0;
|
||||||
@ -506,7 +678,8 @@ uint8_t print_lines8(CONFIG*cfg) {
|
|||||||
dot_line_bitsidx++;
|
dot_line_bitsidx++;
|
||||||
w++;
|
w++;
|
||||||
line_bits++;
|
line_bits++;
|
||||||
if(line_bits >= MAX_DOTS)break;
|
if (line_bits >= MAX_DOTS)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// word gap
|
/// word gap
|
||||||
@ -520,7 +693,8 @@ uint8_t print_lines8(CONFIG*cfg) {
|
|||||||
k++;
|
k++;
|
||||||
dot_line_bitsidx++;
|
dot_line_bitsidx++;
|
||||||
line_bits++;
|
line_bits++;
|
||||||
if(line_bits >= MAX_DOTS)break;
|
if (line_bits >= MAX_DOTS)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line_bits < MAX_DOTS) {
|
if (line_bits < MAX_DOTS) {
|
||||||
@ -558,7 +732,6 @@ uint8_t print_lines8(CONFIG*cfg) {
|
|||||||
if (cfg->line_space > cfg->font->height) {
|
if (cfg->line_space > cfg->font->height) {
|
||||||
feed_pitch1(cfg->line_space - cfg->font->height, cfg->orient);
|
feed_pitch1(cfg->line_space - cfg->font->height, cfg->orient);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serial.println("print ever");
|
// Serial.println("print ever");
|
||||||
@ -568,7 +741,6 @@ uint8_t print_lines8(CONFIG*cfg) {
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t print_image8(CONFIG *cfg) {
|
uint8_t print_image8(CONFIG *cfg) {
|
||||||
|
|
||||||
uint16_t height;
|
uint16_t height;
|
||||||
@ -584,14 +756,11 @@ uint8_t print_image8(CONFIG*cfg){
|
|||||||
|
|
||||||
rv = IsPaper();
|
rv = IsPaper();
|
||||||
|
|
||||||
while(y < height )
|
while (y < height) {
|
||||||
{
|
|
||||||
x = 0;
|
x = 0;
|
||||||
while( x < cfg->img->width )
|
while (x < cfg->img->width) {
|
||||||
{
|
|
||||||
addr = x + y * cfg->img->width;
|
addr = x + y * cfg->img->width;
|
||||||
|
|
||||||
|
|
||||||
if (cfg->img->revert_bits > 0) // LSB
|
if (cfg->img->revert_bits > 0) // LSB
|
||||||
LinePixels[x] = invert_bit(cfg->img->cache[addr]);
|
LinePixels[x] = invert_bit(cfg->img->cache[addr]);
|
||||||
else
|
else
|
||||||
@ -633,5 +802,4 @@ void print_cut_line(CONFIG*cfg){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
parse_serial_stream(cfg, ASCII_FF);
|
parse_serial_stream(cfg, ASCII_FF);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
//#define PRINT_SPLIT 6 // max points printed at the same time, 384/PRINT_SPLIT==96
|
//#define PRINT_SPLIT 6 // max points printed at the same time,
|
||||||
//#define MAX_PRINT_PTS 2
|
//384/PRINT_SPLIT==96 #define MAX_PRINT_PTS 2
|
||||||
|
|
||||||
void printer_send_data8(uint8_t);
|
void printer_send_data8(uint8_t);
|
||||||
|
|
||||||
@ -24,12 +24,14 @@ uint8_t bits_number(uint8_t n);
|
|||||||
|
|
||||||
void print_dots_8bit_split(CONFIG *cfg, uint8_t *Array, uint8_t characters);
|
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);
|
void print_dots_8bit(CONFIG *cfg, uint8_t *Array, uint8_t characters,
|
||||||
|
uint8_t feed_num);
|
||||||
|
|
||||||
uint16_t read_adc(char *);
|
uint16_t read_adc(char *);
|
||||||
uint16_t temperature();
|
uint16_t temperature();
|
||||||
int glob_file(char *);
|
int glob_file(char *);
|
||||||
|
uint16_t get_serial_cache_font_width(CONFIG *);
|
||||||
|
uint8_t print_lines_ft(CONFIG *);
|
||||||
uint8_t print_lines8(CONFIG *);
|
uint8_t print_lines8(CONFIG *);
|
||||||
|
|
||||||
uint8_t invert_bit(uint8_t a);
|
uint8_t invert_bit(uint8_t a);
|
||||||
@ -37,6 +39,7 @@ uint8_t invert_bit(uint8_t a);
|
|||||||
uint8_t print_image8(CONFIG *);
|
uint8_t print_image8(CONFIG *);
|
||||||
void print_cut_line(CONFIG *);
|
void print_cut_line(CONFIG *);
|
||||||
|
|
||||||
|
void printer_set_font_mode(CONFIG *cfg, int);
|
||||||
void printer_set_font(CONFIG *cfg, uint8_t fnbits);
|
void printer_set_font(CONFIG *cfg, uint8_t fnbits);
|
||||||
void parse_serial_stream(CONFIG *cfg, uint8_t input_ch);
|
void parse_serial_stream(CONFIG *cfg, uint8_t input_ch);
|
||||||
|
|
||||||
|
|||||||
12
Code/thermal_printer/test.txt
Normal file
12
Code/thermal_printer/test.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
“励志一生”网站精心挑选汇集了60句宋词佳句,转载过来与大家分享,也很值得收藏!
|
||||||
|
|
||||||
|
1. 一ada;场消黯,永日无言,却下层楼。——柳永〈曲玉管〉
|
||||||
|
|
||||||
|
2. 可惜流asdfsad年,忧愁风雨,树犹如此。——辛弃疾〈水龙吟.登建康赏心亭〉
|
||||||
|
|
||||||
|
3. 十年生死两茫茫,不dsafadsf思量,自难忘。——苏轼〈江城子〉
|
||||||
|
|
||||||
|
4. 纵使相逢应不识,尘满面,鬓nbqga&*(如霜。——苏轼〈江城子〉
|
||||||
|
|
||||||
|
5. 相顾无言,惟有泪千行。——苏轼〈江城子〉
|
||||||
|
|
||||||
1
Code/thermal_printer/usr/local/etc/devterm-printer
Normal file
1
Code/thermal_printer/usr/local/etc/devterm-printer
Normal file
@ -0,0 +1 @@
|
|||||||
|
TTF=/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc
|
||||||
83
Code/thermal_printer/utf8-utils.c
Normal file
83
Code/thermal_printer/utf8-utils.c
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/* Freetype GL - A C OpenGL Freetype engine
|
||||||
|
*
|
||||||
|
* Distributed under the OSI-approved BSD 2-Clause License. See accompanying
|
||||||
|
* file `LICENSE` for more details.
|
||||||
|
*/
|
||||||
|
#include <string.h>
|
||||||
|
#include "utf8-utils.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------- utf8_surrogate_len ---
|
||||||
|
size_t
|
||||||
|
utf8_surrogate_len( const char* character )
|
||||||
|
{
|
||||||
|
size_t result = 0;
|
||||||
|
char test_char;
|
||||||
|
|
||||||
|
if (!character)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
test_char = character[0];
|
||||||
|
|
||||||
|
if ((test_char & 0x80) == 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
while (test_char & 0x80)
|
||||||
|
{
|
||||||
|
test_char <<= 1;
|
||||||
|
result++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------ utf8_strlen ---
|
||||||
|
size_t
|
||||||
|
utf8_strlen( const char* string )
|
||||||
|
{
|
||||||
|
const char* ptr = string;
|
||||||
|
size_t result = 0;
|
||||||
|
|
||||||
|
while (*ptr)
|
||||||
|
{
|
||||||
|
ptr += utf8_surrogate_len(ptr);
|
||||||
|
result++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t
|
||||||
|
utf8_to_utf32( const char * character )
|
||||||
|
{
|
||||||
|
if( !character )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( character[0] & 0x80 ) == 0x0 )
|
||||||
|
{
|
||||||
|
return character[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( character[0] & 0xE0 ) == 0xC0 )
|
||||||
|
{
|
||||||
|
return ( ( character[0] & 0x3F ) << 6 ) | ( character[1] & 0x3F );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( character[0] & 0xF0 ) == 0xE0 )
|
||||||
|
{
|
||||||
|
return ( ( character[0] & 0x1F ) << ( 6 + 6 ) ) | ( ( character[1] & 0x3F ) << 6 ) | ( character[2] & 0x3F );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( character[0] & 0xF8 ) == 0xF0 )
|
||||||
|
{
|
||||||
|
return ( ( character[0] & 0x0F ) << ( 6 + 6 + 6 ) ) | ( ( character[1] & 0x3F ) << ( 6 + 6 ) ) | ( ( character[2] & 0x3F ) << 6 ) | ( character[3] & 0x3F );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( character[0] & 0xFC ) == 0xF8 )
|
||||||
|
{
|
||||||
|
return ( ( character[0] & 0x07 ) << ( 6 + 6 + 6 + 6 ) ) | ( ( character[1] & 0x3F ) << ( 6 + 6 + 6 ) ) | ( ( character[2] & 0x3F ) << ( 6 + 6 ) ) | ( ( character[3] & 0x3F ) << 6 ) | ( character[4] & 0x3F );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0xFFFD; // invalid character
|
||||||
|
}
|
||||||
68
Code/thermal_printer/utf8-utils.h
Normal file
68
Code/thermal_printer/utf8-utils.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/* Freetype GL - A C OpenGL Freetype engine
|
||||||
|
*
|
||||||
|
* Distributed under the OSI-approved BSD 2-Clause License. See accompanying
|
||||||
|
* file `LICENSE` for more details.
|
||||||
|
*/
|
||||||
|
#ifndef __UTF8_UTILS_H__
|
||||||
|
#define __UTF8_UTILS_H__
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
namespace ftgl {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file utf8-utils.h
|
||||||
|
* @author Marcel Metz <mmetz@adrian-broher.net>
|
||||||
|
*
|
||||||
|
* defgroup utf8-utils UTF-8 Utilities
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the size in bytes of a given UTF-8 encoded character surrogate
|
||||||
|
*
|
||||||
|
* @param character An UTF-8 encoded character
|
||||||
|
*
|
||||||
|
* @return The length of the surrogate in bytes.
|
||||||
|
*/
|
||||||
|
size_t
|
||||||
|
utf8_surrogate_len( const char* character );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the length of the given UTF-8 encoded and
|
||||||
|
* NULL terminated string.
|
||||||
|
*
|
||||||
|
* @param string An UTF-8 encoded string
|
||||||
|
*
|
||||||
|
* @return The length of the string in characters.
|
||||||
|
*/
|
||||||
|
size_t
|
||||||
|
utf8_strlen( const char* string );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a given UTF-8 encoded character to its UTF-32 LE equivalent
|
||||||
|
*
|
||||||
|
* @param character An UTF-8 encoded character
|
||||||
|
*
|
||||||
|
* @return The equivalent of the given character in UTF-32 LE
|
||||||
|
* encoding.
|
||||||
|
*/
|
||||||
|
uint32_t
|
||||||
|
utf8_to_utf32( const char * character );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* #define __UTF8_UTILS_H__ */
|
||||||
@ -1,13 +1,12 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
void delayus(unsigned int _us){
|
void delayus(unsigned int _us) { delayMicroseconds(_us); }
|
||||||
delayMicroseconds(_us);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t invert_bit(uint8_t a) {
|
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);
|
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 bits_number(uint8_t n) // count bits "1"
|
||||||
@ -19,6 +18,3 @@ uint8_t bits_number(uint8_t n)//count bits "1"
|
|||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,26 @@
|
|||||||
#ifndef UTILS_H
|
#ifndef UTILS_H
|
||||||
#define UTILS_H
|
#define UTILS_H
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <wiringPi.h>
|
#include <wiringPi.h>
|
||||||
|
|
||||||
#define SEP printf(" ");
|
#define SEP printf(" ");
|
||||||
// a is string, b is number
|
// a is string, b is number
|
||||||
#define DEBUG(a,b) printf(a);SEP;printf("%d\n",b);
|
#define DEBUG(a, b) \
|
||||||
|
printf(a); \
|
||||||
|
SEP; \
|
||||||
|
printf("%d\n", b);
|
||||||
|
|
||||||
#define ALINE printf("\n");
|
#define ALINE printf("\n");
|
||||||
|
|
||||||
#define PRINTF(...) { printf(__VA_ARGS__);fflush(stdout);}
|
#define PRINTF(...) \
|
||||||
|
{ \
|
||||||
|
printf(__VA_ARGS__); \
|
||||||
|
fflush(stdout); \
|
||||||
|
}
|
||||||
|
|
||||||
void delayus(unsigned int _us);
|
void delayus(unsigned int _us);
|
||||||
|
|
||||||
@ -21,5 +28,4 @@ uint8_t invert_bit(uint8_t a);
|
|||||||
|
|
||||||
uint8_t bits_number(uint8_t n);
|
uint8_t bits_number(uint8_t n);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user