e-paper whereabouts board program

Dependencies:   SDFileSystem mbed

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;
 }
 
-