#include "pxt.h"

enum MotorCommand {
    //% block=coast
    Coast,
    //% block=break
    Break,
    //% block=sleep
    Sleep
};

enum Motor {
    A,
    B,
    //% block="A and B"
    AB
};

/**
* Blocks to control the onboard motors
*/
//% color=#008272 weight=30 icon="\uf1b9"
namespace motors {
    /**
    * Turns on the motor at a certain percent of power. Switches to single motor mode!
    * @param power %percent of power sent to the motor. Negative power goes backward. eg: 50
    */
    //% blockId=motor_on block="motor on at %percent"
    //% parts=dcmotor weight=90 blockGap=8
    void motorPower(int power) {
        uBit.soundmotor.motorOn(power);
    }

    /**
    * Send break, coast or sleep commands to the motor. Has no effect in dual-motor mode.
    */
    //% blockId=motor_command block="motor %command"
    //% parts=dcmotor weight=85
    void motorCommand(MotorCommand command) {
        switch(command) {
            case MotorCommand::Coast: uBit.soundmotor.motorCoast();break;
            case MotorCommand::Break: uBit.soundmotor.motorBreak();break;
            case MotorCommand::Sleep: uBit.soundmotor.motorSleep();break;
        }
    }

    /**
    * Controls two motors attached to the board. Switches to dual-motor mode!
    */
    //% blockId=block_dual_motor block="motor %motor|at %percent"
    //% weight=80
    void dualMotorPower(Motor motor, int duty_percent) {
        switch(motor) {
            case Motor::A: if (duty_percent <= 0) uBit.soundmotor.motorAOff();
            else uBit.soundmotor.motorAOn(duty_percent); break;
            case Motor::B: if (duty_percent <= 0) uBit.soundmotor.motorBOff();
            else uBit.soundmotor.motorBOn(duty_percent); break;
            case Motor::AB: if (duty_percent <= 0) {
                uBit.soundmotor.motorAOff();
                uBit.soundmotor.motorBOff();
            } else {
                uBit.soundmotor.motorAOn(duty_percent);
                uBit.soundmotor.motorBOn(duty_percent);
            }
            break;
        }
    }
}