afLib 1.3 which is supporting both SPI and UART

Dependencies:   vt100 mbed afLib_1_3

af_utils/mbedUART.cpp

Committer:
Rhyme
Date:
2018-04-23
Revision:
0:87662653a3c6

File content as of revision 0:87662653a3c6:

#include "mbed.h"
#include "afErrors.h"
#include "msg_types.h"
#include "mbedUART.h"
#include "edge_mgr.h"
#include "edge_reset_mgr.h"

#define mbedUART_BUFSIZE 300

mbedUART::mbedUART(PinName rxPin, PinName txPin, Serial *theLog) 
{
    _uart = new edgeSerial(txPin, rxPin, 9600) ;
    _buf = new uint8_t[300] ;
}

mbedUART::~mbedUART(void)
{
    if (_buf) {
        delete [] _buf ;
    }
}

int mbedUART::available(void)
{
    return (int)_uart->readable() ;
}

char mbedUART::peek(void)
{
    char c ;
    c = _uart->edge_peek() ;
//    c = _uart->getc() ;
    return c ;
    
//    return _uart->peek() ;   
}

void mbedUART::read(uint8_t *buffer, int len)
{
    _uart->edge_read(buffer, len) ;
}

char mbedUART::read(void)
{
    char c ;
    c = _uart->edge_read() ;
    return( c ) ;
}

void mbedUART::write(uint8_t *buffer, int len)
{
    _uart->edge_write(buffer, len) ;
}
        
void mbedUART::checkForInterrupt(volatile int *interrupts_pending, bool idle)
{
    char c ;
    if (_uart->readable()) {
        c = _uart->edge_peek() ;
//tty->printf("Char %02X received\n", c) ;
        if (c == INT_CHAR) {
            if (*interrupts_pending == 0) {
                c = _uart->edge_read() ;
                *interrupts_pending += 1 ; /* (*interrupts_pending)++ ; */
            } else if (idle) {
                c = _uart->edge_read() ;
            } else {
               // _theLog->printf("INT(Pending)\n") ;
            }
        } else {
            if (*interrupts_pending == 0) {
                c = _uart->edge_read() ;
            }
        }
    }
}

int mbedUART::exchangeStatus(StatusCommand *tx, StatusCommand *rx)
{
    int             result = afSUCCESS ;
    int             i ;
    uint16_t        len ;
    int             *bytes ;
    char            *rbytes ;
    int             index = 0 ;
    len = tx->getSize() ;
    bytes = new int[len] ;
    rbytes = new char[len + 1] ;
    tx->getBytes(bytes) ;
    
    for(i = 0 ; i < len ; i++ ) {
        rbytes[i] = bytes[i] ;
    }
    rbytes[len] = tx->getChecksum() ;
    sendBytes(rbytes, len + 1) ;
    
    // Skip any interrupts, that may have come in.
    do {
        recvBytes(rbytes, 1) ;
    } while(rbytes[0] == INT_CHAR) ;
            
    // Okay, we have good first char, now read the rest
    recvBytes(&rbytes[1], len) ;
        
    uint8_t cmd = bytes[index++] ;
    if (cmd != SYNC_REQUEST && cmd != SYNC_ACK) {
        tty->printf("exchangeStatus bad cmd: %02X\n", cmd) ;
        result = afERROR_INVALID_COMMAND ;
    }
    
    rx->setBytesToSend(rbytes[index + 0] | (rbytes[index + 1] << 8)) ;
    rx->setBytesToRecv(rbytes[index + 2] | (rbytes[index + 3] << 8)) ;
    rx->setChecksum(rbytes[index + 4]) ;
        
    delete [] rbytes ;
    delete [] bytes ;
    return result ;
}


int mbedUART::writeStatus(StatusCommand *c)
{
    int result = afSUCCESS ;
    uint16_t len ;
    int *bytes ;
    char *rbytes ;
    int index = 0 ;
    len = c->getSize() ;
    bytes = new int[len] ;
    rbytes = new char[len + 1] ;
    
    c->getBytes(bytes) ;
    for (int i = 0 ; i < len ; i++ ) {
        rbytes[i] = bytes[i] ;
    }
    rbytes[len] = c->getChecksum() ;
    
    sendBytes(rbytes, len + 1) ;
    
    uint8_t cmd = rbytes[index++] ;
    if (cmd != SYNC_REQUEST && cmd != SYNC_ACK) {
        tty->printf("writeStatus bad cmd: %02X\n", cmd) ;
        result = afERROR_INVALID_COMMAND ;
    }
    // c->dump() ;
    // c->dumpBytes() ;
    
    delete [] rbytes ;
    delete [] bytes ;
    
    return result ;
}

void mbedUART::sendBytes(char *bytes, int len)
{
#if 0
tty->printf("sendBytes %d: ", len) ;
for (int i = 0 ; i < len ; i++ ) { tty->printf("%02X ", bytes[i]) ; }
tty->printf("\n") ;
#endif

    _uart->edge_write((uint8_t *)bytes, len) ;
}

void mbedUART::recvBytes(char *bytes, int len)
{
    _uart->edge_read((uint8_t *)bytes, len) ;
    
#if 0
tty->printf("recvBytes %d: ", len) ;
for (int i = 0 ; i < len ; i++ ) { tty->printf("%02X ", bytes[i]) ; }
tty->printf("\n") ;
#endif
}

void mbedUART::sendBytesOffset(char *bytes, uint16_t *bytesToSend, uint16_t *offset)
{
    uint16_t len = 0 ;
    
    len = *bytesToSend ;
    
//    sendBytes(bytes, len) ;
    sendBytes(&bytes[*offset], len) ;
    
    // dumpBytes("Sending: ", len, bytes) ;
    
    *offset += len ;
    *bytesToSend -= len ;
}

void mbedUART::recvBytesOffset(char **bytes, uint16_t *bytesLen, uint16_t *bytesToRecv, uint16_t *offset)
{
    uint16_t len = 0 ;
    
    len = *bytesToRecv ;
    
    if (*offset == 0) {
        *bytesLen = *bytesToRecv ;
        *bytes = new char[*bytesLen] ;
    }
    
    char * start = *bytes + *offset ;
    
    recvBytes(start, len) ;
    
//  dumpBytes("Receiving:", len, _readBuffer) ;
#if 0
    tty->printf("Receiving: ") ;
    for (int i = 0; i < len ; i++ ) { tty->printf("%02X ", start[i]) ; } 
    tty->printf("\n") ;
#endif

    *offset += len ;
    *bytesToRecv -= len ;
}