#include "test_env.h"

/* Timer/Match Register    Pinout Options

CT16B0/MR0  p5 (P0_9)
CT16B0/MR1  p6 (P0_8)
CT16B0/MR2  p34 (P1_15)

CT16B1/MR0  p36 (P0_21)
CT16B1/MR1  p20 (P0_22) and p14 (P1_23)

CT32B0/MR0  p25 (P1_24)
CT32B0/MR1  p26 (P1_25) and USBTX (P0_19)
CT32B0/MR2  p10 (P1_26)
 */

float value = 0.75;

int main() {
#if defined(TARGET_FF_ARDUINO)
    PwmOut pwm(D9);
    int period_ms = 10;

    pwm.period_ms(period_ms);
    pwm.write(value);

    float result = floor(pwm.read() * 100 + 0.5) / 100; // round it to 0.xx
    printf("PWM period = %dms with duty cycle: %d%%\n", period_ms, (int) (result * 100));

    notify_completion(result == value ? true : false);
#elif defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC11U24) || defined(TARGET_LPC4088) || defined(TARGET_LPC2460)
    PwmOut pwm_p25(p25);
    PwmOut pwm_p26(p26);

    pwm_p25.write(0.75);
    pwm_p26.write(0.50);

    printf("Initialize PWM on pin 25 with duty cycle: %.2f\n", pwm_p25.read());
    printf("Initialize PWM on pin 26 with duty cycle: %.2f\n", pwm_p26.read());

#elif defined(TARGET_LPC1114)
    PwmOut pwm_dp24(dp24); // P0_1
    PwmOut pwm_dp18(dp18); // P1_9

    pwm_dp24.write(0.75);
    pwm_dp18.write(0.50);

    printf("Initialize PWM on pin 24 with duty cycle: %.2f\n", pwm_dp24.read());
    printf("Initialize PWM on pin 18 with duty cycle: %.2f\n", pwm_dp18.read());

#elif defined(TARGET_LPC1347)
    PwmOut pwm_1(P0_18);
    PwmOut pwm_2(P0_9);

    pwm_1.write(0.75);
    pwm_2.write(0.50);

    printf("Initialize PWM on P0_18 with duty cycle: %.2f\n", pwm_1.read());
    printf("Initialize PWM on P0_9 with duty cycle: %.2f\n", pwm_2.read());

#elif defined(TARGET_NRF51822)
    PwmOut pwm_p24(p24);
    PwmOut pwm_p25(p25);

    pwm_p24.write(0.75);
    pwm_p25.write(0.50);

    printf("Initialize PWM on pin 24 with duty cycle: %.2f\n", pwm_p24.read());
    printf("Initialize PWM on pin 25 with duty cycle: %.2f\n", pwm_p25.read());

#elif defined(TARGET_DISCO_F100RB)
    PwmOut pwm_1(PB_3);
    PwmOut pwm_2(PB_4);

    pwm_1.write(0.75);
    pwm_2.write(0.50);

    printf("Initialize PWM on pin PB_3 with duty cycle: %.2f\n", pwm_1.read());
    printf("Initialize PWM on pin PB_4 with duty cycle: %.2f\n", pwm_2.read());
#elif defined(TARGET_DISCO_F051R8)
    PwmOut pwm_1(PA_7);
    PwmOut pwm_2(PC_7);

    pwm_1.write(0.75);
    pwm_2.write(0.50);

    printf("Initialize PWM on pin PA_7 with duty cycle: %.2f\n", pwm_1.read());
    printf("Initialize PWM on pin PC_7 with duty cycle: %.2f\n", pwm_2.read());
#elif defined(TARGET_DISCO_F303VC)
    PwmOut pwm_1(PA_8);
    PwmOut pwm_2(PA_9);

    pwm_1.write(0.75);
    pwm_2.write(0.50);

    printf("Initialize PWM on pin PA_7 with duty cycle: %.2f\n", pwm_1.read());
    printf("Initialize PWM on pin PC_7 with duty cycle: %.2f\n", pwm_2.read());
#elif defined(TARGET_MAXWSNENV)
    PwmOut pwm_1(TP2);
    PwmOut pwm_2(TP4);

    pwm_1.write(0.75);
    pwm_2.write(0.50);

    printf("Initialize PWM on pin TP2 with duty cycle: %.2f\n", pwm_1.read());
    printf("Initialize PWM on pin TP4 with duty cycle: %.2f\n", pwm_2.read());
#elif defined(TARGET_DISCO_F407VG)
    PwmOut pwm_1(PD_12);
    PwmOut pwm_2(PD_13);

    pwm_1.write(value);
    pwm_2.write(0.50);

    float result = floor(pwm_1.read() * 100 + 0.5) / 100; // round it to 0.xx

    printf("Initialize PWM on pin PD_12 with duty cycle: %.2f\n", result);
    printf("Initialize PWM on pin PD_13 with duty cycle: %.2f\n", pwm_2.read());

    notify_completion(result == value ? true : false);
#elif defined(TARGET_DISCO_F429ZI) || defined(TARGET_NUCLEO_F429ZI)
    PwmOut pwm_1(PA_0);

    pwm_1.write(value);

    float result = floor(pwm_1.read() * 100 + 0.5) / 100; // round it to 0.xx

    printf("Initialize PWM on pin PD_12 with duty cycle: %.2f\n", result);

    notify_completion(result == value ? true : false);
#elif defined(TARGET_MTS_MDOT_F405RG)
    PwmOut pwm_1(PA_0);

    pwm_1.write(value);

    float result = floor(pwm_1.read() * 100 + 0.5) / 100; // round it to 0.xx

    printf("Initialize PWM on pin PD_12 with duty cycle: %.2f\n", result);

    notify_completion(result == value ? true : false);
#elif defined(TARGET_MTS_DRAGONFLY_F411RE)
    PwmOut pwm_1(PA_0);

    pwm_1.write(value);

    float result = floor(pwm_1.read() * 100 + 0.5) / 100; // round it to 0.xx

    printf("Initialize PWM on pin PD_12 with duty cycle: %.2f\n", result);

    notify_completion(result == value ? true : false);
#elif defined(TARGET_MTS_MDOT_F411RE)
    PwmOut pwm_1(PA_0);

    pwm_1.write(value);

    float result = floor(pwm_1.read() * 100 + 0.5) / 100; // round it to 0.xx

    printf("Initialize PWM on pin PD_12 with duty cycle: %.2f\n", result);

    notify_completion(result == value ? true : false);
#elif defined(TARGET_UBLOX_EVK_ODIN_W2)
    PwmOut pwm_1(PA_0);

    pwm_1.write(value);

    float result = floor(pwm_1.read() * 100 + 0.5) / 100; // round it to 0.xx

    printf("Initialize PWM on pin PD_12 with duty cycle: %.2f\n", result);

    notify_completion(result == value ? true : false);
#elif defined(TARGET_MAX32600MBED)
    PwmOut pwm_1(P1_2);
    PwmOut pwm_2(P1_3);

    pwm_1.write(0.75);
    pwm_2.write(0.50);

    printf("Initialize PWM on pin P1.2 with duty cycle: %.2f\n", pwm_1.read());
    printf("Initialize PWM on pin P1.3 with duty cycle: %.2f\n", pwm_2.read());
#elif defined(TARGET_SAMR21G18A) || defined(TARGET_SAMD21J18A) || defined(TARGET_SAMD21G18A) || defined(TARGET_SAML21J18A)
    PwmOut pwm(LED1);

    pwm.period_ms(1000);
    pwm.write(value);

    float result = floor(pwm.read() * 100 + 0.5) / 100; // round it to 0.xx
    printf("Initialize PWM on pin LED1 with duty cycle: %.2f\n", result);

    notify_completion(result == value ? true : false);
#elif defined(TARGET_SAMG55J19)
    PwmOut pwm(PA00);  /*LED Doesnt support PWM for G55 XPro*/

    pwm.period_ms(1000);
    pwm.write(value);

    float result = floor(pwm.read() * 100 + 0.5) / 100; // round it to 0.xx
    printf("Initialize PWM on pin PA01 with duty cycle: %.2f\n", result);

    notify_completion(result == value ? true : false);
#else
#error [NOT_SUPPORTED] This test is not supported on this target.
#endif

    notify_completion(true);
}
