init

Dependencies:   mbed

Committer:
Nathan Yonkee
Date:
Fri Mar 02 07:16:49 2018 -0700
Revision:
10:46a4cf51ee38
Parent:
9:d58e77ebd769
remove mbed-os

Who changed what in which revision?

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