Charith Dassanayake / CPPToPigpio
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BusOut.cc Source File

BusOut.cc

00001 namespace CPPToPigpio{
00002         
00003     //default value of NC is set in the header, need to check each pin input to make sure connected
00004     BusOut::BusOut (PinName p0, PinName p1, PinName p2, PinName p3, PinName p4, PinName p5, PinName p6, PinName p7, PinName p8, PinName p9, PinName p10, PinName p11, PinName p12, PinName p13, PinName p14, PinName p15)
00005     {
00006         CPPToPigpio::_handlePigpioInitialisationIfNeeded();
00007         std::vector<PinName> pinNamesOutBus;
00008         pinNamesOutBus.emplace_back(p0);
00009         if(p1 != NC)
00010             pinNamesOutBus.emplace_back(p1);
00011         if(p2 != NC)
00012             pinNamesOutBus.emplace_back(p2);
00013         if(p3 != NC)
00014             pinNamesOutBus.emplace_back(p3);
00015         if(p4 != NC)
00016             pinNamesOutBus.emplace_back(p4);
00017         if(p5 != NC)
00018             pinNamesOutBus.emplace_back(p5);
00019         if(p6 != NC)
00020             pinNamesOutBus.emplace_back(p6);
00021         if(p7 != NC)
00022             pinNamesOutBus.emplace_back(p7);
00023         if(p8 != NC)
00024             pinNamesOutBus.emplace_back(p8);
00025         if(p9 != NC)
00026             pinNamesOutBus.emplace_back(p9);
00027         if(p10 != NC)
00028             pinNamesOutBus.emplace_back(p10);
00029         if(p11 != NC)
00030             pinNamesOutBus.emplace_back(p11);
00031         if(p12 != NC)
00032             pinNamesOutBus.emplace_back(p12);
00033         if(p13 != NC)
00034             pinNamesOutBus.emplace_back(p13);
00035         if(p14 != NC)
00036             pinNamesOutBus.emplace_back(p14);
00037         if(p15 != NC)
00038             pinNamesOutBus.emplace_back(p15);
00039             
00040         for(size_t i=0;i<pinNamesOutBus.size();++i)
00041         {
00042            _digitalOuts.emplace_back(new DigitalOut(pinNamesOutBus[i]));
00043         }
00044 
00045     }
00046     //Default val of -1 for each pin set in header
00047     BusOut::BusOut (int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10, int p11, int p12, int p13, int p14, int p15)
00048     {
00049         CPPToPigpio::_handlePigpioInitialisationIfNeeded();
00050         std::vector<int> pinNamesOutBus;
00051         pinNamesOutBus.emplace_back(p0);
00052         if(p1 != -1)
00053             pinNamesOutBus.emplace_back(p1);
00054         if(p2 != -1)
00055             pinNamesOutBus.emplace_back(p2);
00056         if(p3 != -1)
00057             pinNamesOutBus.emplace_back(p3);
00058         if(p4 != -1)
00059             pinNamesOutBus.emplace_back(p4);
00060         if(p5 != -1)
00061             pinNamesOutBus.emplace_back(p5);
00062         if(p6 != -1)
00063             pinNamesOutBus.emplace_back(p6);
00064         if(p7 != -1)
00065             pinNamesOutBus.emplace_back(p7);
00066         if(p8 != -1)
00067             pinNamesOutBus.emplace_back(p8);
00068         if(p9 != -1)
00069             pinNamesOutBus.emplace_back(p9);
00070         if(p10 != -1)
00071             pinNamesOutBus.emplace_back(p10);
00072         if(p11 != -1)
00073             pinNamesOutBus.emplace_back(p11);
00074         if(p12 != -1)
00075             pinNamesOutBus.emplace_back(p12);
00076         if(p13 != -1)
00077             pinNamesOutBus.emplace_back(p13);
00078         if(p14 != -1)
00079             pinNamesOutBus.emplace_back(p14);
00080         if(p15 != -1)
00081             pinNamesOutBus.emplace_back(p15);
00082             
00083         for(size_t i=0;i<pinNamesOutBus.size();++i)
00084         {
00085            _digitalOuts.emplace_back(new DigitalOut(pinNamesOutBus[i]));
00086         }
00087 
00088 
00089     }
00090    
00091     //Different from MBED API, has a leading busSize argument
00092     BusOut::BusOut(int busSize, PinName pinNames[16])
00093     {
00094         CPPToPigpio::_handlePigpioInitialisationIfNeeded();
00095         //ex. input {p15 p16} pushes back 15, then back 16 to get {15 16} stored in _digitalOuts
00096         for(int i=0;i<busSize;++i)
00097         {
00098             _digitalOuts.emplace_back(new DigitalOut(pinNames[i]));
00099         }
00100     }
00101 
00102     //Different from MBED API, has a leading busSize argument
00103     BusOut::BusOut(int busSize, int pinNames[16])
00104     {
00105         CPPToPigpio::_handlePigpioInitialisationIfNeeded();
00106         for(int i=0;i<busSize;++i)
00107         {
00108             _digitalOuts.emplace_back(new DigitalOut(pinNames[i]));
00109         }
00110 
00111     }
00112 
00113 
00114     //_digitalIns[0] is the MSB. Might be bad to use read() if we wanted bus of >31 bits, but restricted size to 16 for now and int is the value from MBED API.
00115     void BusOut::write(int val)
00116     {
00117         long long currentMask = 1;
00118         for(uint32_t i=0;i<_digitalOuts.size();++i)
00119         {
00120             (_digitalOuts[_digitalOuts.size()-i-1])->write( (val & currentMask) != 0);
00121             currentMask = currentMask << 1;
00122         }
00123         _lastWrittenValue = val;
00124     }
00125 
00126     int BusOut::read()
00127     {
00128         return _lastWrittenValue;
00129     }
00130 
00131     BusOut::operator int()
00132     {
00133         return BusOut::read();
00134     }
00135 
00136     DigitalOut & BusOut::operator[](int index)
00137     {
00138         return *(_digitalOuts[index]);
00139     }
00140 
00141     BusOut & BusOut::operator=(int v)
00142     {
00143         BusOut::write(v);
00144         return *this;
00145     }
00146 
00147     //If only digital pin is p0, would return ...000001. Is that right? Feels weird to have a 0-->0001
00148     //i.e. output is 0-indexed representation of which pins are on
00149     long long BusOut::mask()
00150     {
00151         long long output = 0;
00152         for(size_t i=0; i<_digitalOuts.size(); ++i)
00153         {
00154             //Convert pin# to value, then add to mask by shifting a 1 into that position
00155            output = output | (static_cast<long long>(1) << static_cast<int>(_digitalOuts[i]->_pinNumber));
00156         }
00157         return output;
00158     }
00159 
00160     BusOut::~BusOut()
00161     {
00162         CPPToPigpio::_handlePigpioTermination(); 
00163         while(!_digitalOuts.empty())
00164         {
00165             delete _digitalOuts.back();
00166             _digitalOuts.pop_back();
00167         }
00168     }
00169 
00170 }
00171 
00172