Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

ap1017ctrl.cpp

Committer:
tkstreet
Date:
2017-04-19
Revision:
32:42c6b8fb1922
Parent:
31:8635be9b2e35
Child:
33:d3e1e9eb2ef9

File content as of revision 32:42c6b8fb1922:

#include "ap1017ctrl.h"
#include "debug.h"

Ap1017Ctrl::Ap1017Ctrl()
{
    ap1017 = NULL;
    event = false;
    ticker = NULL;
    sensorName = "";
    interval = 0;
}

Ap1017Ctrl::~Ap1017Ctrl()
{
    if(ap1017)
        delete ap1017;
}

AkmSensor::Status Ap1017Ctrl::init(const uint8_t id, const uint8_t subid)
{
    primaryId = id;
    subId = subid;
    interval = 1;                   // Set timer interrupt interval to 1s

    switch (subId) {                // template for multiple drivers
        case SUB_ID_AP1017:
            ap1017 = new AP1017();  // Instantiate AP1017
            sensorName = "AP1017";
            break;
        default:
            return AkmSensor::ERROR;
    }
    
    // Default settings
    ap1017->setDirection(AP1017::DIRECTION_CW);
    ap1017->setSpeed(50.0);                         

    return AkmSensor::SUCCESS;
}

bool Ap1017Ctrl::isEvent()
{
    return event;       // No feedback: always false
}

AkmSensor::Status Ap1017Ctrl::startSensor()
{
    ticker.attach(callback(this, &Ap1017Ctrl::timerCallback), interval);
    return AkmSensor::SUCCESS;
}

AkmSensor::Status Ap1017Ctrl::startSensor(const float sec)
{
    // Initialize timer interrupt
    interval = sec;
    ticker.attach(callback(this, &Ap1017Ctrl::timerCallback), interval);
    
    ap1017->start();        // Start motor
    
    return AkmSensor::SUCCESS;
}

AkmSensor::Status Ap1017Ctrl::stopSensor()
{
    ap1017->stop();         // Stop motor
    
    return AkmSensor::SUCCESS;
}

AkmSensor::Status Ap1017Ctrl::readSensorData(Message* msg)
{
    // No sensors to read data from
    return AkmSensor::SUCCESS;    
}

AkmSensor::Status Ap1017Ctrl::requestCommand(Message* in, Message* out)
{
    AkmSensor::Status status = AkmSensor::SUCCESS;
    
    Message::Command cmd = in->getCommand();        // Store command
    out->setCommand(cmd);                           // Load command into output
    
    switch(cmd)
    {
        case Message::CMD_MOTOR_START_MOTOR:
        {
            if(ap1017->start() != AP1017::SUCCESS)
            {
                MSG("#AP1017: Failed to start motor.\r\n");
                return AkmSensor::ERROR;
            }
            break;
        }
        case Message::CMD_MOTOR_STOP_MOTOR:
        {
            if(ap1017->stop() != AP1017::SUCCESS)
            {
                MSG("#AP1017: Failed to stop motor.\r\n");
            }
            break;
        }
        case Message::CMD_MOTOR_SET_DIRECTION:
        {
            if(ap1017->setDirection((AP1017::Rotation)(in->getArgument(0))) != AP1017::SUCCESS)
            {
                MSG("#AP1017: Failed to set motor direction.\r\n");
            }
            break;
        }
        case Message::CMD_MOTOR_SET_DUTY_CYCLE:
        {
            if(ap1017->setSpeed((AP1017::Rotation)(in->getArgument(0))) != AP1017::SUCCESS)
            {
                MSG("#AP1017: Failed to set the duty cycle.\r\n");
            }
            break;
        }
        default:
        {
            MSG("AP1017: Invalid or unimplemented command.\r\n");
            status = AkmSensor::ERROR;
        }
    }
        
    return status;
}

char* Ap1017Ctrl::getSensorName()
{
    return sensorName;
}

void Ap1017Ctrl::timerCallback()
{
    ap1017->setDirection(ap1017->getDirection());
    ap1017->setSpeed(ap1017->getSpeed());
}