|
|
当サイトは、玄箱PRO (KURO-BOX/Pro)を中心とした組み込み、Linuxと電子工作を扱っています。
会社案内
情報セキュリティおよび個人情報の取り扱いについて コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。コメントはそれぞれ投稿した人のものです。 |
ABC<シフトイン>日本語<シフトアウト>XYZSJIS は、DOS, Windows や Mac で長く使われてきました。シフトイン、シフトアウトが必要ない コードです。制御文字 (0x00 から 0x1f), 英数字 (0x20 から 0x7f), 半角カナの範囲を避けるよう にして作られています。2バイト目に '\' (C言語で \n に使う `\' です)が含まれるため、それを考 慮したプログラムが必要になるという問題があります。 EUC は、主に UNIX 上のプログラムで使われてきたコードです。シフトイン、シフトアウトが必要 ない、JIS コードとの変換が容易、'\' が2バイト目に使われることがないと特長があります。半角カ ナを表現しようとすると3バイト必要になるというのがプログラム上問題になることがあります。
MODULE_EXPORT void
sed1520_string (Driver *drvthis, int x, int y, const char string[])
{
PrivateData *p = drvthis-> private_data;
int i;
x--; // Convert 1-based coords to 0-based
y--;
for (i = 0; string[i] != '¥0'; i++) {
if (string[i] < 0x80) {
drawchar2fb(p->framebuf, x + i, y, string[i]);
} else {
int knj = 0;
// If next byte is '¥0', we should stop here
if (string[i+1] == '¥0')
break;
// EUC -> JIS
knj = ((string[i] << 8 ) | string[i+1]) - 0x8080;
drawkchar2fb(p-> framebuf, x + i, y, knj);
i ++;
}
}
}
STARTCHAR 2422 ENCODING 9250 SWIDTH 1097 0 DWIDTH 8 0 BBX 8 8 0 -2 BITMAP 20 7c 20 3c 6a b2 64 00 ENDCHAR
「あ」の例
また、フォント・データは、各行が横の8ドット分を表していますが、プログラム内では液晶にあわ せて縦8ドットが1バイトに収まるような縦横の変換をしています(add2fontmap() 内で変換)。これに より、drawkchar2fb() の処理を簡単にしています。
MSB LSB
LSB □□■□□□□□ 00100000 0x20
□■■■■■□□ 01111100 0x7c
□□■□□□□□ 00100000 0x20
□□■■■■□□ 00111100 0x3c
□■■□■□■□ 01101010 0x6a
■□■■□□■□ 10110010 0xb2
□■■□□■□□ 01100100 0x64
MSB □□□□□□□□ 00000000 0x00
内部表記(16進) 2進数表記 misaki.bdf での16進表記
20 7f 16 30
52 26 4a 00
それから、JIS コードの数値は連続していないので、そのままメモリを確保すると無駄が生じるの
で、jis2id() 関数を用意して内部で使用するメモリを減らしています。
static void
akiglcd_flush (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
const static char *aglcd_col[] = {aglcd_home,
"x1bN0610r",
aglcd_col2,
"x1bN0611r",
aglcd_col3,
"x1bN0612r",
aglcd_col4,
"x1bN0613r"};
unsigned char *o, *n;
int i, j, skip = 1;
debug(RPT_DEBUG, "%s: FLUSHn",drvthis->name);
o = p->framebuf0;
n = p->framebuf;
for (i=0; i
if (*(n+i) == 'x1b')
*(n+i) = 'x3b'; // XXX
}
for (i=0; i<4; i ++) {
for (j=0; j<2; j ++) {
if (bcmp(n, o, PIXELWIDTH/2) != 0) {
if (skip != 0) {
akiglcd_write(p->fd, aglcd_col[i*2 + j], 7);
akiglcd_checkret(p->fd, '@');
}
write(p->fd, n, PIXELWIDTH/2);
usleep(1*1000);
bcopy(n, o, PIXELWIDTH/2);
skip = 0;
} else {
skip = 1;
}
o += (PIXELWIDTH/2);
n += (PIXELWIDTH/2);
}
}
}
このブログ記事を参照しているブログ一覧: lcdproc のドライバの書き方 (後編)
このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/1222
おすすめ書籍 |
![]() |
コメントする