The final project of Embedde class.
Dependencies: C12832 LM75B ESP-call MMA7660
TIMER.cpp
00001 #include "TIMER.h" 00002 00003 Timer timer; 00004 Thread threadTimer; 00005 Thread threadCalculateTime; 00006 Semaphore semaphoreTimer(0, 1); 00007 Semaphore semaphoreModify(0, 1); 00008 Semaphore semaphoreModifyThread(0, 1); 00009 00010 static int realTime = 0; 00011 static int additionalTime = 0; 00012 static int zeroBaseTime = 0; 00013 static int displayTime = 0; 00014 00015 int timerHour = 0; 00016 int timerMinute = 0; 00017 int timerSecond = 0; 00018 00019 int MODE_MODIFY_TIME = ABLE_TO_MODIFY_TIME; 00020 00021 static void _increaseHour(void) 00022 { 00023 semaphoreTimer.acquire(); 00024 additionalTime += 3600; 00025 semaphoreTimer.release(); 00026 } 00027 00028 static void _decreaseHour(void) 00029 { 00030 semaphoreTimer.acquire(); 00031 if(additionalTime >= 3600) { 00032 additionalTime -= 3600; 00033 } else { 00034 additionalTime += 82800; 00035 } 00036 semaphoreTimer.release(); 00037 } 00038 00039 static void _decreaseMinute(void) 00040 { 00041 semaphoreTimer.acquire(); 00042 if(additionalTime >= 60) { 00043 additionalTime -= 60; 00044 } else { 00045 additionalTime += 3540; 00046 } 00047 semaphoreTimer.release(); 00048 } 00049 static void _increaseMinute(void) 00050 { 00051 semaphoreTimer.acquire(); 00052 additionalTime += 60; 00053 semaphoreTimer.release(); 00054 } 00055 00056 static void _clearTime(void) 00057 { 00058 semaphoreTimer.acquire(); 00059 zeroBaseTime = realTime % 60; 00060 semaphoreTimer.release(); 00061 00062 } 00063 static void _threadCalculateTime(void) 00064 { 00065 while(1) { 00066 semaphoreModifyThread.acquire(); 00067 switch(joystickDir()) { 00068 case JOYSTICK_U: 00069 _increaseHour(); 00070 break; 00071 00072 case JOYSTICK_D: 00073 _decreaseHour(); 00074 break; 00075 00076 case JOYSTICK_L: 00077 _decreaseMinute(); 00078 break; 00079 00080 case JOYSTICK_R: 00081 _increaseMinute(); 00082 break; 00083 00084 case JOYSTICK_C: 00085 _clearTime(); 00086 break; 00087 } 00088 00089 semaphoreModifyThread.release(); 00090 while(joystickDir() != -1); 00091 thread_sleep_for(JOYSTICK_CLICK_DELAY); 00092 00093 } 00094 } 00095 00096 00097 static void _threadTimer(void) 00098 { 00099 while(1) { 00100 semaphoreTimer.acquire(); 00101 realTime = timer.read() + additionalTime; 00102 displayTime = realTime - zeroBaseTime; 00103 00104 timerHour = (displayTime / 3600) % 24; 00105 timerMinute = (displayTime % 3600) / 60; 00106 timerSecond = (displayTime) % 60; 00107 00108 semaphoreTimer.release(); 00109 } 00110 } 00111 00112 // ============================================================================= 00113 00114 void timerTerminateTimeModify(void) 00115 { 00116 semaphoreModifyThread.acquire(); 00117 } 00118 00119 void timerStartTimeModify(void) 00120 { 00121 semaphoreModifyThread.release(); 00122 } 00123 00124 00125 void timerInit(void) 00126 { 00127 timerHour = 0; 00128 timerMinute = 0; 00129 timerSecond = 0; 00130 00131 timer.start(); 00132 threadTimer.start(_threadTimer); 00133 MODE_MODIFY_TIME = ABLE_TO_MODIFY_TIME; 00134 threadCalculateTime.start(_threadCalculateTime); 00135 semaphoreTimer.release(); 00136 semaphoreModify.release(); 00137 semaphoreModifyThread.release(); 00138 }
Generated on Fri Jul 15 2022 05:56:23 by 1.7.2