PES4 / Mbed OS Queue_02
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

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