001

Committer:
ganlikun
Date:
Sun Jun 12 14:02:44 2022 +0000
Revision:
0:13413ea9a877
00

Who changed what in which revision?

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