Sample program for Futaba GP1059A01 240x36dot VFD

Dependencies:   mbed SDFileSystem FatFileSystem

main.cpp

Committer:
kanpapa
Date:
2019-10-05
Revision:
0:cd32c44c16f8

File content as of revision 0:cd32c44c16f8:

//
// VFD BMP file display program
// 2011/11/26 by @kanpapa
//

#include "mbed.h"
#include "vfd_gp1059.h"

/*
=====================
GP1059A01(I/O)
---------------------
p9     1 (D0)  I/O
p10    2 (D1)  I/O
p11    3 (D2)  I/O
p12    4 (D3)  I/O
p13    5 (D4)  I/O
p14    6 (D5)  I/O
p15    7 (D6)  I/O
p16    8 (D7)  I/O
p21    10 (INT) O
p22    11 (WR)  I
p23    12 (RD)  I
p24    13 (CS)  I
p25    14 (C/D) I
*/

VFD_GP1059   vfd(p9, p10, p11, p12, p13, p14, p15, p16,    p21, p22, p23, p24, p25);

//
// For SD_card
//
#include "SDFileSystem.h"
//SDFileSystem    sd(p5, p6, p7, p13, "sd");  //  mosi, miso, sclk, cs, name
SDFileSystem  sd(p5, p6, p7, p8, "sd");  //  mosi, miso, sclk, cs, name  (HW modification candidate)

Serial pc(USBTX, USBRX);
LocalFileSystem local("local");

// LED Status
// mbed
DigitalOut led1(LED1);
// LPCXpresso
//DigitalOut led1(P0_22);

unsigned char reverse_bit(unsigned char x){
    const unsigned int bit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    unsigned char y = 0;
    for (int i = 0; i < 8; i++){
        if ((bit[i] & x) != 0){
            y |= bit[7-i];
        }
    }
    return(y);
}

void blink_LED() {
    for (int i = 0 ; i < 5 ; i++) {
        led1 = 1;
        wait(0.2);
        led1 = 0;
        wait(0.2);
    }
    return;
}


/*
 *
 *   BMP file data handler sample
 *
 *      reference : http://www.umekkii.jp/data/computer/file_format/bitmap.cgi
 *
 */

#include    <stdio.h>


// mono color bitmap 1214byte
#define        BUFFER_SIZE            1280

typedef struct  bmp_header_st    {
    unsigned short  bfType            __attribute__((packed));
    unsigned long   bfSize            __attribute__((packed));
    unsigned short  bfReserved1       __attribute__((packed));
    unsigned short  bfReserved2       __attribute__((packed));
    unsigned long   bfOffBits         __attribute__((packed));

    unsigned long   biSize            __attribute__((packed));
    long            biWidth           __attribute__((packed));
    long            biHeight          __attribute__((packed));
    unsigned short  biPlanes          __attribute__((packed));
    unsigned short  biBitCount        __attribute__((packed));
    unsigned long   biCompression     __attribute__((packed));
    unsigned long   biSizeImage       __attribute__((packed));
    long            biXPixPerMeter    __attribute__((packed));
    long            biYPixPerMeter    __attribute__((packed));
    unsigned long   biClrUsed         __attribute__((packed));
    unsigned long   biCirImportant    __attribute__((packed));
}
bmp_header;

typedef struct  color_palette_st    {
    unsigned char    red;
    unsigned char    green;
    unsigned char    blue;
    unsigned char    dummy;
}
color_palette;

void print_bit(unsigned char x){
    const unsigned int bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
    for (int i = 0; i < 8; i++){
        if ((bit[i] & x) != 0){
            printf("1");
        } else {
            printf(" ");
        }
    }
    return;
}

