takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BusIn.cpp Source File

BusIn.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/BusIn.h"
00017 #include "platform/mbed_assert.h"
00018 
00019 namespace mbed {
00020 
00021 BusIn::BusIn(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 DigitalIn(pins[i]) : 0;
00029         if (pins[i] != NC) {
00030             _nc_mask |= (1 << i);
00031         }
00032     }
00033 }
00034 
00035 BusIn::BusIn(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 DigitalIn(pins[i]) : 0;
00041         if (pins[i] != NC) {
00042             _nc_mask |= (1 << i);
00043         }
00044     }
00045 }
00046 
00047 BusIn::~BusIn()
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 int BusIn::read()
00058 {
00059     int v = 0;
00060     lock();
00061     for (int i = 0; i < 16; i++) {
00062         if (_pin[i] != 0) {
00063             v |= _pin[i]->read() << i;
00064         }
00065     }
00066     unlock();
00067     return v;
00068 }
00069 
00070 void BusIn::mode(PinMode pull)
00071 {
00072     lock();
00073     for (int i = 0; i < 16; i++) {
00074         if (_pin[i] != 0) {
00075             _pin[i]->mode(pull);
00076         }
00077     }
00078     unlock();
00079 }
00080 
00081 void BusIn::lock()
00082 {
00083     _mutex.lock();
00084 }
00085 
00086 void BusIn::unlock()
00087 {
00088     _mutex.unlock();
00089 }
00090 
00091 BusIn::operator int()
00092 {
00093     // Underlying read is thread safe
00094     return read();
00095 }
00096 
00097 DigitalIn &BusIn::operator[](int index)
00098 {
00099     // No lock needed since _pin is not modified outside the constructor
00100     MBED_ASSERT(index >= 0 && index <= 16);
00101     MBED_ASSERT(_pin[index]);
00102     return *_pin[index];
00103 }
00104 
00105 } // namespace mbed