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/BusOut.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 BusOut::BusOut(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 DigitalOut(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 BusOut::BusOut(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 DigitalOut(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 BusOut::~BusOut() {
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 BusOut::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 BusOut::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 BusOut& BusOut::operator= (int v) {
elmot 1:d0dfbce63a89 77 // Underlying write is thread safe
elmot 1:d0dfbce63a89 78 write(v);
elmot 1:d0dfbce63a89 79 return *this;
elmot 1:d0dfbce63a89 80 }
elmot 1:d0dfbce63a89 81
elmot 1:d0dfbce63a89 82 BusOut& BusOut::operator= (BusOut& rhs) {
elmot 1:d0dfbce63a89 83 // Underlying write is thread safe
elmot 1:d0dfbce63a89 84 write(rhs.read());
elmot 1:d0dfbce63a89 85 return *this;
elmot 1:d0dfbce63a89 86 }
elmot 1:d0dfbce63a89 87
elmot 1:d0dfbce63a89 88 DigitalOut& BusOut::operator[] (int index) {
elmot 1:d0dfbce63a89 89 // No lock needed since _pin is not modified outside the constructor
elmot 1:d0dfbce63a89 90 MBED_ASSERT(index >= 0 && index <= 16);
elmot 1:d0dfbce63a89 91 MBED_ASSERT(_pin[index]);
elmot 1:d0dfbce63a89 92 return *_pin[index];
elmot 1:d0dfbce63a89 93 }
elmot 1:d0dfbce63a89 94
elmot 1:d0dfbce63a89 95 BusOut::operator int() {
elmot 1:d0dfbce63a89 96 // Underlying read is thread safe
elmot 1:d0dfbce63a89 97 return read();
elmot 1:d0dfbce63a89 98 }
elmot 1:d0dfbce63a89 99
elmot 1:d0dfbce63a89 100 void BusOut::lock() {
elmot 1:d0dfbce63a89 101 _mutex.lock();
elmot 1:d0dfbce63a89 102 }
elmot 1:d0dfbce63a89 103
elmot 1:d0dfbce63a89 104 void BusOut::unlock() {
elmot 1:d0dfbce63a89 105 _mutex.unlock();
elmot 1:d0dfbce63a89 106 }
elmot 1:d0dfbce63a89 107
elmot 1:d0dfbce63a89 108 } // namespace mbed