TUKS MCU Introductory course / TUKS-COURSE-TIMER
Committer:
elmot
Date:
Fri Feb 24 21:13:56 2017 +0000
Revision:
1:d0dfbce63a89
Ready-to-copy

Who changed what in which revision?

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