mbed library sources

Fork of mbed-src by mbed official

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 "BusInOut.h"
00017 #include "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     _nc_mask = 0;
00025     for (int i=0; i<16; i++) {
00026         _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0;
00027         if (pins[i] != NC) {
00028             _nc_mask |= (1 << i);
00029         }
00030     }
00031 }
00032 
00033 BusInOut::BusInOut(PinName pins[16]) {
00034     _nc_mask = 0;
00035     for (int i=0; i<16; i++) {
00036         _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0;
00037         if (pins[i] != NC) {
00038             _nc_mask |= (1 << i);
00039         }
00040     }
00041 }
00042 
00043 BusInOut::~BusInOut() {
00044     for (int i=0; i<16; i++) {
00045         if (_pin[i] != 0) {
00046             delete _pin[i];
00047         }
00048     }
00049 }
00050 
00051 void BusInOut::write(int value) {
00052     for (int i=0; i<16; i++) {
00053         if (_pin[i] != 0) {
00054             _pin[i]->write((value >> i) & 1);
00055         }
00056     }
00057 }
00058 
00059 int BusInOut::read() {
00060     int v = 0;
00061     for (int i=0; i<16; i++) {
00062         if (_pin[i] != 0) {
00063             v |= _pin[i]->read() << i;
00064         }
00065     }
00066     return v;
00067 }
00068 
00069 void BusInOut::output() {
00070     for (int i=0; i<16; i++) {
00071         if (_pin[i] != 0) {
00072             _pin[i]->output();
00073         }
00074     }
00075 }
00076 
00077 void BusInOut::input() {
00078     for (int i=0; i<16; i++) {
00079         if (_pin[i] != 0) {
00080             _pin[i]->input();
00081         }
00082     }
00083 }
00084 
00085 void BusInOut::mode(PinMode pull) {
00086     for (int i=0; i<16; i++) {
00087         if (_pin[i] != 0) {
00088             _pin[i]->mode(pull);
00089         }
00090     }
00091 }
00092 
00093 #ifdef MBED_OPERATORS
00094 BusInOut& BusInOut::operator= (int v) {
00095     write(v);
00096     return *this;
00097 }
00098 
00099 BusInOut& BusInOut::operator= (BusInOut& rhs) {
00100     write(rhs.read());
00101     return *this;
00102 }
00103 
00104 DigitalInOut& BusInOut::operator[] (int index) {
00105     MBED_ASSERT(index >= 0 && index <= 16);
00106     MBED_ASSERT(_pin[index]);
00107     return *_pin[index];
00108 }
00109 
00110 BusInOut::operator int() {
00111     return read();
00112 }
00113 #endif
00114 
00115 } // namespace mbed