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/BusOut.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 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) {
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 DigitalOut(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 BusOut::BusOut(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 DigitalOut(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 BusOut::~BusOut() {
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 void BusOut::write(int value) {
valeyev 0:e056ac8fecf8 55 lock();
valeyev 0:e056ac8fecf8 56 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 57 if (_pin[i] != 0) {
valeyev 0:e056ac8fecf8 58 _pin[i]->write((value >> i) & 1);
valeyev 0:e056ac8fecf8 59 }
valeyev 0:e056ac8fecf8 60 }
valeyev 0:e056ac8fecf8 61 unlock();
valeyev 0:e056ac8fecf8 62 }
valeyev 0:e056ac8fecf8 63
valeyev 0:e056ac8fecf8 64 int BusOut::read() {
valeyev 0:e056ac8fecf8 65 lock();
valeyev 0:e056ac8fecf8 66 int v = 0;
valeyev 0:e056ac8fecf8 67 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 68 if (_pin[i] != 0) {
valeyev 0:e056ac8fecf8 69 v |= _pin[i]->read() << i;
valeyev 0:e056ac8fecf8 70 }
valeyev 0:e056ac8fecf8 71 }
valeyev 0:e056ac8fecf8 72 unlock();
valeyev 0:e056ac8fecf8 73 return v;
valeyev 0:e056ac8fecf8 74 }
valeyev 0:e056ac8fecf8 75
valeyev 0:e056ac8fecf8 76 BusOut& BusOut::operator= (int v) {
valeyev 0:e056ac8fecf8 77 // Underlying write is thread safe
valeyev 0:e056ac8fecf8 78 write(v);
valeyev 0:e056ac8fecf8 79 return *this;
valeyev 0:e056ac8fecf8 80 }
valeyev 0:e056ac8fecf8 81
valeyev 0:e056ac8fecf8 82 BusOut& BusOut::operator= (BusOut& rhs) {
valeyev 0:e056ac8fecf8 83 // Underlying write is thread safe
valeyev 0:e056ac8fecf8 84 write(rhs.read());
valeyev 0:e056ac8fecf8 85 return *this;
valeyev 0:e056ac8fecf8 86 }
valeyev 0:e056ac8fecf8 87
valeyev 0:e056ac8fecf8 88 DigitalOut& BusOut::operator[] (int index) {
valeyev 0:e056ac8fecf8 89 // No lock needed since _pin is not modified outside the constructor
valeyev 0:e056ac8fecf8 90 MBED_ASSERT(index >= 0 && index <= 16);
valeyev 0:e056ac8fecf8 91 MBED_ASSERT(_pin[index]);
valeyev 0:e056ac8fecf8 92 return *_pin[index];
valeyev 0:e056ac8fecf8 93 }
valeyev 0:e056ac8fecf8 94
valeyev 0:e056ac8fecf8 95 BusOut::operator int() {
valeyev 0:e056ac8fecf8 96 // Underlying read is thread safe
valeyev 0:e056ac8fecf8 97 return read();
valeyev 0:e056ac8fecf8 98 }
valeyev 0:e056ac8fecf8 99
valeyev 0:e056ac8fecf8 100 void BusOut::lock() {
valeyev 0:e056ac8fecf8 101 _mutex.lock();
valeyev 0:e056ac8fecf8 102 }
valeyev 0:e056ac8fecf8 103
valeyev 0:e056ac8fecf8 104 void BusOut::unlock() {
valeyev 0:e056ac8fecf8 105 _mutex.unlock();
valeyev 0:e056ac8fecf8 106 }
valeyev 0:e056ac8fecf8 107
valeyev 0:e056ac8fecf8 108 } // namespace mbed