mbed library sources. Supersedes mbed-src.
Fork of mbed-dev by
Embed:
(wiki syntax)
Show/hide line numbers
BusInOut.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2013 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #include "drivers/BusInOut.h" 00017 #include "platform/mbed_assert.h" 00018 00019 namespace mbed { 00020 00021 BusInOut::BusInOut(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) { 00022 PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15}; 00023 00024 // No lock needed in the constructor 00025 _nc_mask = 0; 00026 for (int i=0; i<16; i++) { 00027 _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0; 00028 if (pins[i] != NC) { 00029 _nc_mask |= (1 << i); 00030 } 00031 } 00032 } 00033 00034 BusInOut::BusInOut(PinName pins[16]) { 00035 // No lock needed in the constructor 00036 _nc_mask = 0; 00037 for (int i=0; i<16; i++) { 00038 _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0; 00039 if (pins[i] != NC) { 00040 _nc_mask |= (1 << i); 00041 } 00042 } 00043 } 00044 00045 BusInOut::~BusInOut() { 00046 // No lock needed in the destructor 00047 for (int i=0; i<16; i++) { 00048 if (_pin[i] != 0) { 00049 delete _pin[i]; 00050 } 00051 } 00052 } 00053 00054 void BusInOut::write(int value) { 00055 lock(); 00056 for (int i=0; i<16; i++) { 00057 if (_pin[i] != 0) { 00058 _pin[i]->write((value >> i) & 1); 00059 } 00060 } 00061 unlock(); 00062 } 00063 00064 int BusInOut::read() { 00065 lock(); 00066 int v = 0; 00067 for (int i=0; i<16; i++) { 00068 if (_pin[i] != 0) { 00069 v |= _pin[i]->read() << i; 00070 } 00071 } 00072 unlock(); 00073 return v; 00074 } 00075 00076 void BusInOut::output() { 00077 lock(); 00078 for (int i=0; i<16; i++) { 00079 if (_pin[i] != 0) { 00080 _pin[i]->output(); 00081 } 00082 } 00083 unlock(); 00084 } 00085 00086 void BusInOut::input() { 00087 lock(); 00088 for (int i=0; i<16; i++) { 00089 if (_pin[i] != 0) { 00090 _pin[i]->input(); 00091 } 00092 } 00093 unlock(); 00094 } 00095 00096 void BusInOut::mode(PinMode pull) { 00097 lock(); 00098 for (int i=0; i<16; i++) { 00099 if (_pin[i] != 0) { 00100 _pin[i]->mode(pull); 00101 } 00102 } 00103 unlock(); 00104 } 00105 00106 BusInOut& BusInOut::operator= (int v) { 00107 // Underlying write is thread safe 00108 write(v); 00109 return *this; 00110 } 00111 00112 BusInOut& BusInOut::operator= (BusInOut& rhs) { 00113 // Underlying read is thread safe 00114 write(rhs.read()); 00115 return *this; 00116 } 00117 00118 DigitalInOut& BusInOut::operator[] (int index) { 00119 // No lock needed since _pin is not modified outside the constructor 00120 MBED_ASSERT(index >= 0 && index <= 16); 00121 MBED_ASSERT(_pin[index]); 00122 return *_pin[index]; 00123 } 00124 00125 BusInOut::operator int() { 00126 // Underlying read is thread safe 00127 return read(); 00128 } 00129 00130 void BusInOut::lock() { 00131 _mutex.lock(); 00132 } 00133 00134 void BusInOut::unlock() { 00135 _mutex.unlock(); 00136 } 00137 00138 } // namespace mbed
Generated on Tue Jul 12 2022 23:05:48 by 1.7.2