TUKS MCU Introductory course / TUKS-COURSE-2-LED
Committer:
elmot
Date:
Sat Feb 25 08:59:21 2017 +0000
Revision:
6:0018763974d3
Parent:
1:d0dfbce63a89
No comment

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/BusInOut.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 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) {
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 DigitalInOut(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 BusInOut::BusInOut(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 DigitalInOut(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 BusInOut::~BusInOut() {
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 void BusInOut::write(int value) {
elmot 1:d0dfbce63a89 55 lock();
elmot 1:d0dfbce63a89 56 for (int i=0; i<16; i++) {
elmot 1:d0dfbce63a89 57 if (_pin[i] != 0) {
elmot 1:d0dfbce63a89 58 _pin[i]->write((value >> i) & 1);
elmot 1:d0dfbce63a89 59 }
elmot 1:d0dfbce63a89 60 }
elmot 1:d0dfbce63a89 61 unlock();
elmot 1:d0dfbce63a89 62 }
elmot 1:d0dfbce63a89 63
elmot 1:d0dfbce63a89 64 int BusInOut::read() {
elmot 1:d0dfbce63a89 65 lock();
elmot 1:d0dfbce63a89 66 int v = 0;
elmot 1:d0dfbce63a89 67 for (int i=0; i<16; i++) {
elmot 1:d0dfbce63a89 68 if (_pin[i] != 0) {
elmot 1:d0dfbce63a89 69 v |= _pin[i]->read() << i;
elmot 1:d0dfbce63a89 70 }
elmot 1:d0dfbce63a89 71 }
elmot 1:d0dfbce63a89 72 unlock();
elmot 1:d0dfbce63a89 73 return v;
elmot 1:d0dfbce63a89 74 }
elmot 1:d0dfbce63a89 75
elmot 1:d0dfbce63a89 76 void BusInOut::output() {
elmot 1:d0dfbce63a89 77 lock();
elmot 1:d0dfbce63a89 78 for (int i=0; i<16; i++) {
elmot 1:d0dfbce63a89 79 if (_pin[i] != 0) {
elmot 1:d0dfbce63a89 80 _pin[i]->output();
elmot 1:d0dfbce63a89 81 }
elmot 1:d0dfbce63a89 82 }
elmot 1:d0dfbce63a89 83 unlock();
elmot 1:d0dfbce63a89 84 }
elmot 1:d0dfbce63a89 85
elmot 1:d0dfbce63a89 86 void BusInOut::input() {
elmot 1:d0dfbce63a89 87 lock();
elmot 1:d0dfbce63a89 88 for (int i=0; i<16; i++) {
elmot 1:d0dfbce63a89 89 if (_pin[i] != 0) {
elmot 1:d0dfbce63a89 90 _pin[i]->input();
elmot 1:d0dfbce63a89 91 }
elmot 1:d0dfbce63a89 92 }
elmot 1:d0dfbce63a89 93 unlock();
elmot 1:d0dfbce63a89 94 }
elmot 1:d0dfbce63a89 95
elmot 1:d0dfbce63a89 96 void BusInOut::mode(PinMode pull) {
elmot 1:d0dfbce63a89 97 lock();
elmot 1:d0dfbce63a89 98 for (int i=0; i<16; i++) {
elmot 1:d0dfbce63a89 99 if (_pin[i] != 0) {
elmot 1:d0dfbce63a89 100 _pin[i]->mode(pull);
elmot 1:d0dfbce63a89 101 }
elmot 1:d0dfbce63a89 102 }
elmot 1:d0dfbce63a89 103 unlock();
elmot 1:d0dfbce63a89 104 }
elmot 1:d0dfbce63a89 105
elmot 1:d0dfbce63a89 106 BusInOut& BusInOut::operator= (int v) {
elmot 1:d0dfbce63a89 107 // Underlying write is thread safe
elmot 1:d0dfbce63a89 108 write(v);
elmot 1:d0dfbce63a89 109 return *this;
elmot 1:d0dfbce63a89 110 }
elmot 1:d0dfbce63a89 111
elmot 1:d0dfbce63a89 112 BusInOut& BusInOut::operator= (BusInOut& rhs) {
elmot 1:d0dfbce63a89 113 // Underlying read is thread safe
elmot 1:d0dfbce63a89 114 write(rhs.read());
elmot 1:d0dfbce63a89 115 return *this;
elmot 1:d0dfbce63a89 116 }
elmot 1:d0dfbce63a89 117
elmot 1:d0dfbce63a89 118 DigitalInOut& BusInOut::operator[] (int index) {
elmot 1:d0dfbce63a89 119 // No lock needed since _pin is not modified outside the constructor
elmot 1:d0dfbce63a89 120 MBED_ASSERT(index >= 0 && index <= 16);
elmot 1:d0dfbce63a89 121 MBED_ASSERT(_pin[index]);
elmot 1:d0dfbce63a89 122 return *_pin[index];
elmot 1:d0dfbce63a89 123 }
elmot 1:d0dfbce63a89 124
elmot 1:d0dfbce63a89 125 BusInOut::operator int() {
elmot 1:d0dfbce63a89 126 // Underlying read is thread safe
elmot 1:d0dfbce63a89 127 return read();
elmot 1:d0dfbce63a89 128 }
elmot 1:d0dfbce63a89 129
elmot 1:d0dfbce63a89 130 void BusInOut::lock() {
elmot 1:d0dfbce63a89 131 _mutex.lock();
elmot 1:d0dfbce63a89 132 }
elmot 1:d0dfbce63a89 133
elmot 1:d0dfbce63a89 134 void BusInOut::unlock() {
elmot 1:d0dfbce63a89 135 _mutex.unlock();
elmot 1:d0dfbce63a89 136 }
elmot 1:d0dfbce63a89 137
elmot 1:d0dfbce63a89 138 } // namespace mbed