takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BusInOut.cpp Source File

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 {
00023     PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15};
00024 
00025     // No lock needed in the constructor
00026     _nc_mask = 0;
00027     for (int i = 0; i < 16; i++) {
00028         _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0;
00029         if (pins[i] != NC) {
00030             _nc_mask |= (1 << i);
00031         }
00032     }
00033 }
00034 
00035 BusInOut::BusInOut(PinName pins[16])
00036 {
00037     // No lock needed in the constructor
00038     _nc_mask = 0;
00039     for (int i = 0; i < 16; i++) {
00040         _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0;
00041         if (pins[i] != NC) {
00042             _nc_mask |= (1 << i);
00043         }
00044     }
00045 }
00046 
00047 BusInOut::~BusInOut()
00048 {
00049     // No lock needed in the destructor
00050     for (int i = 0; i < 16; i++) {
00051         if (_pin[i] != 0) {
00052             delete _pin[i];
00053         }
00054     }
00055 }
00056 
00057 void BusInOut::write(int value)
00058 {
00059     lock();
00060     for (int i = 0; i < 16; i++) {
00061         if (_pin[i] != 0) {
00062             _pin[i]->write((value >> i) & 1);
00063         }
00064     }
00065     unlock();
00066 }
00067 
00068 int BusInOut::read()
00069 {
00070     lock();
00071     int v = 0;
00072     for (int i = 0; i < 16; i++) {
00073         if (_pin[i] != 0) {
00074             v |= _pin[i]->read() << i;
00075         }
00076     }
00077     unlock();
00078     return v;
00079 }
00080 
00081 void BusInOut::output()
00082 {
00083     lock();
00084     for (int i = 0; i < 16; i++) {
00085         if (_pin[i] != 0) {
00086             _pin[i]->output();
00087         }
00088     }
00089     unlock();
00090 }
00091 
00092 void BusInOut::input()
00093 {
00094     lock();
00095     for (int i = 0; i < 16; i++) {
00096         if (_pin[i] != 0) {
00097             _pin[i]->input();
00098         }
00099     }
00100     unlock();
00101 }
00102 
00103 void BusInOut::mode(PinMode pull)
00104 {
00105     lock();
00106     for (int i = 0; i < 16; i++) {
00107         if (_pin[i] != 0) {
00108             _pin[i]->mode(pull);
00109         }
00110     }
00111     unlock();
00112 }
00113 
00114 BusInOut &BusInOut::operator= (int v)
00115 {
00116     // Underlying write is thread safe
00117     write(v);
00118     return *this;
00119 }
00120 
00121 BusInOut &BusInOut::operator= (BusInOut &rhs)
00122 {
00123     // Underlying read is thread safe
00124     write(rhs.read());
00125     return *this;
00126 }
00127 
00128 DigitalInOut &BusInOut::operator[](int index)
00129 {
00130     // No lock needed since _pin is not modified outside the constructor
00131     MBED_ASSERT(index >= 0 && index <= 16);
00132     MBED_ASSERT(_pin[index]);
00133     return *_pin[index];
00134 }
00135 
00136 BusInOut::operator int()
00137 {
00138     // Underlying read is thread safe
00139     return read();
00140 }
00141 
00142 void BusInOut::lock()
00143 {
00144     _mutex.lock();
00145 }
00146 
00147 void BusInOut::unlock()
00148 {
00149     _mutex.unlock();
00150 }
00151 
00152 } // namespace mbed