The final project of Embedde class.

Dependencies:   C12832 LM75B ESP-call MMA7660

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers TIMER.cpp Source File

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 }