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/BusIn.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 BusIn::BusIn(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 DigitalIn(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 BusIn::BusIn(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 DigitalIn(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 BusIn::~BusIn() {
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 int BusIn::read() {
demayer 0:6bf0743ece18 55 int v = 0;
demayer 0:6bf0743ece18 56 lock();
demayer 0:6bf0743ece18 57 for (int i=0; i<16; i++) {
demayer 0:6bf0743ece18 58 if (_pin[i] != 0) {
demayer 0:6bf0743ece18 59 v |= _pin[i]->read() << i;
demayer 0:6bf0743ece18 60 }
demayer 0:6bf0743ece18 61 }
demayer 0:6bf0743ece18 62 unlock();
demayer 0:6bf0743ece18 63 return v;
demayer 0:6bf0743ece18 64 }
demayer 0:6bf0743ece18 65
demayer 0:6bf0743ece18 66 void BusIn::mode(PinMode pull) {
demayer 0:6bf0743ece18 67 lock();
demayer 0:6bf0743ece18 68 for (int i=0; i<16; i++) {
demayer 0:6bf0743ece18 69 if (_pin[i] != 0) {
demayer 0:6bf0743ece18 70 _pin[i]->mode(pull);
demayer 0:6bf0743ece18 71 }
demayer 0:6bf0743ece18 72 }
demayer 0:6bf0743ece18 73 unlock();
demayer 0:6bf0743ece18 74 }
demayer 0:6bf0743ece18 75
demayer 0:6bf0743ece18 76 void BusIn::lock() {
demayer 0:6bf0743ece18 77 _mutex.lock();
demayer 0:6bf0743ece18 78 }
demayer 0:6bf0743ece18 79
demayer 0:6bf0743ece18 80 void BusIn::unlock() {
demayer 0:6bf0743ece18 81 _mutex.unlock();
demayer 0:6bf0743ece18 82 }
demayer 0:6bf0743ece18 83
demayer 0:6bf0743ece18 84 BusIn::operator int() {
demayer 0:6bf0743ece18 85 // Underlying read is thread safe
demayer 0:6bf0743ece18 86 return read();
demayer 0:6bf0743ece18 87 }
demayer 0:6bf0743ece18 88
demayer 0:6bf0743ece18 89 DigitalIn& BusIn::operator[] (int index) {
demayer 0:6bf0743ece18 90 // No lock needed since _pin is not modified outside the constructor
demayer 0:6bf0743ece18 91 MBED_ASSERT(index >= 0 && index <= 16);
demayer 0:6bf0743ece18 92 MBED_ASSERT(_pin[index]);
demayer 0:6bf0743ece18 93 return *_pin[index];
demayer 0:6bf0743ece18 94 }
demayer 0:6bf0743ece18 95
demayer 0:6bf0743ece18 96 } // namespace mbed