int read_bmp_mono(const char *file_name, unsigned char *buffer, int buffer_size){
    FILE             *fs;
    bmp_header       bh;
    color_palette    cp[2];
    printf( "BMP file access sample\r\n");

    if ( NULL == (fs = fopen( file_name, "rb" )) ) {
        printf( "file open error when opening file \"%s\"\r\n", file_name );
        return ( 1 );
    }

    /*
     *   reading header
     */

    fread( &bh, sizeof( bh ), 1, fs );

    printf( "  bfType         : 0x%04X\r\n", bh.bfType );
    printf( "  bfSize         : %ld\r\n",    bh.bfSize );
    printf( "  bfOffBits      : %ld\r\n",    bh.bfOffBits );
    printf( "  biSize         : %lu\r\n",    bh.biSize );
    printf( "  biWidth        : %ld\r\n",    bh.biWidth );
    printf( "  biHeight       : %ld\r\n",    bh.biHeight );
    printf( "  biPlanes       : %d\r\n",     bh.biPlanes );
    printf( "  biBitCount     : %d\r\n",     bh.biBitCount );
    printf( "  biCompression  : %lu\r\n",    bh.biCompression );
    printf( "  biSizeImage    : %lu\r\n",    bh.biSizeImage );
    printf( "  biXPixPerMeter : %ld\r\n",    bh.biXPixPerMeter );
    printf( "  biYPixPerMeter : %ld\r\n",    bh.biYPixPerMeter );
    printf( "  biClrUsed      : %lu\r\n",    bh.biClrUsed );
    printf( "  biCirImportant : %lu\r\n",    bh.biCirImportant );

    /*
     *   checking header  (mono color pallet:2)
     */
    if ( (bh.bfType != 0x4D42)      // "BM"
            || (bh.bfOffBits != 54 + 2 * sizeof( color_palette ) )  // pallet data 2
            || (bh.biBitCount != 1)                                 // color 1bit
            || (bh.biCompression != 0)
       ) {
        printf( "unsupported file format\r\n" );
        fclose( fs );
        return ( 1 );
    }

    /*
     *   header information
     */
    printf( "header read, the image data size is %lu bytes\r\n", bh.bfSize );
    printf( "   the image data size is %lu bytes\r\n", bh.biSizeImage );
    printf( "   horizontal size %lu pixels\r\n", bh.biWidth );
    printf( "   vertical   size %lu pixels\r\n", bh.biHeight );

    /*
     *   read color palette
     */

    for ( int i = 0; i < 2; i++ ) {
        fread( &(cp[i]), sizeof( color_palette ), 1, fs );
        printf( "color pallet No.0x%02X : R:0x%02X - G:0x%02X - B:0x%02X\r\n", i, (cp[i]).red, (cp[i]).green, (cp[i]).blue );
    }

    /*
     *   read pixel data
     */
    unsigned long readsize = fread( buffer, sizeof( unsigned char ) , buffer_size, fs );
    printf( "Readsize: %d\r\n", readsize);

    fclose( fs );
    return( 0 );
}

bool CheckExtention( const char* filename, const char* ext )
{
    if ( filename && ext )
    {
        return 0 == std::strcmp(std::strrchr(filename, '.'), ext);
    }
    return false;
}


int display_bmp(char * bmp_file) {
    unsigned char    buffer[ BUFFER_SIZE ];

        printf("bmp_file: %s\n\r",bmp_file);    
        if ( read_bmp_mono(bmp_file, buffer, sizeof( buffer )) != 0) {
            printf( "file open error when opening file \"%s\"\r\n", bmp_file);
            return ( 1 );
        }
    
        //
        // SET VRAM
        //
        const unsigned int bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

        for (int y = 0; y < 5; y++){
            unsigned int address = y;
            for (int x = 0 ; x < 30 ; x++) {
                int bufbit = 0;     // buffer bit
                for ( int z = 0; z < 8 ; z++) {
                    unsigned char d = 0;          // vram data
                    int dbit = 0;       // vram data bit
                    for ( int i = 0 ; i < 8 ; i++) {
                        //printf("buffer[%d]\r\n", 32 * (35 - (y * 8 + i)) + x );
                        if ((bit[bufbit] & buffer[32 * (35 - (y * 8 + i)) + x]) == 0){
                            d = d | bit[dbit];
                        }
                        dbit++;
                    }
                    bufbit++;
                
                    // write VRAM
                    //printf( "VRAM address: %04x Data: %02x\r\n", address, d);
                    vfd.set_write_read_address(address);
                    vfd.send_data(d);
                
                    address = address + 8;
                }
            }
        }
        return(0);
}

int main() {
    const char* ext1 = ".bmp";
    const char* ext2 = ".BMP";

    // mono color bitmap
    //const char *bmp_file[] = {"/local/kumamoto.bmp", "/local/narita.bmp"};
    //const char *bmp_file[] = {"/sd/kumamoto.bmp", "/sd/narita.bmp"};

    printf( "BMP file access sample\r\n");

    vfd.cls();

    vfd.luminance_adjustment(0x0f); // 100%

    while(1) {
        DIR *dir = opendir("/sd/");
    
        struct dirent *dent;

        if ( dir ) {
            while( dent = readdir( dir ) ){
                printf("%s\r\n", dent->d_name);
                if (CheckExtention(dent->d_name, ext1) || CheckExtention(dent->d_name, ext2)) {
                    char file_name[256] = "/sd/";
                    strcat(file_name, dent->d_name);
                    int ret = display_bmp(file_name);
                    
                    // wait
                    if (ret == 0){
                        wait(5);
                        vfd.cls();
                        wait(1);
                    }
                }
            }
        } else {
            printf("Filed to open directory\r\n");
            return(1);
        }
        closedir( dir );
    }   
}