mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
187:0387e8f68319
mbed library release version 165

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