#include "sr_sunrise.h"


// 测试用例3：GPIO输出读写测试
static int GpioOutputTCInit(void)
{
    // 初始化3个GPIO为输出模式
    SR_GPIO_CFG_T gpioCfg={0};

    gpioCfg.gpioMode = SR_GPIO_OUTPUT;       //输出
    gpioCfg.pull = SR_GPIO_NP;               //无上下拉
    gpioCfg.initLvl = SR_GPIO_LOW;
    SR_HalGpioInit(SR_GPIO16, &gpioCfg);     //初始化

    gpioCfg.gpioMode = SR_GPIO_OUTPUT;       //输出
    gpioCfg.pull = SR_GPIO_NP;               //无上下拉
    gpioCfg.initLvl = SR_GPIO_LOW;
    SR_HalGpioInit(SR_GPIO19, &gpioCfg);     //初始化

    gpioCfg.gpioMode = SR_GPIO_OUTPUT;       //输出
    gpioCfg.pull = SR_GPIO_NP;               //无上下拉
    gpioCfg.initLvl = SR_GPIO_LOW;
    SR_HalGpioInit(SR_GPIO20, &gpioCfg);     //初始化

    return SR_OK;
}


static int GpioTCCleanup(void)
{

   return SR_OK;
}

static void GpioOutput_TC2(void)
{
    SR_PRINTF("[UTEST] GpioOutput_TC entry\r\n");
    uint8_t wlevel1=0,rLevel1=0;
    uint8_t wlevel2=0,rLevel2=0;
    uint8_t wlevel3=0,rLevel3=0;

    uint8_t oldLevel1=0,newLevel1=0;
    uint8_t oldLevel2=0,newLevel2=0;
    uint8_t oldLevel3=0,newLevel3=0;

    // 测试步骤
    // 1）分别调用GPIO读、写函数，传入有效GPIO参数，并读取返回值。
    int ret = SR_HalGpioWrite(SR_GPIO16, SR_GPIO_HIGH);
    tp_assert_integer_equal(ret, SR_OK);
    int value = SR_HalGpioRead(SR_GPIO16);
    tp_assert_integer_equal(value, SR_GPIO_HIGH);
    // 2）分别调用GPIO读、写函数，传入无效GPIO参数，并读取返回值。
    ret = SR_HalGpioWrite(999, SR_GPIO_HIGH);
    tp_assert_integer_not_equal(ret, SR_OK);
    value = SR_HalGpioRead(999);
    tp_assert_integer_not_equal(value, SR_GPIO_HIGH);

    // 3）调用GPIO写函数，将3个GPIO引脚电平设置高，然后读取电平值，外部观察示波器。
    // 注意：此步骤为外部观察。
    SR_HalGpioWrite(SR_GPIO16, SR_GPIO_HIGH);
    rLevel1 = SR_HalGpioRead(SR_GPIO16);
    tp_assert_integer_equal(rLevel1, SR_GPIO_HIGH);

    SR_HalGpioWrite(SR_GPIO19, SR_GPIO_HIGH);
    rLevel2 = SR_HalGpioRead(SR_GPIO19);
    tp_assert_integer_equal(rLevel2, SR_GPIO_HIGH);

    SR_HalGpioWrite(SR_GPIO20, SR_GPIO_HIGH);
    rLevel3 = SR_HalGpioRead(SR_GPIO20);
    tp_assert_integer_equal(rLevel3, SR_GPIO_HIGH);

    // 4）将3个GPIO引脚电平设置低，读取电平值，然后设置电平翻转，再读取新电平，判断新旧电平值是否相反。
    SR_HalGpioWrite(SR_GPIO16, SR_GPIO_LOW);
    oldLevel1 = SR_HalGpioRead(SR_GPIO16);
    SR_HalGpioWrite(SR_GPIO16, SR_GPIO_TOGGLE);
    newLevel1 = SR_HalGpioRead(SR_GPIO16);
    //判断新旧电平相反        
    tp_assert_integer_equal(oldLevel1,!newLevel1);

    SR_HalGpioWrite(SR_GPIO19, SR_GPIO_LOW);
    oldLevel2 = SR_HalGpioRead(SR_GPIO19);
    SR_HalGpioWrite(SR_GPIO19, SR_GPIO_TOGGLE);
    newLevel2 = SR_HalGpioRead(SR_GPIO19);
    //判断新旧电平相反        
    tp_assert_integer_equal(oldLevel2,!newLevel2);

    SR_HalGpioWrite(SR_GPIO20, SR_GPIO_LOW);
    oldLevel3 = SR_HalGpioRead(SR_GPIO20);
    SR_HalGpioWrite(SR_GPIO20, SR_GPIO_TOGGLE);
    newLevel3 = SR_HalGpioRead(SR_GPIO20);
    //判断新旧电平相反        
    tp_assert_integer_equal(oldLevel3,!newLevel3);


    // 5）调用GPIO去初始化函数，传入有效GPIO参数，读取返回值。
    ret = SR_HalGpioDeinit(SR_GPIO20);
    tp_assert_integer_equal(ret, SR_OK);

    // 6）调用GPIO去初始化函数，传入无效GPIO参数，读取返回值。
    ret = SR_HalGpioDeinit(0xFFFFFFFF);
    tp_assert_integer_not_equal(ret, SR_OK);

    // 7）调用GPIO去初始化函数，重复步骤3）。
    // 注意：此步骤为外部观察。
    SR_HalGpioWrite(SR_GPIO20, SR_GPIO_HIGH);
    rLevel3 = SR_HalGpioRead(SR_GPIO20);
    tp_assert_integer_not_equal(rLevel3, SR_GPIO_HIGH);


}

// 通过宏定义导出测试用例
UTEST_TC_EXPORT(GpioOutput_TC2, GpioOutput_TC2, GpioOutputTCInit, GpioTCCleanup, TC_PRIORITY_LOW);




static int GpioDeinit(int argc, char *argv[])
{

    int gpioId =0,ret=0;
	
    gpioId = atoi(argv[1]);

    SR_LOG(INFO,"gpioId = %d",gpioId);
    ret = SR_HalGpioDeinit(gpioId);

	SR_LOG(INFO,"ret = %d",ret);

	return 0;

}
SR_SHELL_CMD_EXPORT(myGpioDeinit, GpioDeinit);

static int GpioRead(int argc, char *argv[])
{

    int gpioId =0,ret=0;
	
    gpioId = atoi(argv[1]);

	SR_LOG(INFO,"gpioId = %d",gpioId);

    ret = SR_HalGpioRead(gpioId);

	SR_LOG(INFO,"ret = %d",ret);

	return 0;

}
SR_SHELL_CMD_EXPORT(myGpioRd, GpioRead);



