Raspberry PiからPPMファイルを表示するプログラムを組んでみました。
こちらの記事のPBMファイル作成と同じようにGIMPで96x64へリサイズして、PPMフォーマットへエクスポートします。
プログラムはこのような感じです。
#include <stdio.h>
#include <stdlib.h>
#include <wiringPiSPI.h>
#include <wiringPi.h>
#define N 256
#define PORT_DC 21
#define PORT_RES 20
#define SPI_CHANNEL 0
#define SPI_SPEED 100000
#define DATA 1
#define CMD 0
void write_cmd( unsigned char*, int);
void write_data(unsigned char*, int);
int spi_setup(void);
int disp_ppm(char*);
int main(
int argc,
char *argv[]
){
if(argc != 2){
printf("Usage: %s [ppm file]\n", argv[0]);
return(-1);
}
if(spi_setup() < 0){
return(-1);
}
if(disp_ppm(argv[1]) < 0){
return(-1);
}
return(0);
}
void write_cmd(
unsigned char* wd,
int length
){
digitalWrite(PORT_DC, CMD);
wiringPiSPIDataRW(SPI_CHANNEL, wd, length);
}
void write_data(
unsigned char* wd,
int length
){
digitalWrite(PORT_DC, DATA);
wiringPiSPIDataRW(SPI_CHANNEL, wd, length);
}
int spi_setup(void){
if((wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED)) < 0){
printf("Error: wiringPiSPISetup()\n");
return(-1);
}
if(wiringPiSetupGpio() == -1){
printf("Error: wiringPiSetupGpio()\n");
return(-1);
}
pinMode(PORT_DC, OUTPUT);
pinMode(PORT_RES, OUTPUT);
digitalWrite(PORT_DC, 0);
digitalWrite(PORT_RES, 0);
delay(100);
digitalWrite(PORT_RES, 1);
delay(100);
return(0);
}
int disp_ppm(
char* fname
){
FILE *fp;
char line[N];
int r, g, b;
unsigned char wd[16];
fp = fopen(fname, "r");
if(fp==NULL){
printf("Error: Can't open file %s\n", fname);
return(-1);
}
fgets(line, N, fp);
fgets(line, N, fp);
fgets(line, N, fp);
fgets(line, N, fp);
wd[0] = 0xa0;
wd[1] = 0x60;
wd[2] = 0x15;
wd[3] = 0;
wd[4] = 95;
wd[5] = 0x75;
wd[6] = 0;
wd[7] = 63;
wd[8] = 0xaf;
write_cmd(&wd[0], 9);
for(int i=0; i<(96*64); i++){
fgets(line, N, fp); r = strtol(line, NULL, 10);
fgets(line, N, fp); g = strtol(line, NULL, 10);
fgets(line, N, fp); b = strtol(line, NULL, 10);
r >>= 3;
g >>= 2;
b >>= 3;
wd[0] = (r << 3) | (g >> 3) & 0xff;
wd[1] = (g << 5) | (b << 0) & 0xff;
write_data(&wd[0], 2);
}
fclose(fp);
return(0);
}
コンパイルを行い実行時の引数に
PPMファイルを指定します。
$ gcc spi.c -lwiringPi
$ ./a.out xxxx.ppm
なお、PPMファイルはGIMPからエクスポートしたフォーマットを対象にしているので、それ以外のフォーマットでは正しく表示できないと思いますのでご了承ください。
[参考記事]