Library to use my Photo MOS Relays Circuit having 16 or less channels.

Fork of PMRC4ch by Akifumi Takahashi

PMRC16ch.cpp

Committer:
aktk
Date:
2018-06-26
Revision:
15:56703876e914
Child:
16:e81a30a098dd

File content as of revision 15:56703876e914:

#include "PMRC16ch.h"
//  A constractor whose arguments have all default value
//  is a default constractor.
PMRC16ch::PMRC16ch():
    m_num_ch(16),
    m_SCK(DigitalOut(p11)),
    m_CLR(DigitalOut(p12)),
    m_RCK(DigitalOut(p13)),
    m_SER(DigitalOut(p14)),
    m_OUT(DigitalIn(p10))
{
    init();
}

PMRC16ch::PMRC16ch(
    uint8_t arg_num_ch,
    PinName arg_SCK,
    PinName arg_CLR,
    PinName arg_RCK,
    PinName arg_SER,
    PinName arg_OUT
):
    m_num_ch(arg_num_ch),
    m_SCK(DigitalOut(arg_SCK)),
    m_CLR(DigitalOut(arg_CLR)),
    m_RCK(DigitalOut(arg_RCK)),
    m_SER(DigitalOut(arg_SER)),
    m_OUT(DigitalIn(arg_OUT))
{
    init();
}

void PMRC16ch::init()
{
    m_CLR = 1;
    m_SCK = m_RCK = 0;
    m_PMRC_state = NaN;
    allOff();
    m_PMRC_POL = Cathodic;
}

char PMRC16ch::allOff()
{
    if (m_PMRC_state == ALLOFF) return 1;
    /*
    //reset shiftresister
    m_CLR = 0;
    update();
    //enable insertion data to SR
    m_CLR = 1;
    */
    //set all channel gnd
    //shiftby(16);
    sweep();
    upload();
    return static_cast<char>(m_PMRC_state = ALLOFF);
}

char PMRC16ch::setCh(State arg_state, Polarity arg_POL)
{
    int num_of_shift = static_cast<int>(arg_state) - static_cast<int>(m_PMRC_state);

    if( num_of_shift < 0 )
        sweep();
    
    if( m_PMRC_state == ALLOFF ) {
        setStimbits();
        num_of_shift = static_cast<char>(arg_state - 1);
    }
    shiftby(num_of_shift);
    upload();
    
    m_PMRC_POL = arg_POL;
    return static_cast<char>(m_PMRC_state = arg_state);
}
char PMRC16ch::setCh(char arg_state, Polarity arg_POL)
{
    int8_t num_of_shift = arg_state - static_cast<int8_t>(m_PMRC_state);

    if( num_of_shift < 0 )
        sweep();
    
    if( m_PMRC_state == ALLOFF ) {
        setStimbits();
        num_of_shift = static_cast<char>(arg_state - 1);
    }
    shiftby(num_of_shift);
    upload();
    
    m_PMRC_POL = arg_POL;
    return static_cast<char>(m_PMRC_state = static_cast<State>(arg_state));
}

void PMRC16ch::allHiZ()
{
    //reset shiftresister
    m_CLR = 0;
    update();
    //enable insertion data to SR
    m_CLR = 1;
    upload();
}

void PMRC16ch::setBits(const uint32_t bits, int num_of_bits, Polarity arg_POL)
{
    //reset shiftresister
    m_CLR = 0;
    update();
    //enable insertion data to SR
    m_CLR = 1;
    for(int i = 0; i < num_of_bits; i++){
        m_SER = ((bits >> i) & 0b0001);
        update();
    }
    upload();
    
    m_PMRC_POL = arg_POL;
}

void PMRC16ch::sweep()
{
    int num_of_shift = (16 + 1) - static_cast<int>(m_PMRC_state);

    shiftby(num_of_shift);
    m_PMRC_state = ALLOFF;
}

void PMRC16ch::shiftby(int arg_num)
{
    for(int i = 0; i < arg_num; i++) {
        //  insert 1
        m_SER = 1;
        update();
        //  insert 0
        m_SER = 0;
        update();
    }
    m_PMRC_state = static_cast<State>((static_cast<int>(m_PMRC_state) + arg_num) % (16 + 1));
}

void PMRC16ch::setStimbits()
{
    //  insert 0
    m_SER = 0;
    update();
    //  insert 1
    m_SER = 1;
    update();
    m_PMRC_state = CH1;
}
void PMRC16ch::update()
{
    //Shift-resister Clock update
    m_SCK = 1;
    m_SCK = 1;
    m_SCK = 0;
    m_SCK = 0;
}
void PMRC16ch::upload()
{
    //FF Clock Update
    m_RCK = 1;
    m_RCK = 1;
    m_RCK = 0;
    m_RCK = 0;
}