#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; float 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: float GetSpeed() { return curSpeed; } void SetSpeed(float newSpeed) { curSpeed = newSpeed; *pwmSpeed = abs(newSpeed / SPEED_PER_PWM); UpdateDirection(); } bool GetEnabled() { return enabled; } void SetEnabled(bool newStatus) { enabled = newStatus; UpdateDirection(); } }; #endif