Oddanie

STEPPER_LED_GUI.cpp

Committer:
lolkusus
Date:
2020-05-18
Revision:
0:9083554aa264

File content as of revision 0:9083554aa264:

#include "STEPPER_LED_GUI.h"

DigitalIn CALLIB_BUTTON(USER_BUTTON);

StepperLedGui::StepperLedGui()
{
    lcd.Clear(LCD_COLOR_WHITE);
    ClearLeds();
    uiLedCounter = 0;
    SetLed(0);
    DrawMotor();
}

void StepperLedGui::MotorCallib()
{
    while(ReadDetector() == OFF)
    {
        LedStep(RIGHT);
        wait(STEP_PERIOD);        
    }    
    uiZeroPosition = uiLedCounter;
}

void StepperLedGui::MotorSteps(unsigned int uiStepCount)
{
    for (unsigned int uiStepCounter = 0; uiStepCounter < uiStepCount; uiStepCounter++)
    {
        LedStep(RIGHT);
        wait(STEP_PERIOD);   
    }
}

void StepperLedGui::gotoPosition(unsigned int uiPosition)
{
    eDirection eMovementDirection;
    unsigned int uiRelativePosition;
    uiRelativePosition = uiLedCounter - uiZeroPosition;
    
    if (uiPosition > uiRelativePosition)
    {
        eMovementDirection = RIGHT;
    }
    else if (uiPosition < uiRelativePosition)
    {
        eMovementDirection = LEFT;
    }

    while(uiRelativePosition != uiPosition)
    {
        LedStep(eMovementDirection);
        uiRelativePosition = uiLedCounter - uiZeroPosition;
        wait(STEP_PERIOD);
    }
}

////////////////////////////////private///////////////

tState StepperLedGui::ReadDetector()
{
    if (CALLIB_BUTTON == 1)
        return ON;
    else
        return OFF;
}

void StepperLedGui::DrawLed(unsigned char ucLedNumber)
{
    if (ucLedNumber < LED_COUNT)
        {
            lcd.SetTextColor(LCD_COLOR_BLACK);
            lcd.DrawCircle(LED_START_X+LED_DISTANCE*ucLedNumber,LED_Y,LED_RADIUS);
            
            if (eLedStates[ucLedNumber] == ON)
                {
                    lcd.SetTextColor(LCD_COLOR_GREEN);
                }
            else
                {
                    lcd.SetTextColor(LCD_COLOR_WHITE);
                }
            
            lcd.FillCircle(LED_START_X+LED_DISTANCE*ucLedNumber,LED_Y,LED_RADIUS-LED_RIM_WIDTH);
        }
}

void StepperLedGui::SetLed(unsigned char ucLedNumber)
{
    if (ucLedNumber < LED_COUNT)
        {
            ClearLeds();
            eLedStates[ucLedNumber] = ON;
            DrawLed(ucLedNumber);
        }
}

void StepperLedGui::ClearLeds()
{
    for (unsigned char ucLedCounter = 0; ucLedCounter < LED_COUNT; ucLedCounter++)
        {
            eLedStates[ucLedCounter] = OFF;
            DrawLed(ucLedCounter);
        }
}

void StepperLedGui::LedStep(eDirection Direction)
{
    if (Direction == LEFT)
        uiLedCounter = uiLedCounter - 1;
    else if (Direction == RIGHT)
        uiLedCounter = uiLedCounter + 1;
    SetLed(uiLedCounter % LED_COUNT);
    DrawMotor();
}

void StepperLedGui::DrawMotor()
{
    double dAngle = (uiLedCounter%STEPS_PER_REV);
    dAngle = dAngle / STEPS_PER_REV;
    dAngle = dAngle * 2 * PI;
    lcd.SetTextColor(LCD_COLOR_BLUE);
    lcd.FillCircle(MOTOR_X,MOTOR_Y,MOTOR_RADIUS);
    lcd.SetTextColor(LCD_COLOR_RED);
    lcd.DrawLine(MOTOR_X,MOTOR_Y,MOTOR_X+MOTOR_RADIUS*cos(dAngle), MOTOR_Y+MOTOR_RADIUS*sin(dAngle));
    lcd.SetTextColor(LCD_COLOR_WHITE);
    lcd.FillCircle(MOTOR_X,MOTOR_Y,MOTOR_SMALL_RADIUS);
    
}