e-paper whereabouts board program
Dependencies: SDFileSystem mbed
Diff: eink.cpp
- Revision:
- 1:cb28911c7ba5
- Parent:
- 0:e4c67c26ba3f
--- a/eink.cpp Sun May 01 03:12:28 2016 +0000 +++ b/eink.cpp Tue May 23 05:06:14 2017 +0000 @@ -1,374 +1,340 @@ +/* EDP control program */ + #include "mbed.h" #include "extdio.h" #include "eink.h" +int clPulseCount = 0; //for CL pluse count -//initialize port +//Initialize the port void initPort() { setCL( 0 ); - setContBas( LE , 0); - setContBas( OE , 0); - setContBas( NC10 , 1); - setContBas( SPH , 1); + setContBus( LE , 0); + setContBus( OE , 0); + setContBus( NC10 , 1); + setContBus( SPH , 1); - setContBas( GMODE , 0); - setContBas( SPV , 1); - setContBas( CKV , 0); - setContBas( EN , 0); + setContBus( GMODE , 0); + setContBus( SPV , 1); + setContBus( CKV , 0); + setContBus( EN , 0); + + setDataBus( 0b00000001 ); + setDataBus( 0b00000000 ); - setDataBas( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ); + return; } -//pageStart +//page start sequence void pageStart() { - setContBas( GMODE , 1 ); - setContBas( CKV , 1 ); + setContBus( GMODE , 1 ); + setContBus( CKV , 1 ); wait_us(11); - setContBas( SPV , 0 ); + setContBus( SPV , 0 ); wait_us(11); - setContBas( CKV , 0 ); + setContBus( CKV , 0 ); wait_us(10); - setContBas( CKV , 1 ); + setContBus( CKV , 1 ); wait_us(10); - setContBas( SPV , 1 ); + setContBus( SPV , 1 ); wait_us(12); - setContBas( CKV , 0 ); + setContBus( CKV , 0 ); wait_us(10); - setContBas( CKV , 1 ); + setContBus( CKV , 1 ); wait_us(22); - setContBas( CKV , 0 ); + setContBus( CKV , 0 ); wait_us(10); - setContBas( CKV , 1 ); + setContBus( CKV , 1 ); wait_us(22); - setContBas( CKV , 0 ); + setContBus( CKV , 0 ); wait_us(10); - setContBas( CKV , 1 ); + setContBus( CKV , 1 ); wait_us(1); + + return; } -//lineStart +//line startsequence void lineStart() { - setCL( 1 ); - setCL( 0 ); - setContBas( LE , 0 ); - wait_us(1); + setContBus( LE , 0 ); + setContBus( OE , 1 ); + setContBus( SPH , 0 ); - setCL( 1 ); - setCL( 0 ); - wait_us(1); + clPulseCount = 0; + + return; +} - setCL( 1 ); - setCL( 0 ); - wait_us(1); +//center of line sequence +void changeSPH() +{ + setContBus( SPH , 1 ); + setContBus( NC10 , 0 ); - setCL( 1 ); - setCL( 0 ); - setContBas( OE , 1 ); - wait_us(1); + return; +} +//4bit draw sequence +void setDrawData( char data ) +{ + setDataBus( data ); setCL( 1 ); setCL( 0 ); - setContBas( SPH , 0 ); -} - -//drow pixels -void drowPixelsRaw( bool d7 , bool d6 , bool d5 , bool d4 , bool d3 , bool d2 , bool d1 , bool d0 ) -{ - setDataBas( d7 , d6 , d5 , d4 , d3 , d2 , d1 , d0 ); - setCL( 1 ); - setCL( 0 ); + + //SPH change when CL puls is 200 + clPulseCount++; + if( clPulseCount == EDP_WIDTH/8 ) + { + changeSPH(); + } + + return; } -//lineEnd +//end line sequence void lineEnd() { - setContBas( NC10 , 1 ); - setContBas( CKV , 0 ); - - setCL( 1 ); - setCL( 0 ); + setContBus( NC10 , 1 ); + setContBus( CKV , 0 ); wait_us(10); - setContBas( OE , 0 ); - setContBas( LE , 1 ); - setContBas( CKV , 1 ); + setContBus( OE , 0 ); + setContBus( LE , 1 ); + setContBus( CKV , 1 ); wait_us(1); } -//pageEnd +//end page sequence void pageEnd() { - setCL( 1 ); - setCL( 0 ); - setContBas( LE , 0 ); + setContBus( LE , 0 ); + setContBus( OE , 1 ); - setCL( 1 ); - setCL( 0 ); - - setCL( 1 ); - setCL( 0 ); - - setCL( 1 ); - setCL( 0 ); - setContBas( OE , 1 ); - - setCL( 1 ); - setCL( 0 ); - - for( int i=0 ; i<200 ; i++ ) + for( int i=0 ; i<EDP_WIDTH/4 ; i++ ) { setCL( 1 ); setCL( 0 ); } - setContBas( CKV , 0 ); - - setCL( 1 ); - setCL( 0 ); - + setContBus( CKV , 0 ); wait_us(10); - setContBas( OE , 0 ); - + setContBus( OE , 0 ); wait_us(330); - - setContBas( GMODE , 0 ); + setContBus( GMODE , 0 ); wait_us(130); } -//change SPH signals -void changeSPH() -{ - setContBas( SPH , 1 ); - setContBas( NC10 , 0 ); -} -//turn off the power +//trun off EDP void powerOff() { - setDataBas( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ); + setDataBus( 0b00000000 ); setCL( 0 ); - setContBas( LE , 0); - setContBas( OE , 0); - setContBas( NC10 , 0); - setContBas( SPH , 0); + setContBus( LE , 0); + setContBus( OE , 0); + setContBus( NC10 , 0); + setContBus( SPH , 0); - setContBas( GMODE , 0); - setContBas( SPV , 0); - setContBas( CKV , 0); + setContBus( GMODE , 0); + setContBus( SPV , 0); + setContBus( CKV , 0); - setContBas( EN , 1); + setContBus( EN , 1); + + return; } -//turn on the power +//turn on EDP void powerOn() { - setContBas( EN , 0); + setContBus( EN , 0); + wait_us(100); + + return; } -//clear screen 0:Black 1:White -void clrdisp( bool color ) +//fill color +//drawMode EDP_WHITE:white EDP_BLACK:black +void clrDisp( char drawMode ) { + char data; + if( drawMode == EDP_WHITE) + data = 0b01010101; //all pixels white + else + data = 0b10101010; //all pixels black + pageStart(); - for( int j=0 ; j<600 ; j++) + for( int j=0 ; j<EDP_HEIGHT ; j++) { lineStart(); - for( int i=0 ; i<100 ; i++ ) + for( int i=0 ; i<EDP_WIDTH ; i+=4 ) { - if( color == 1) - drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); //Draw white - else - drowPixelsRaw( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 ); //Draw black - } - changeSPH(); - for( int i=100 ; i<200 ; i++ ) - { - if( color == 1) - drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); //Draw white - else - drowPixelsRaw( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 ); //Draw black + setDrawData( data ); } lineEnd(); } pageEnd(); + + return; } - - -//Drow 8pixels paletteWhite: 0:draw white at 0 of a data bit, 1:draw white at 1 of a data bit -void drowPixels( char data , bool paletteWhite ) +//draw 8pixels bmp data +// data: (MSB)b0A b0B b1A b1B b2A b2B b3A bB3(LSB) +// b0 b1 b2 b4:pixels +// AB: 10:black 01:white 00:transparent +// drawMode: EDP_BLACK draw black at black pixel and draw transparent at white pixel +// EDP_WHITE draw white at white pixel and draw transparent at black pixel +// EDP_BLACK_WHITE draw black at black pixel and draw white at white pixel +void drowPixels( char data , char drawMode ) { - if( paletteWhite == 0 ) + char _data = 0; + switch( drawMode ) { - drowPixelsRaw( (data&0x10)!=0 , 1 , (data&0x20)!=0 , 1 , (data&0x40)!=0 , 1 , (data&0x80)!=0 , 1 ); - drowPixelsRaw( (data&0x01)!=0 , 1 , (data&0x02)!=0 , 1 , (data&0x04)!=0 , 1 , (data&0x08)!=0 , 1 ); - //drowPixelsRaw( (data&0x10)!=0 , (data&0x10)==0 , (data&0x20)!=0 , (data&0x20)==0 , (data&0x40)!=0 , (data&0x40)==0 , (data&0x80)!=0 , (data&0x80)==0 ); - //drowPixelsRaw( (data&0x01)!=0 , (data&0x01)==0 , (data&0x02)!=0 , (data&0x02)==0 , (data&0x04)!=0 , (data&0x04)==0 , (data&0x08)!=0 , (data&0x08)==0 ); + case EDP_BLACK : + _data = 0; + _data |= ((data&0x10)==0)<<7; + _data |= ((data&0x20)==0)<<5; + _data |= ((data&0x40)==0)<<3; + _data |= ((data&0x80)==0)<<1; + setDrawData( _data ); + _data = 0; + _data |= ((data&0x01)==0)<<7; + _data |= ((data&0x02)==0)<<5; + _data |= ((data&0x04)==0)<<3; + _data |= ((data&0x08)==0)<<1; + setDrawData( _data ); + break; + case EDP_WHITE : + _data = 0; + _data |= ((data&0x10)!=0)<<6; + _data |= ((data&0x20)!=0)<<4; + _data |= ((data&0x40)!=0)<<2; + _data |= ((data&0x80)!=0); + setDrawData( _data ); + _data = 0; + _data |= ((data&0x01)!=0)<<6; + _data |= ((data&0x02)!=0)<<4; + _data |= ((data&0x04)!=0)<<2; + _data |= ((data&0x08)!=0); + setDrawData( _data ); + break; + default : + _data = 0; + _data |= ((data&0x10)==0)<<7; + _data |= ((data&0x10)!=0)<<6; + _data |= ((data&0x20)==0)<<5; + _data |= ((data&0x20)!=0)<<4; + _data |= ((data&0x40)==0)<<3; + _data |= ((data&0x40)!=0)<<2; + _data |= ((data&0x80)==0)<<1; + _data |= ((data&0x80)!=0); + setDrawData( _data ); + _data = 0; + _data |= ((data&0x01)==0)<<7; + _data |= ((data&0x01)!=0)<<6; + _data |= ((data&0x02)==0)<<5; + _data |= ((data&0x02)!=0)<<4; + _data |= ((data&0x04)==0)<<3; + _data |= ((data&0x04)!=0)<<2; + _data |= ((data&0x08)==0)<<1; + _data |= ((data&0x08)!=0); + setDrawData( _data ); + break; } - else - { - drowPixelsRaw( (data&0x10)==0 , 1 , (data&0x20)==0 , 1 , (data&0x40)==0 , 1 , (data&0x80)==0 , 1 ); - drowPixelsRaw( (data&0x01)==0 , 1 , (data&0x02)==0 , 1 , (data&0x04)==0 , 1 , (data&0x08)==0 , 1 ); - //drowPixelsRaw( (data&0x10)==0 , (data&0x10)!=0 , (data&0x20)==0 , (data&0x20)!=0 , (data&0x40)==0 , (data&0x40)!=0 , (data&0x80)==0 , (data&0x80)!=0 ); - //drowPixelsRaw( (data&0x01)==0 , (data&0x01)!=0 , (data&0x02)==0 , (data&0x02)!=0 , (data&0x04)==0 , (data&0x04)!=0 , (data&0x08)==0 , (data&0x08)!=0 ); - } -} - -//draw BMP file of fp(File Pointer) at locate(0,0) -//BMP width and hight size is multiples of 8pixel -void dispbmp(FILE *fp ) -{ - dispbmp( fp , 0 , 0 ); + + return; } -//draw BMP file of fp(File Pointer) at locate(xpos,ypos) -//BMP width and hight size is multiples of 8pixel -//locate parametors are multiples of 8pixel -void dispbmp(FILE *fp , int xpos , int ypos) +//display the bmp image to EDP +// drawMode: EDP_BLACK draw black at black pixel and draw transparent at white pixel +// EDP_WHITE draw white at white pixel and draw transparent at black pixel +// EDP_BLACK_WHITE draw black at black pixel and draw white at white pixel +void dispBmp(FILE *fp , char drawMode ) { - char bmpdata; - int size; - - //check file pointer is avalable. - if( fp == NULL ) - { - fclose(fp); - free(fp); - - //not avalable - clrdisp(1); //clear White - clrdisp(0); //clear Black - clrdisp(1); //clear White - clrdisp(0); //clear Black - - return; - } - + bool paletteWhite = 0; //white palette number + char bmpdata[EDP_WIDTH/8]; //data buffer for one line + + //confirm the filepointer is available + if( fp == NULL ) + { + fclose(fp); + free(fp); + + //unavailable + clrDisp(EDP_WHITE); //fill white + clrDisp(EDP_BLACK); //fill black + clrDisp(EDP_WHITE); //fill white + clrDisp(EDP_BLACK); //fill black - - //get Image Width and hight pixels - unsigned int xsize , ysize; - fseek(fp, 18 , SEEK_SET);//to xsize - size = fread( &xsize , sizeof(unsigned int) , 1 , fp); - size = fread( &ysize , sizeof(unsigned int) , 1 , fp); - - - //decide witch value(0 or 1 of the image data bit) is writing in white dot - unsigned char palettetemp[8]; - fseek(fp, 54 , SEEK_SET);//bitmap headder throw - size = fread( palettetemp , sizeof(char) , 8 , fp); - int palette0 = (int)palettetemp[0]+(int)palettetemp[1]+(int)palettetemp[2]; //sum of palette0 RGBvaue - int palette1 = (int)palettetemp[4]+(int)palettetemp[5]+(int)palettetemp[6]; //sum of palette1 RGBvaue - bool paletteWhite = 0; - if( palette0 > palette1 ) - { - paletteWhite = 0; //draw white in the bit value 0 of BMP data - } - else - { - paletteWhite = 1; //draw white in the bit value 1 of BMP data - } - - //go to bmp image data - unsigned int dataOffset; - fseek(fp, 10 , SEEK_SET); - size = fread( &dataOffset , sizeof(unsigned int) , 1 , fp); - fseek(fp, dataOffset , SEEK_SET); + return; + } + + //get image wight anf height + unsigned int bmpWidth , bmpHeight; + fseek(fp, 18 , SEEK_SET);//to xsize + fread( &bmpWidth , sizeof(unsigned int) , 1 , fp); + fread( &bmpHeight , sizeof(unsigned int) , 1 , fp); + if( bmpWidth != EDP_WIDTH || bmpHeight != EDP_HEIGHT ) + { + fclose(fp); + free(fp); + + //not match size with EDP + clrDisp(EDP_WHITE); //fill white + clrDisp(EDP_BLACK); //fill black + clrDisp(EDP_WHITE); //fill white - pageStart(); - - //pass line until drow y position - for( int j=0 ; j<ypos ; j++) - { - lineStart(); - for( int i=0 ; i<100 ; i++ ) - drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); - changeSPH(); - for( int i=0 ; i<100 ; i++ ) - drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); - lineEnd(); - } - - for( int j=ypos ; j<ysize+ypos ; j++) + return; + } + + //get palette data + unsigned char paletteTemp[8]; + fseek(fp, 54 , SEEK_SET);//bitmap headder throw + fread( paletteTemp , sizeof(char) , 8 , fp); + int palette0 = (int)paletteTemp[0]+(int)paletteTemp[1]+(int)paletteTemp[2]; + int palette1 = (int)paletteTemp[4]+(int)paletteTemp[5]+(int)paletteTemp[6]; + if( palette0 > palette1 ) //select white palette number,witch the braightest palette + paletteWhite = 0; // + else + paletteWhite = 1; // + + //skip to image data + unsigned int dataOffset; + fseek(fp, 10 , SEEK_SET); + fread( &dataOffset , sizeof(unsigned int) , 1 , fp); + fseek(fp, dataOffset , SEEK_SET); + + //dwar bmp data to EDP + pageStart(); + for( int j=0 ; j<EDP_HEIGHT ; j++) + { + //read for one line and chage to bit for white is 1 and black is 0 + fread( &bmpdata , sizeof(char) , EDP_WIDTH/8 , fp); + if( paletteWhite == 0 ) { - lineStart(); - - for( int i=0 ; i<100 ; i+=2 ) - { - if( i>=(xpos/4) && i<((xsize+xpos)/4) ) - { - size = fread( &bmpdata , sizeof(char) , 1 , fp); - if( size != 1 ) - { - drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); //if it can not read , draw in white - drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); - } - else - { - drowPixels(bmpdata,paletteWhite); //draw - } - } - else - { - drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); //not draw at out of image - drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); - } - } - changeSPH(); - for( int i=100 ; i<200 ; i+=2 ) - { - if( i>=(xpos/4) && i<((xsize+xpos)/4) ) // - { - size = fread( &bmpdata , sizeof(char) , 1 , fp); - if( size != 1 ) - { - drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); //if it can not read , draw in white - drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); - } - else - { - drowPixels(bmpdata,paletteWhite); - } - } - else - { - drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); //not draw at out of image - drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); - } - - } - - //pass the data over 800pixels - if( (xsize+xpos)>800 ) - { - int dataPass = ((xsize+xpos)-800)/8; - fseek(fp, dataPass , SEEK_CUR); - } - - lineEnd(); + for( int i=0 ; i<EDP_WIDTH/8 ; i++ ) + bmpdata[i] = ~bmpdata[i]; } - - //pass remain lines - for( int j=ypos+ysize ; j<600 ; j++) + + lineStart(); + for( int i=0 ; i<EDP_WIDTH ; i+=8 ) { - lineStart(); - for( int i=0 ; i<100 ; i++ ) - drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); //not draw - changeSPH(); - for( int i=0 ; i<100 ; i++ ) - drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); //not draw - lineEnd(); + drowPixels(bmpdata[i/8],drawMode); } - - pageEnd(); + lineEnd(); + + } + pageEnd(); + + return; } -