takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BusOut.cpp Source File

BusOut.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/BusOut.h"
00017 #include "platform/mbed_assert.h"
00018 
00019 namespace mbed {
00020 
00021 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)
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 DigitalOut(pins[i]) : 0;
00029         if (pins[i] != NC) {
00030             _nc_mask |= (1 << i);
00031         }
00032     }
00033 }
00034 
00035 BusOut::BusOut(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 DigitalOut(pins[i]) : 0;
00041         if (pins[i] != NC) {
00042             _nc_mask |= (1 << i);
00043         }
00044     }
00045 }
00046 
00047 BusOut::~BusOut()
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 BusOut::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 BusOut::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 BusOut &BusOut::operator= (int v)
00082 {
00083     // Underlying write is thread safe
00084     write(v);
00085     return *this;
00086 }
00087 
00088 BusOut &BusOut::operator= (BusOut &rhs)
00089 {
00090     // Underlying write is thread safe
00091     write(rhs.read());
00092     return *this;
00093 }
00094 
00095 DigitalOut &BusOut::operator[](int index)
00096 {
00097     // No lock needed since _pin is not modified outside the constructor
00098     MBED_ASSERT(index >= 0 && index <= 16);
00099     MBED_ASSERT(_pin[index]);
00100     return *_pin[index];
00101 }
00102 
00103 BusOut::operator int()
00104 {
00105     // Underlying read is thread safe
00106     return read();
00107 }
00108 
00109 void BusOut::lock()
00110 {
00111     _mutex.lock();
00112 }
00113 
00114 void BusOut::unlock()
00115 {
00116     _mutex.unlock();
00117 }
00118 
00119 } // namespace mbed