Library to use my Photo MOS Relays Circuit having 16 or less channels.
Fork of PMRC4ch by
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; }