Treva.h | |
---|---|
#include "mbed.h" class Treva { private: DigitalOut *clock; DigitalIn *data; int width; int height; public: Treva() { clock = new DigitalOut(p5); // pink, orange data = new DigitalIn(p6); // yellow width =96; height=72; } Treva(PinName clk, PinName dat) { clock = new DigitalOut(clk); // pink, orange data = new DigitalIn(dat); // yellow width =96; height=72; } void getImage(unsigned char* buffer); // 1bit読み出し処理 unsigned char read_bit(void); }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Treva.cpp | |
---|---|
#include "Treva.h" void Treva::getImage(unsigned char* buffer) { int magic, i, j, k, n; unsigned char d; magic = 0; while((magic & 0xffffff) != 0xaa55ff){ magic <<=1; if( read_bit() == 1) magic |= 1; }; magic=0; // 連続29byte分を無視 for(i=0; i<29*8; i++) if( read_bit() == 0); // 続く16bit分のデータは無視 for( i=0; i<16; i++ ) read_bit(); // ここから画像データ取得開始 int line=0; for( k=0; k < height; k++){ for(n=0; n<width*2; n++){ d = 0; for (i=0; i<8; i++){ d <<= 1; if(read_bit()) d |= 1; } *buffer++= d; } } } // 1bit読み出し処理 unsigned char Treva::read_bit(void) { unsigned char a; for(int i=0; i<6; i++) *clock=1;; a = *data; for(int i=0; i<18; i++) *clock=0; return a; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
main.cpp | |
---|---|
#include "mbed.h" #include "NokiaLCD.h" #include "Treva.h" typedef unsigned char BYTE; void Treva16(unsigned char* img); NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::PCF8833); // mosi, sclk, cs, rst, type Treva camera(p29,p30); // clk(pink), data(yellow) unsigned char buffer[72*96*2]; int main() { while(true) { camera.getImage(buffer); Treva16(buffer); } } void Treva16(BYTE* img) { BYTE x=96, y=72; int Height=72, Width=96; BYTE ch; int Y, U, V, red, green, blue; int errCount=0; const float AmpCoef=1.5; int p; for(int i=0; i<Height; i++){ for(int j=0; j<Width; j++){ p=(i*Width + j)*2; Y= img[p+1]; if(j % 2 == 0){ V = img[p]; U = img[p+2]; }else{ V; U = img[p]; } U -= 128; V -= 128; blue= U + Y; green= (int)(Y*0.98- U*0.53 - V*0.19); red= (V + Y)*AmpCoef*AmpCoef; green *= AmpCoef; blue*=AmpCoef; if(255 < red) red = 255; if(red < 0) red = 0; if(255 < green) green = 255; if(green < 0) green = 0; if(255 < blue) blue = 255; if(blue < 0) blue = 0; x = (red & 0xf8) | (green>>5); y = ((green&7)<<5) | (blue>>3); int color = red<<16 | green <<8 | blue; lcd.pixel(j+20, i+20, color); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |