Library to use my Photo MOS Relays Circuit having 16 or less channels.
Fork of PMRC4ch by
Diff: PMRC16ch.cpp
- Revision:
- 15:56703876e914
- Child:
- 16:e81a30a098dd
diff -r d855fefe3451 -r 56703876e914 PMRC16ch.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PMRC16ch.cpp Tue Jun 26 12:19:09 2018 +0000 @@ -0,0 +1,166 @@ +#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; +} \ No newline at end of file