The final project of Embedde class.

Dependencies:   C12832 LM75B ESP-call MMA7660

TIMER/TIMER.cpp

Committer:
pkr7098
Date:
2021-06-03
Revision:
2:37756b51ccdb
Parent:
1:ed1c6618f739

File content as of revision 2:37756b51ccdb:

#include "TIMER.h"

Timer timer;
Thread threadTimer;
Thread threadCalculateTime;
Semaphore semaphoreTimer(0, 1);
Semaphore semaphoreModify(0, 1);
Semaphore semaphoreModifyThread(0, 1);

static int realTime = 0;
static int additionalTime = 0;
static int zeroBaseTime = 0;
static int displayTime = 0;

int timerHour = 0;
int timerMinute = 0;
int timerSecond = 0;

int MODE_MODIFY_TIME = ABLE_TO_MODIFY_TIME;

static void _increaseHour(void)
{
    semaphoreTimer.acquire();
    additionalTime += 3600;
    semaphoreTimer.release();
}

static void _decreaseHour(void)
{
    semaphoreTimer.acquire();
    if(additionalTime >= 3600) {
        additionalTime -= 3600;
    } else {
        additionalTime += 82800;
    }
    semaphoreTimer.release();
}

static void _decreaseMinute(void)
{
    semaphoreTimer.acquire();
    if(additionalTime >= 60) {
        additionalTime -= 60;
    } else {
        additionalTime += 3540;
    }
    semaphoreTimer.release();
}
static void _increaseMinute(void)
{
    semaphoreTimer.acquire();
    additionalTime += 60;
    semaphoreTimer.release();
}

static void _clearTime(void)
{
    semaphoreTimer.acquire();
    zeroBaseTime = realTime % 60;
    semaphoreTimer.release();

}
static void _threadCalculateTime(void)
{
    while(1) {
        semaphoreModifyThread.acquire();
        switch(joystickDir()) {
            case JOYSTICK_U:
                _increaseHour();
                break;

            case JOYSTICK_D:
                _decreaseHour();
                break;

            case JOYSTICK_L:
                _decreaseMinute();
                break;

            case JOYSTICK_R:
                _increaseMinute();
                break;

            case JOYSTICK_C:
                _clearTime();
                break;
        }

        semaphoreModifyThread.release();
        while(joystickDir() != -1);
        thread_sleep_for(JOYSTICK_CLICK_DELAY);

    }
}


static void _threadTimer(void)
{
    while(1) {
        semaphoreTimer.acquire();
        realTime = timer.read() + additionalTime;
        displayTime = realTime - zeroBaseTime;

        timerHour = (displayTime / 3600) % 24;
        timerMinute = (displayTime % 3600) / 60;
        timerSecond = (displayTime) % 60;

        semaphoreTimer.release();
    }
}

// =============================================================================

void timerTerminateTimeModify(void)
{
    semaphoreModifyThread.acquire();
}

void timerStartTimeModify(void)
{
    semaphoreModifyThread.release();
}


void timerInit(void)
{
    timerHour = 0;
    timerMinute = 0;
    timerSecond = 0;

    timer.start();
    threadTimer.start(_threadTimer);
    MODE_MODIFY_TIME = ABLE_TO_MODIFY_TIME;
    threadCalculateTime.start(_threadCalculateTime);
    semaphoreTimer.release();
    semaphoreModify.release();
    semaphoreModifyThread.release();
}