Simple I2C test program. open/close/read/write supported.

Dependencies:   mbed vt100

main.cpp

Committer:
Rhyme
Date:
2016-04-05
Revision:
1:e105ceaee6ac
Parent:
0:1a2637f8e2dd
Child:
2:218e22a54982

File content as of revision 1:e105ceaee6ac:

#include "mbed.h"
#include <string.h>
#include <ctype.h>
#include "vt100.h"
#include "MSS.h"
#include "dumb_i2c.h"

DUMB_I2C *i2c = 0 ;
vt100 *tty = 0 ;

void doClose(void)
{
    if (i2c != 0) {
        printf("Closing I2C at 0x%02X ... ", i2c->address()) ;
        delete i2c ;
        i2c = 0 ;
        printf("Done\n") ;
    }
}

void doOpen(void)
{
    uint8_t address ;
    scanf("%X", &address) ;
    if (i2c != 0) {
        doClose() ;
    }
    printf("Opening I2C at 0x%02X ... ", address) ;
    i2c = new DUMB_I2C(PIN_SDA, PIN_SCL, address) ;
    printf("Done\n") ;
}

void doRead(void)
{
    int addr ;
    int len ;
    uint8_t *data ;
    if (i2c == 0) {
        printf("I2C is not opened\n") ;
        return ;
    }
    scanf("%X %X", &addr, &len) ;
    if (len > 0) {
        data = new uint8_t[len] ;
    }
 //   i2c->read(addr, data, len) ;
    printf("0x%02X : ", (unsigned int)addr) ;
    for (int i = 0 ; i < len ; i++ ) {
        i2c->read(addr+i, &data[i], 1) ;
        printf("%02X ", data[i]) ;
        if (((i+1) < len)&&(((i+1)%0x10) == 0)) {
            printf("\n") ;
            printf("0x%02X : ", (unsigned int)(addr + i + 1)) ;
        }
    }
    printf("\n") ;
}

void doWrite(void)
{
    int addr ;
    uint8_t len ;
    uint8_t data ;
        if (i2c == 0) {
        printf("I2C is not opened\n") ;
        return ;
    }
    scanf("%X %X", &addr, &data) ;
    i2c->write(addr, &data, 1) ;
}

void doStatus(void)
{
    if (i2c == 0) {
        printf("i2c is not opened\n") ;
    } else {
        printf("i2c device at 0x%02X is opened at %d Hz\n", 
            i2c->address(), i2c->frequency()) ;
    }
}

void doHelp(void)
{
    printf("Simple I2C test program %s for %s\n", __DATE__, BOARD_NAME) ;
    printf("\n             === usage ===\n") ;
    printf("open <7bit addr>    : open i2c device at <7bit addr>\n") ;
    printf("close               : close currently opened i2c\n") ;
    printf("read <addr> <len>   : read <len> data from <addr>\n") ;
    printf("write <addr> <data> : write <data> to register <addr>\n") ;
    printf("frequency <freq>    : change frequency to <freq> Hz\n") ;
    printf("status              : print current status\n") ;
    printf("help                : print this help\n") ;
    printf("\nPlease set local-echo to see what you are typing.\n") ;
    printf("\n") ; 
}

void doFreq(void)
{
    int freq = 0 ;
    scanf("%d", &freq) ;
    if (i2c != 0) {
        i2c->frequency(freq) ;
    }
}

void doCommand(char *str)
{
    switch(*str) {
    case 'o': case 'O': /* open */
        doOpen()   ; break ;
    case 'c': case 'C': /* close */
        doClose()  ; break ;
    case 'r': case 'R': /* read */
        doRead()   ; break ;
    case 'w': case 'W': /* write */
        doWrite()  ; break ;
    case 's': case 'S': /* status */
        doStatus() ; break ;
    case 'f': case 'F': /* Frequency */
        doFreq()   ; break ;
    default:
        doHelp() ; break ;
    }
}

int main() {
    char cmd[32] ;
    tty = new vt100() ;
    tty->cls() ;
    doHelp() ;
    while(1) {
        printf("> ") ;
        scanf("%s", cmd) ;
        doCommand(cmd) ;
    }
}