mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Thu Sep 06 13:40:20 2018 +0100
Revision:
187:0387e8f68319
Parent:
149:156823d33999
Child:
189:f392fc9709a3
mbed-dev library. Release version 163

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 149:156823d33999 1 /* mbed Microcontroller Library
<> 149:156823d33999 2 * Copyright (c) 2006-2013 ARM Limited
<> 149:156823d33999 3 *
<> 149:156823d33999 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 149:156823d33999 5 * you may not use this file except in compliance with the License.
<> 149:156823d33999 6 * You may obtain a copy of the License at
<> 149:156823d33999 7 *
<> 149:156823d33999 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 149:156823d33999 9 *
<> 149:156823d33999 10 * Unless required by applicable law or agreed to in writing, software
<> 149:156823d33999 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 149:156823d33999 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 149:156823d33999 13 * See the License for the specific language governing permissions and
<> 149:156823d33999 14 * limitations under the License.
<> 149:156823d33999 15 */
<> 149:156823d33999 16 #include "drivers/BusInOut.h"
<> 149:156823d33999 17 #include "platform/mbed_assert.h"
<> 149:156823d33999 18
<> 149:156823d33999 19 namespace mbed {
<> 149:156823d33999 20
AnnaBridge 187:0387e8f68319 21 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)
AnnaBridge 187:0387e8f68319 22 {
<> 149:156823d33999 23 PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15};
<> 149:156823d33999 24
<> 149:156823d33999 25 // No lock needed in the constructor
<> 149:156823d33999 26 _nc_mask = 0;
AnnaBridge 187:0387e8f68319 27 for (int i = 0; i < 16; i++) {
<> 149:156823d33999 28 _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0;
<> 149:156823d33999 29 if (pins[i] != NC) {
<> 149:156823d33999 30 _nc_mask |= (1 << i);
<> 149:156823d33999 31 }
<> 149:156823d33999 32 }
<> 149:156823d33999 33 }
<> 149:156823d33999 34
AnnaBridge 187:0387e8f68319 35 BusInOut::BusInOut(PinName pins[16])
AnnaBridge 187:0387e8f68319 36 {
<> 149:156823d33999 37 // No lock needed in the constructor
<> 149:156823d33999 38 _nc_mask = 0;
AnnaBridge 187:0387e8f68319 39 for (int i = 0; i < 16; i++) {
<> 149:156823d33999 40 _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0;
<> 149:156823d33999 41 if (pins[i] != NC) {
<> 149:156823d33999 42 _nc_mask |= (1 << i);
<> 149:156823d33999 43 }
<> 149:156823d33999 44 }
<> 149:156823d33999 45 }
<> 149:156823d33999 46
AnnaBridge 187:0387e8f68319 47 BusInOut::~BusInOut()
AnnaBridge 187:0387e8f68319 48 {
<> 149:156823d33999 49 // No lock needed in the destructor
AnnaBridge 187:0387e8f68319 50 for (int i = 0; i < 16; i++) {
<> 149:156823d33999 51 if (_pin[i] != 0) {
<> 149:156823d33999 52 delete _pin[i];
<> 149:156823d33999 53 }
<> 149:156823d33999 54 }
<> 149:156823d33999 55 }
<> 149:156823d33999 56
AnnaBridge 187:0387e8f68319 57 void BusInOut::write(int value)
AnnaBridge 187:0387e8f68319 58 {
<> 149:156823d33999 59 lock();
AnnaBridge 187:0387e8f68319 60 for (int i = 0; i < 16; i++) {
<> 149:156823d33999 61 if (_pin[i] != 0) {
<> 149:156823d33999 62 _pin[i]->write((value >> i) & 1);
<> 149:156823d33999 63 }
<> 149:156823d33999 64 }
<> 149:156823d33999 65 unlock();
<> 149:156823d33999 66 }
<> 149:156823d33999 67
AnnaBridge 187:0387e8f68319 68 int BusInOut::read()
AnnaBridge 187:0387e8f68319 69 {
<> 149:156823d33999 70 lock();
<> 149:156823d33999 71 int v = 0;
AnnaBridge 187:0387e8f68319 72 for (int i = 0; i < 16; i++) {
<> 149:156823d33999 73 if (_pin[i] != 0) {
<> 149:156823d33999 74 v |= _pin[i]->read() << i;
<> 149:156823d33999 75 }
<> 149:156823d33999 76 }
<> 149:156823d33999 77 unlock();
<> 149:156823d33999 78 return v;
<> 149:156823d33999 79 }
<> 149:156823d33999 80
AnnaBridge 187:0387e8f68319 81 void BusInOut::output()
AnnaBridge 187:0387e8f68319 82 {
<> 149:156823d33999 83 lock();
AnnaBridge 187:0387e8f68319 84 for (int i = 0; i < 16; i++) {
<> 149:156823d33999 85 if (_pin[i] != 0) {
<> 149:156823d33999 86 _pin[i]->output();
<> 149:156823d33999 87 }
<> 149:156823d33999 88 }
<> 149:156823d33999 89 unlock();
<> 149:156823d33999 90 }
<> 149:156823d33999 91
AnnaBridge 187:0387e8f68319 92 void BusInOut::input()
AnnaBridge 187:0387e8f68319 93 {
<> 149:156823d33999 94 lock();
AnnaBridge 187:0387e8f68319 95 for (int i = 0; i < 16; i++) {
<> 149:156823d33999 96 if (_pin[i] != 0) {
<> 149:156823d33999 97 _pin[i]->input();
<> 149:156823d33999 98 }
<> 149:156823d33999 99 }
<> 149:156823d33999 100 unlock();
<> 149:156823d33999 101 }
<> 149:156823d33999 102
AnnaBridge 187:0387e8f68319 103 void BusInOut::mode(PinMode pull)
AnnaBridge 187:0387e8f68319 104 {
<> 149:156823d33999 105 lock();
AnnaBridge 187:0387e8f68319 106 for (int i = 0; i < 16; i++) {
<> 149:156823d33999 107 if (_pin[i] != 0) {
<> 149:156823d33999 108 _pin[i]->mode(pull);
<> 149:156823d33999 109 }
<> 149:156823d33999 110 }
<> 149:156823d33999 111 unlock();
<> 149:156823d33999 112 }
<> 149:156823d33999 113
AnnaBridge 187:0387e8f68319 114 BusInOut &BusInOut::operator= (int v)
AnnaBridge 187:0387e8f68319 115 {
<> 149:156823d33999 116 // Underlying write is thread safe
<> 149:156823d33999 117 write(v);
<> 149:156823d33999 118 return *this;
<> 149:156823d33999 119 }
<> 149:156823d33999 120
AnnaBridge 187:0387e8f68319 121 BusInOut &BusInOut::operator= (BusInOut &rhs)
AnnaBridge 187:0387e8f68319 122 {
<> 149:156823d33999 123 // Underlying read is thread safe
<> 149:156823d33999 124 write(rhs.read());
<> 149:156823d33999 125 return *this;
<> 149:156823d33999 126 }
<> 149:156823d33999 127
AnnaBridge 187:0387e8f68319 128 DigitalInOut &BusInOut::operator[](int index)
AnnaBridge 187:0387e8f68319 129 {
<> 149:156823d33999 130 // No lock needed since _pin is not modified outside the constructor
<> 149:156823d33999 131 MBED_ASSERT(index >= 0 && index <= 16);
<> 149:156823d33999 132 MBED_ASSERT(_pin[index]);
<> 149:156823d33999 133 return *_pin[index];
<> 149:156823d33999 134 }
<> 149:156823d33999 135
AnnaBridge 187:0387e8f68319 136 BusInOut::operator int()
AnnaBridge 187:0387e8f68319 137 {
<> 149:156823d33999 138 // Underlying read is thread safe
<> 149:156823d33999 139 return read();
<> 149:156823d33999 140 }
<> 149:156823d33999 141
AnnaBridge 187:0387e8f68319 142 void BusInOut::lock()
AnnaBridge 187:0387e8f68319 143 {
<> 149:156823d33999 144 _mutex.lock();
<> 149:156823d33999 145 }
<> 149:156823d33999 146
AnnaBridge 187:0387e8f68319 147 void BusInOut::unlock()
AnnaBridge 187:0387e8f68319 148 {
<> 149:156823d33999 149 _mutex.unlock();
<> 149:156823d33999 150 }
<> 149:156823d33999 151
<> 149:156823d33999 152 } // namespace mbed