1

Committer:
valeyev
Date:
Tue Mar 13 07:17:50 2018 +0000
Revision:
0:e056ac8fecf8
looking for...

Who changed what in which revision?

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