電子ペーパーで所在を表示しておくプレートのプログラムです

Dependencies:   SDFileSystem mbed

eink.cpp

Committer:
kohacraft
Date:
2016-04-21
Revision:
0:eca549a6e38d
Child:
1:bd1c3875fb64

File content as of revision 0:eca549a6e38d:

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


//ポートの初期化
void initPort()
{
    setCL( 0 );
    setContBas( LE , 0);
    setContBas( OE , 0);
    setContBas( NC10 , 1);
    setContBas( SPH , 1);

    setContBas( GMODE , 0);
    setContBas( SPV , 1);
    setContBas( CKV , 0);
    setContBas( EN , 0);
    
    setDataBas( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
}

//pageStart
void pageStart()
{   

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

    setContBas( CKV , 0 );
    wait_us(10);
    setContBas( CKV , 1 );
    wait_us(22);
    setContBas( CKV , 0 );
    wait_us(10);
    setContBas( CKV , 1 );
    wait_us(22);
    setContBas( CKV , 0 );
    wait_us(10);
    setContBas( CKV , 1 );
    wait_us(1);
}

//lineStart
void lineStart()
{
    
    setCL( 1 );
    setCL( 0 );
    setContBas( LE , 0 );
    wait_us(1);
    
    setCL( 1 );
    setCL( 0 );
    wait_us(1);

    setCL( 1 );
    setCL( 0 );
    wait_us(1);
    
    setCL( 1 );
    setCL( 0 );
    setContBas( OE , 1 );
    wait_us(1);

    setCL( 1 );
    setCL( 0 );
    setContBas( SPH , 0 );
}

//点を描画
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 );
}

//lineEnd
void lineEnd()
{
    setContBas( NC10 , 1 );
    setContBas( CKV , 0 );
    
    setCL( 1 );
    setCL( 0 );
    wait_us(10);
    
    setContBas( OE , 0 );
    setContBas( LE , 1 );
    setContBas( CKV , 1 );
    wait_us(1);
}

//pageEnd  
void pageEnd()
{
    setCL( 1 );
    setCL( 0 );
    setContBas( LE , 0 );
    
    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++ )
    {
        setCL( 1 );
        setCL( 0 );
    }
    setContBas( CKV , 0 );
    
    setCL( 1 );
    setCL( 0 );
    
    wait_us(10);    
    setContBas( OE , 0 );
    
    wait_us(330);

    setContBas( GMODE , 0 );
    wait_us(130);

}

//SPHを交代する
void changeSPH()
{
    setContBas( SPH , 1 );
    setContBas( NC10 , 0 );
}

//電子ペーパーの回路の電源を切る
void powerOff()
{
    setDataBas( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );

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

    setContBas( GMODE , 0);
    setContBas( SPV , 0);
    setContBas( CKV , 0);
    
    setContBas( EN , 1);
    
}

//電子ペーパーの回路の電源を入れる
void powerOn()
{
    setContBas( EN , 0);
}

//画面をクリアする 0:黒 1:白
void clrdisp( bool color )
{
    pageStart();
    for( int j=0 ; j<600 ; j++)
    {
        lineStart(); 
        for( int i=0 ; i<100 ; i++ )            
        {
            if( color ==  1)
                drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 );    //白でクリアする
            else
                drowPixelsRaw( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 );    //黒でクリアする
        }
        changeSPH();
        for( int i=100 ; i<200 ; i++ )
        {
            if( color ==  1)
                drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 );    //白でクリアする
            else
                drowPixelsRaw( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 );    //黒でクリアする
        }
        lineEnd();
        
    }
    pageEnd();
}



//1Byte分の8ドットを描画 paletteWhite:0の部分を白で描画 1の部分を白で描画
void drowPixels( char data , bool paletteWhite  )
{
    if( paletteWhite == 0 )
    {
        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 );
    }
    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 );
    }
}

//fpのbmpを0,0の座標に描画する BMPのピクセルサイズは8の倍数必須
void dispbmp(FILE *fp )
{
    dispbmp( fp , 0 , 0 );
}

//fpのbmpを指定したの座標に描画する
//BMPのピクセルサイズは8の倍数必須
//座標は8の倍数で指定
void dispbmp(FILE *fp , int xpos , int ypos)
{
        char bmpdata;
        int size;
        
        //ファイルポインタが正しいか確認
        if( fp == NULL )
        {
            fclose(fp);
            free(fp);

            //ファイルポインタが正しくない
            clrdisp(1); //白でクリア
            clrdisp(0); //黒でクリア
            clrdisp(1); //白でクリア
            clrdisp(0); //黒でクリア
            
            return;
        }

        

        //画像のサイズ取得
        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);


        //パレットデータの先頭まで移動
        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];    //パレット0のRGBの合計
        int palette1 = (int)palettetemp[4]+(int)palettetemp[5]+(int)palettetemp[6];    //パレット1のRGBの合計
        bool paletteWhite = 0;
        if( palette0 > palette1 )   //輝度が明るいパレットを白にする
        {
            paletteWhite = 0;   //パレット0が白
        }
        else
        {
            paletteWhite = 1;  //パレット1が白
        }

        //bmp画像データの先頭まで移動
        unsigned int dataOffset;
        fseek(fp, 10 , SEEK_SET);
        size = fread( &dataOffset , sizeof(unsigned int) , 1 , fp);
        fseek(fp, dataOffset , SEEK_SET);
        
        pageStart();
        
        //y座標の位置までスキップする
        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++)
        {
            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 );    //読み込めない場合は白にする
                        drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 );
                    }
                    else
                    {
                        drowPixels(bmpdata,paletteWhite);
                    }
                }
                else
                {
                    drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 );    //範囲以外なら変化なし
                    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 );    //読み込めない場合は白にする
                        drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 );  
                    }
                    else
                    {
                        drowPixels(bmpdata,paletteWhite);
                    }
                }
                else
                {
                    drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 );    //範囲以外なら変化なし
                    drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 );
                }

            }

            //横800画素を超えた分のデータをパスする
            if( (xsize+xpos)>800 )
            {
                int dataPass = ((xsize+xpos)-800)/8;
                fseek(fp, dataPass , SEEK_CUR);
            }

            lineEnd();
        }
            
        //yの残りをスキップする
        for( int j=ypos+ysize ; j<600 ; 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();
        }

        pageEnd();
}