1232

Committer:
ganlikun
Date:
Mon Oct 24 15:19:39 2022 +0000
Revision:
0:06036f8bee2d
11

Who changed what in which revision?

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