Software UART program using Infra-Red LED and IR-Detector

Dependents:   TestVirtualisation Bf_SoftSerial_IR

SoftSerial_tx.cpp

Committer:
Sissors
Date:
2014-04-26
Revision:
1:f8b4b764ace7
Parent:
0:8edaa7abe724
Child:
2:9e01a38606b4

File content as of revision 1:f8b4b764ace7:

#include "SoftSerial.h"

int SoftSerial::_putc(int c) {
    while(!writeable());
    tx_bit = 0;
    _char = c;
    tx_handler();
    return 0;
    }

int SoftSerial::writeable(void) {
    if (!tx_en)
        return false;
    if (tx_bit == -1)
        return true;
    return false;
}

void SoftSerial::tx_handler(void) {
    if (get_bit(tx_bit) == -1) {
        tx_bit = -1;
        return;
    }
    
    //Flip output
    int cur_out = tx->read();
    tx->write(!cur_out);
         
    //Calculate when to do it again
    int count = bit_period;
    tx_bit++;
    while(get_bit(tx_bit) == !cur_out) {
        count+=bit_period;
        tx_bit++;
    }
    
    txout.attach_us(this, &SoftSerial::tx_handler, count);
}

int SoftSerial::get_bit(int bit) {
    //Start bit is never asked
    
    //Data bits
    if (bit <= _bits )
        return ((_char >> (bit - 1)) & 0x01);
    
    //Parity
    bool retval;
    if (bit == _bits + 1) {
        switch (_parity) {
            case Forced1:
                return 1;
            case Forced0:
                return 0;
            case Even:
                retval = false;
                for (int i = 0; i<_bits; i++) {
                    if (((_char >> i) & 0x01) == 1)
                        retval = !retval;
                }
                return retval;
            case Odd:
                retval = true;
                for (int i = 0; i<_bits; i++) {
                    if (((_char >> i) & 0x01) == 1)
                        retval = !retval;
                }
                return retval;
        }
    }
    
    //Stop bits:
    if (bit < 1 + _bits + (bool)_parity + _stop_bits) 
        return 1;
    
    return -1;   
}