Home Alert System

Dependencies:   PWM_Tone_Library DHT

Committer:
aziz111
Date:
Fri Mar 08 17:15:02 2019 +0000
Revision:
5:569a4894abc1
Parent:
3:78f223d34f36
Final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ethaderu 3:78f223d34f36 1 /* mbed Microcontroller Library
ethaderu 3:78f223d34f36 2 * Copyright (c) 2006-2012 ARM Limited
ethaderu 3:78f223d34f36 3 *
ethaderu 3:78f223d34f36 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
ethaderu 3:78f223d34f36 5 * of this software and associated documentation files (the "Software"), to deal
ethaderu 3:78f223d34f36 6 * in the Software without restriction, including without limitation the rights
ethaderu 3:78f223d34f36 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
ethaderu 3:78f223d34f36 8 * copies of the Software, and to permit persons to whom the Software is
ethaderu 3:78f223d34f36 9 * furnished to do so, subject to the following conditions:
ethaderu 3:78f223d34f36 10 *
ethaderu 3:78f223d34f36 11 * The above copyright notice and this permission notice shall be included in
ethaderu 3:78f223d34f36 12 * all copies or substantial portions of the Software.
ethaderu 3:78f223d34f36 13 *
ethaderu 3:78f223d34f36 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
ethaderu 3:78f223d34f36 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
ethaderu 3:78f223d34f36 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
ethaderu 3:78f223d34f36 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
ethaderu 3:78f223d34f36 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ethaderu 3:78f223d34f36 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
ethaderu 3:78f223d34f36 20 * SOFTWARE.
ethaderu 3:78f223d34f36 21 */
ethaderu 3:78f223d34f36 22 #include "Thread.h"
ethaderu 3:78f223d34f36 23
ethaderu 3:78f223d34f36 24 #include "mbed_error.h"
ethaderu 3:78f223d34f36 25
ethaderu 3:78f223d34f36 26 namespace rtos {
ethaderu 3:78f223d34f36 27
ethaderu 3:78f223d34f36 28 Thread::Thread(void (*task)(void const *argument), void *argument,
ethaderu 3:78f223d34f36 29 osPriority priority, uint32_t stack_size, unsigned char *stack_pointer) {
ethaderu 3:78f223d34f36 30 #ifdef CMSIS_OS_RTX
ethaderu 3:78f223d34f36 31 _thread_def.pthread = task;
ethaderu 3:78f223d34f36 32 _thread_def.tpriority = priority;
ethaderu 3:78f223d34f36 33 _thread_def.stacksize = stack_size;
ethaderu 3:78f223d34f36 34 if (stack_pointer != NULL) {
ethaderu 3:78f223d34f36 35 _thread_def.stack_pointer = (uint32_t*)stack_pointer;
ethaderu 3:78f223d34f36 36 _dynamic_stack = false;
ethaderu 3:78f223d34f36 37 } else {
ethaderu 3:78f223d34f36 38 _thread_def.stack_pointer = new uint32_t[stack_size/sizeof(uint32_t)];
ethaderu 3:78f223d34f36 39 if (_thread_def.stack_pointer == NULL)
ethaderu 3:78f223d34f36 40 error("Error allocating the stack memory\n");
ethaderu 3:78f223d34f36 41 _dynamic_stack = true;
ethaderu 3:78f223d34f36 42 }
ethaderu 3:78f223d34f36 43
ethaderu 3:78f223d34f36 44 //Fill the stack with a magic word for maximum usage checking
ethaderu 3:78f223d34f36 45 for (uint32_t i = 0; i < (stack_size / sizeof(uint32_t)); i++) {
ethaderu 3:78f223d34f36 46 _thread_def.stack_pointer[i] = 0xE25A2EA5;
ethaderu 3:78f223d34f36 47 }
ethaderu 3:78f223d34f36 48 #endif
ethaderu 3:78f223d34f36 49 _tid = osThreadCreate(&_thread_def, argument);
ethaderu 3:78f223d34f36 50 }
ethaderu 3:78f223d34f36 51
ethaderu 3:78f223d34f36 52 osStatus Thread::terminate() {
ethaderu 3:78f223d34f36 53 return osThreadTerminate(_tid);
ethaderu 3:78f223d34f36 54 }
ethaderu 3:78f223d34f36 55
ethaderu 3:78f223d34f36 56 osStatus Thread::set_priority(osPriority priority) {
ethaderu 3:78f223d34f36 57 return osThreadSetPriority(_tid, priority);
ethaderu 3:78f223d34f36 58 }
ethaderu 3:78f223d34f36 59
ethaderu 3:78f223d34f36 60 osPriority Thread::get_priority() {
ethaderu 3:78f223d34f36 61 return osThreadGetPriority(_tid);
ethaderu 3:78f223d34f36 62 }
ethaderu 3:78f223d34f36 63
ethaderu 3:78f223d34f36 64 int32_t Thread::signal_set(int32_t signals) {
ethaderu 3:78f223d34f36 65 return osSignalSet(_tid, signals);
ethaderu 3:78f223d34f36 66 }
ethaderu 3:78f223d34f36 67
ethaderu 3:78f223d34f36 68 int32_t Thread::signal_clr(int32_t signals) {
ethaderu 3:78f223d34f36 69 return osSignalClear(_tid, signals);
ethaderu 3:78f223d34f36 70 }
ethaderu 3:78f223d34f36 71
ethaderu 3:78f223d34f36 72 Thread::State Thread::get_state() {
ethaderu 3:78f223d34f36 73 #ifndef __MBED_CMSIS_RTOS_CA9
ethaderu 3:78f223d34f36 74 return ((State)_thread_def.tcb.state);
ethaderu 3:78f223d34f36 75 #else
ethaderu 3:78f223d34f36 76 uint8_t status;
ethaderu 3:78f223d34f36 77 status = osThreadGetState(_tid);
ethaderu 3:78f223d34f36 78 return ((State)status);
ethaderu 3:78f223d34f36 79 #endif
ethaderu 3:78f223d34f36 80 }
ethaderu 3:78f223d34f36 81
ethaderu 3:78f223d34f36 82 uint32_t Thread::stack_size() {
ethaderu 3:78f223d34f36 83 #ifndef __MBED_CMSIS_RTOS_CA9
ethaderu 3:78f223d34f36 84 return _thread_def.tcb.priv_stack;
ethaderu 3:78f223d34f36 85 #else
ethaderu 3:78f223d34f36 86 return 0;
ethaderu 3:78f223d34f36 87 #endif
ethaderu 3:78f223d34f36 88 }
ethaderu 3:78f223d34f36 89
ethaderu 3:78f223d34f36 90 uint32_t Thread::free_stack() {
ethaderu 3:78f223d34f36 91 #ifndef __MBED_CMSIS_RTOS_CA9
ethaderu 3:78f223d34f36 92 uint32_t bottom = (uint32_t)_thread_def.tcb.stack;
ethaderu 3:78f223d34f36 93 return _thread_def.tcb.tsk_stack - bottom;
ethaderu 3:78f223d34f36 94 #else
ethaderu 3:78f223d34f36 95 return 0;
ethaderu 3:78f223d34f36 96 #endif
ethaderu 3:78f223d34f36 97 }
ethaderu 3:78f223d34f36 98
ethaderu 3:78f223d34f36 99 uint32_t Thread::used_stack() {
ethaderu 3:78f223d34f36 100 #ifndef __MBED_CMSIS_RTOS_CA9
ethaderu 3:78f223d34f36 101 uint32_t top = (uint32_t)_thread_def.tcb.stack + _thread_def.tcb.priv_stack;
ethaderu 3:78f223d34f36 102 return top - _thread_def.tcb.tsk_stack;
ethaderu 3:78f223d34f36 103 #else
ethaderu 3:78f223d34f36 104 return 0;
ethaderu 3:78f223d34f36 105 #endif
ethaderu 3:78f223d34f36 106 }
ethaderu 3:78f223d34f36 107
ethaderu 3:78f223d34f36 108 uint32_t Thread::max_stack() {
ethaderu 3:78f223d34f36 109 #ifndef __MBED_CMSIS_RTOS_CA9
ethaderu 3:78f223d34f36 110 uint32_t high_mark = 0;
ethaderu 3:78f223d34f36 111 while (_thread_def.tcb.stack[high_mark] == 0xE25A2EA5)
ethaderu 3:78f223d34f36 112 high_mark++;
ethaderu 3:78f223d34f36 113 return _thread_def.tcb.priv_stack - (high_mark * 4);
ethaderu 3:78f223d34f36 114 #else
ethaderu 3:78f223d34f36 115 return 0;
ethaderu 3:78f223d34f36 116 #endif
ethaderu 3:78f223d34f36 117 }
ethaderu 3:78f223d34f36 118
ethaderu 3:78f223d34f36 119 osEvent Thread::signal_wait(int32_t signals, uint32_t millisec) {
ethaderu 3:78f223d34f36 120 return osSignalWait(signals, millisec);
ethaderu 3:78f223d34f36 121 }
ethaderu 3:78f223d34f36 122
ethaderu 3:78f223d34f36 123 osStatus Thread::wait(uint32_t millisec) {
ethaderu 3:78f223d34f36 124 return osDelay(millisec);
ethaderu 3:78f223d34f36 125 }
ethaderu 3:78f223d34f36 126
ethaderu 3:78f223d34f36 127 osStatus Thread::yield() {
ethaderu 3:78f223d34f36 128 return osThreadYield();
ethaderu 3:78f223d34f36 129 }
ethaderu 3:78f223d34f36 130
ethaderu 3:78f223d34f36 131 osThreadId Thread::gettid() {
ethaderu 3:78f223d34f36 132 return osThreadGetId();
ethaderu 3:78f223d34f36 133 }
ethaderu 3:78f223d34f36 134
ethaderu 3:78f223d34f36 135 Thread::~Thread() {
ethaderu 3:78f223d34f36 136 terminate();
ethaderu 3:78f223d34f36 137 if (_dynamic_stack) {
ethaderu 3:78f223d34f36 138 delete[] (_thread_def.stack_pointer);
ethaderu 3:78f223d34f36 139 }
ethaderu 3:78f223d34f36 140 }
ethaderu 3:78f223d34f36 141
ethaderu 3:78f223d34f36 142 }