#ifndef _ENGINE_H #define _ENGINE_H #include "../../stdafx.h" class Engine : public IO_Module { public: Engine() { this->enabled = false; this->curSpeed = 0; this->parent = NULL; this->moduleId = 0; this->hardwarePort = NULL; this->pwmSpeed = NULL; this->pinForward = 0; this->pinReverse = 0; } Engine(uint32 engineId) { this->enabled = false; this->curSpeed = 0; this->parent = NULL; this->moduleId = engineId; switch(engineId) { case IO_ENGINE_DRIVE_LEFT: this->hardwarePort = &PORTB; this->pwmSpeed = &OCR1A; this->pinForward = (1 << 0); this->pinReverse = (1 << 1); break; case IO_ENGINE_DRIVE_BACK: this->hardwarePort = &PORTB; this->pwmSpeed = &OCR1B; this->pinForward = (1 << 2); this->pinReverse = (1 << 3); break; case IO_ENGINE_DRIVE_RIGHT: this->hardwarePort = &PORTD; this->pwmSpeed = &OCR3A; this->pinForward = (1 << 5); this->pinReverse = (1 << 4); break; default: this->hardwarePort = NULL; this->pwmSpeed = NULL; this->pinForward = 0; this->pinReverse = 0; break; } *this->pwmSpeed = 0; } protected: bool enabled; int curSpeed; //Hardware volatile uint8* hardwarePort; volatile uint16* pwmSpeed; uint8 pinForward; uint8 pinReverse; void UpdateDirection() { if(enabled) { if(curSpeed > 0) { *hardwarePort |= pinForward; *hardwarePort &= ~pinReverse; } else if(curSpeed < 0) { *hardwarePort |= pinReverse; *hardwarePort &= ~pinForward; } else { *hardwarePort |= pinForward; *hardwarePort |= pinReverse; } } else { *hardwarePort &= ~pinForward; *hardwarePort &= ~pinReverse; } } public: int GetSpeed() { return curSpeed; } void SetSpeed(int newSpeed) { curSpeed = newSpeed; int pwm = abs(newSpeed); if(pwm > 255) pwm = 255; *pwmSpeed = pwm; UpdateDirection(); } bool GetEnabled() { return enabled; } void SetEnabled(bool newStatus) { enabled = newStatus; UpdateDirection(); } }; #endif