e-paper whereabouts board program

Dependencies:   SDFileSystem mbed

eink.cpp

Committer:
kohacraft
Date:
2017-05-23
Revision:
2:9150515ecd68
Parent:
1:cb28911c7ba5

File content as of revision 2:9150515ecd68:

/* EDP control program */

#include "mbed.h"
#include "extdio.h"
#include "eink.h"

int clPulseCount = 0;   //for CL pluse count

//Initialize the port
void initPort()
{
    setCL( 0 );
    setContBus( LE , 0);
    setContBus( OE , 0);
    setContBus( NC10 , 1);
    setContBus( SPH , 1);

    setContBus( GMODE , 0);
    setContBus( SPV , 1);
    setContBus( CKV , 0);
    setContBus( EN , 0);

    setDataBus( 0b00000001 );
    setDataBus( 0b00000000 );
    
    return;
}

//page start sequence
void pageStart()
{   

    setContBus( GMODE , 1 );
    setContBus( CKV , 1 );
    wait_us(11);
    setContBus( SPV , 0 ); 
    wait_us(11);
    setContBus( CKV , 0 );
    wait_us(10);
    setContBus( CKV , 1 );
    wait_us(10);
    setContBus( SPV , 1 ); 
    wait_us(12);

    setContBus( CKV , 0 );
    wait_us(10);
    setContBus( CKV , 1 );
    wait_us(22);
    setContBus( CKV , 0 );
    wait_us(10);
    setContBus( CKV , 1 );
    wait_us(22);
    setContBus( CKV , 0 );
    wait_us(10);
    setContBus( CKV , 1 );
    wait_us(1);
    
    return;
}

//line startsequence
void lineStart()
{
    
    setContBus( LE , 0 );
    setContBus( OE , 1 );
    setContBus( SPH , 0 );
    
    clPulseCount = 0;
    
    return;
}

//center of line sequence
void changeSPH()
{
    setContBus( SPH , 1 );
    setContBus( NC10 , 0 );
    
    return;    
}

//4bit draw sequence
void setDrawData( char data )
{
    setDataBus( data );
    setCL( 1 );
    setCL( 0 );
    
    //SPH change when CL puls is 200
    clPulseCount++;
    if( clPulseCount == EDP_WIDTH/8 )
    {
        changeSPH();
    }
    
    return;
}

//end line sequence
void lineEnd()
{
    setContBus( NC10 , 1 );
    setContBus( CKV , 0 );
    wait_us(10);
    
    setContBus( OE , 0 );
    setContBus( LE , 1 );
    setContBus( CKV , 1 );
    wait_us(1);
}

//end page sequence
void pageEnd()
{
    setContBus( LE , 0 );
    setContBus( OE , 1 );
    
    for( int i=0 ; i<EDP_WIDTH/4 ; i++ )
    {
        setCL( 1 );
        setCL( 0 );
    }
    setContBus( CKV , 0 );
    wait_us(10);    
    setContBus( OE , 0 );
    wait_us(330);
    setContBus( GMODE , 0 );
    wait_us(130);

}


//trun off EDP
void powerOff()
{
    setDataBus( 0b00000000 );

    setCL( 0 );
    setContBus( LE , 0);
    setContBus( OE , 0);
    setContBus( NC10 , 0);
    setContBus( SPH , 0);

    setContBus( GMODE , 0);
    setContBus( SPV , 0);
    setContBus( CKV , 0);
    
    setContBus( EN , 1);
    
    return;
    
}

//turn on EDP
void powerOn()
{
    setContBus( EN , 0);
    wait_us(100);
    
    return;
}

//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<EDP_HEIGHT ; j++)
    {
        lineStart(); 
        for( int i=0 ; i<EDP_WIDTH ; i+=4 )            
        {
            setDrawData( data );
        }
        lineEnd();
        
    }
    pageEnd();
    
    return;
}

//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  )
{
    char _data = 0;
    switch( drawMode )
    {
        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;
    }
    
    return;
}

//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 )
{
    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
        
        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
        
        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 )
        {
            for( int i=0 ; i<EDP_WIDTH/8 ; i++ )
                bmpdata[i] = ~bmpdata[i];
        }
    
        lineStart();
        for( int i=0 ; i<EDP_WIDTH ; i+=8 )
        {
            drowPixels(bmpdata[i/8],drawMode);
        }
        lineEnd();
    
    }
    pageEnd();
    
    return;
}