Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Generated on Tue Jul 12 2022 14:39:23 by
1.7.2