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

Fork of PMRC4ch by Akifumi Takahashi

Revision:
15:56703876e914
Child:
16:e81a30a098dd
--- /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