RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
Parent:
0:38ceb79fef03
2019-03-13

Who changed what in which revision?

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