001

Committer:
ganlikun
Date:
Sun Jun 12 14:02:44 2022 +0000
Revision:
0:13413ea9a877
00

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ganlikun 0:13413ea9a877 1 /* mbed Microcontroller Library
ganlikun 0:13413ea9a877 2 * Copyright (c) 2006-2013 ARM Limited
ganlikun 0:13413ea9a877 3 *
ganlikun 0:13413ea9a877 4 * Licensed under the Apache License, Version 2.0 (the "License");
ganlikun 0:13413ea9a877 5 * you may not use this file except in compliance with the License.
ganlikun 0:13413ea9a877 6 * You may obtain a copy of the License at
ganlikun 0:13413ea9a877 7 *
ganlikun 0:13413ea9a877 8 * http://www.apache.org/licenses/LICENSE-2.0
ganlikun 0:13413ea9a877 9 *
ganlikun 0:13413ea9a877 10 * Unless required by applicable law or agreed to in writing, software
ganlikun 0:13413ea9a877 11 * distributed under the License is distributed on an "AS IS" BASIS,
ganlikun 0:13413ea9a877 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ganlikun 0:13413ea9a877 13 * See the License for the specific language governing permissions and
ganlikun 0:13413ea9a877 14 * limitations under the License.
ganlikun 0:13413ea9a877 15 */
ganlikun 0:13413ea9a877 16 #include "drivers/BusIn.h"
ganlikun 0:13413ea9a877 17 #include "platform/mbed_assert.h"
ganlikun 0:13413ea9a877 18
ganlikun 0:13413ea9a877 19 namespace mbed {
ganlikun 0:13413ea9a877 20
ganlikun 0:13413ea9a877 21 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) {
ganlikun 0:13413ea9a877 22 PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15};
ganlikun 0:13413ea9a877 23
ganlikun 0:13413ea9a877 24 // No lock needed in the constructor
ganlikun 0:13413ea9a877 25 _nc_mask = 0;
ganlikun 0:13413ea9a877 26 for (int i=0; i<16; i++) {
ganlikun 0:13413ea9a877 27 _pin[i] = (pins[i] != NC) ? new DigitalIn(pins[i]) : 0;
ganlikun 0:13413ea9a877 28 if (pins[i] != NC) {
ganlikun 0:13413ea9a877 29 _nc_mask |= (1 << i);
ganlikun 0:13413ea9a877 30 }
ganlikun 0:13413ea9a877 31 }
ganlikun 0:13413ea9a877 32 }
ganlikun 0:13413ea9a877 33
ganlikun 0:13413ea9a877 34 BusIn::BusIn(PinName pins[16]) {
ganlikun 0:13413ea9a877 35 // No lock needed in the constructor
ganlikun 0:13413ea9a877 36 _nc_mask = 0;
ganlikun 0:13413ea9a877 37 for (int i=0; i<16; i++) {
ganlikun 0:13413ea9a877 38 _pin[i] = (pins[i] != NC) ? new DigitalIn(pins[i]) : 0;
ganlikun 0:13413ea9a877 39 if (pins[i] != NC) {
ganlikun 0:13413ea9a877 40 _nc_mask |= (1 << i);
ganlikun 0:13413ea9a877 41 }
ganlikun 0:13413ea9a877 42 }
ganlikun 0:13413ea9a877 43 }
ganlikun 0:13413ea9a877 44
ganlikun 0:13413ea9a877 45 BusIn::~BusIn() {
ganlikun 0:13413ea9a877 46 // No lock needed in the destructor
ganlikun 0:13413ea9a877 47 for (int i=0; i<16; i++) {
ganlikun 0:13413ea9a877 48 if (_pin[i] != 0) {
ganlikun 0:13413ea9a877 49 delete _pin[i];
ganlikun 0:13413ea9a877 50 }
ganlikun 0:13413ea9a877 51 }
ganlikun 0:13413ea9a877 52 }
ganlikun 0:13413ea9a877 53
ganlikun 0:13413ea9a877 54 int BusIn::read() {
ganlikun 0:13413ea9a877 55 int v = 0;
ganlikun 0:13413ea9a877 56 lock();
ganlikun 0:13413ea9a877 57 for (int i=0; i<16; i++) {
ganlikun 0:13413ea9a877 58 if (_pin[i] != 0) {
ganlikun 0:13413ea9a877 59 v |= _pin[i]->read() << i;
ganlikun 0:13413ea9a877 60 }
ganlikun 0:13413ea9a877 61 }
ganlikun 0:13413ea9a877 62 unlock();
ganlikun 0:13413ea9a877 63 return v;
ganlikun 0:13413ea9a877 64 }
ganlikun 0:13413ea9a877 65
ganlikun 0:13413ea9a877 66 void BusIn::mode(PinMode pull) {
ganlikun 0:13413ea9a877 67 lock();
ganlikun 0:13413ea9a877 68 for (int i=0; i<16; i++) {
ganlikun 0:13413ea9a877 69 if (_pin[i] != 0) {
ganlikun 0:13413ea9a877 70 _pin[i]->mode(pull);
ganlikun 0:13413ea9a877 71 }
ganlikun 0:13413ea9a877 72 }
ganlikun 0:13413ea9a877 73 unlock();
ganlikun 0:13413ea9a877 74 }
ganlikun 0:13413ea9a877 75
ganlikun 0:13413ea9a877 76 void BusIn::lock() {
ganlikun 0:13413ea9a877 77 _mutex.lock();
ganlikun 0:13413ea9a877 78 }
ganlikun 0:13413ea9a877 79
ganlikun 0:13413ea9a877 80 void BusIn::unlock() {
ganlikun 0:13413ea9a877 81 _mutex.unlock();
ganlikun 0:13413ea9a877 82 }
ganlikun 0:13413ea9a877 83
ganlikun 0:13413ea9a877 84 BusIn::operator int() {
ganlikun 0:13413ea9a877 85 // Underlying read is thread safe
ganlikun 0:13413ea9a877 86 return read();
ganlikun 0:13413ea9a877 87 }
ganlikun 0:13413ea9a877 88
ganlikun 0:13413ea9a877 89 DigitalIn& BusIn::operator[] (int index) {
ganlikun 0:13413ea9a877 90 // No lock needed since _pin is not modified outside the constructor
ganlikun 0:13413ea9a877 91 MBED_ASSERT(index >= 0 && index <= 16);
ganlikun 0:13413ea9a877 92 MBED_ASSERT(_pin[index]);
ganlikun 0:13413ea9a877 93 return *_pin[index];
ganlikun 0:13413ea9a877 94 }
ganlikun 0:13413ea9a877 95
ganlikun 0:13413ea9a877 96 } // namespace mbed
ganlikun 0:13413ea9a877 97