#include <stdio.h>
#include "ohos_init.h"
#include "iot_gpio.h"
#include "iot_gpio_ex.h"

#include "iot_i2c.h"

#include "cmsis_os2.h"


// #include "ohos_init.h"
// #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
// #include <cmsis_os2.h>
#include <stdbool.h>


#define IIC_SDA  0
#define IIC_SCL  1 
#define ADDR 0x27  // 0100111
#define IIC_IDX 1

/*
Command Register
0 Input port 0
1 Input port 1
2 Output port 0
3 Output port 1
4 Polarity Inversion port 0
5 Polarity Inversion port 1
6 Configuration port 0
7 Configuration port 1
*/
#define CMD_CFG0 6
#define CMD_CFG1 7
#define CMD_OUT0 2
#define CMD_OUT1 3


uint32_t exec1, exec2, exec3;

/***** 定时器1 回调函数 *****/
void Timer1_Callback(void *arg)
{
    (void)arg;
    //printf("This is Timer1_Callback!\r\n");
}

/***** 定时器2 回调函数 *****/
void Timer2_Callback(void *arg)
{
    (void)arg;
    //printf("This is Timer2_Callback!\r\n");
}

/***** 定时器3 回调函数 *****/
void Timer3_Callback(void *arg)
{
    (void)arg;
    //printf("This is Timer3_Callback!\r\n");
}



int write_iic(uint8_t* data){
    int ret = IoTI2cWrite(IIC_IDX, (ADDR << 1) | 0x00, data, 3);
    //printf("***@@@###$$$ ret = %d\n",ret);

    return ret;
}

//start 
uint8_t CFG0[] = {CMD_CFG0,0x0,0x0}; //配置为输出
uint8_t CFG1[] = {CMD_CFG1,0x0,0x0}; //配置为输出
uint8_t OUT0[] = {CMD_OUT0,0x00,0x00}; // 输出
uint8_t OUT1[] = {CMD_OUT1,0x00,0x00}; // 输出

char alpha[8][9] = {
    "11111111",
    "11100000",
    "11100000",
    "11111111",
    "11111111",
    "11100000",
    "11100000",
    "11111111"
};

// char alpha[8][9] = {
//     "00011111",
//     "11100000",
//     "11100000",
//     "00011111",
//     "00011111",
//     "11100000",
//     "11100000",
//     "00011111"
// };


void write_data(char byte1,char byte2){
    //printf("write %02x ,%02x\n",byte1,byte2);

    uint8_t data[3] = {CMD_OUT0,0x00,0x00};
    data[1] = byte1;
    data[2] = byte2;
    write_iic(data);

    data[0] = CMD_OUT1;
    write_iic(data);

    //printf("write %02x ,%02x\n",byte1,byte2);
    // printf("data[3] = %c\n",data[3]);
    // printf("data[2] = %c\n",data[2]);
    // printf("data[1] = %c\n",data[1]);
    // printf("data[0] = %c\n",data[0]);


}
void iic(void* args ){
    int i,j;


    osTimerId_t id1, id2, id3;
    uint32_t timerDelay;
    osStatus_t status;

    // exec1 = 1U;
    // id1 = osTimerNew(Timer1_Callback, osTimerPeriodic, &exec1, NULL);
    // if (id1 != NULL)
    // {

    //     printf(" id1 != NULL\r\n");
    //     // Hi3861 1U=10ms,100U=1S
    //     timerDelay = 100U;
    //     printf(" start status1\r\n ");
    //     status = osTimerStart(id1, timerDelay);
    //     printf(" ******end status1\r\n ");
    //     if (status != osOK)
    //     {
    //         // Timer could not be started
    //         printf(" Timer could not be started\r\n ");
    //     }else{
    //         printf(" Timer could be started\r\n ");    //have
    //     }
    //     printf(" end status1\r\n ");    //have
    // }else{
    //     printf(" id1 = NULL\r\n ");
    // }

    // exec2 = 1U;
    // id2 = osTimerNew(Timer2_Callback, osTimerPeriodic, &exec2, NULL);
    // if (id2 != NULL)
    // {

    //     printf(" id2 != NULL\r\n ");
    //     // Hi3861 1U=10ms,300U=3S
    //     timerDelay = 300U;

    //     printf(" start status2\r\n ");
    //     status = osTimerStart(id2, timerDelay);
    //     printf(" *******end status2\r\n ");
    //     if (status != osOK)
    //     {
    //         // Timer could not be started
    //         printf(" Timer could not be started \r\n");
    //     }else{
    //         printf(" Timer could be started\r\n ");
    //     }
    //     printf(" end status2\r\n ");
    // }else{
    //     printf(" id2 = NULL\r\n ");
    // }



    printf("iic thread running...");
    IoTGpioInit(IIC_SDA);
    IoTGpioInit(IIC_SCL);
    IoTGpioSetFunc(IIC_SDA, IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);
    IoTGpioSetFunc(IIC_SCL, IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);
    IoTI2cInit(IIC_IDX, 400000);     
    
    write_iic(CFG0);
    write_iic(CFG1);
    
    //usleep(20);
    //usleep(200*1000);

    exec1 = 1U;
    id1 = osTimerNew(Timer1_Callback, osTimerPeriodic, &exec1, NULL);
    if (id1 != NULL)
    {

        printf(" id1 != NULL\r\n");
        // Hi3861 1U=10ms,100U=1S
        timerDelay = 100U;
        printf(" start status1\r\n ");
        status = osTimerStart(id1, timerDelay);
        printf(" ******end status1\r\n ");
        if (status != osOK)
        {
            // Timer could not be started
            printf(" Timer could not be started\r\n ");
        }else{
            printf(" Timer could be started\r\n ");    //have
        }
        printf(" end status1\r\n ");    //have
    }else{
        printf(" id1 = NULL\r\n ");
    }
    
    write_iic(OUT0);
    write_iic(OUT1);
    //usleep(1000*1000);
    //usleep(100);


    exec2 = 1U;
    id2 = osTimerNew(Timer2_Callback, osTimerPeriodic, &exec2, NULL);
    if (id2 != NULL)
    {

        printf(" id2 != NULL\r\n ");
        // Hi3861 1U=10ms,300U=3S
        timerDelay = 300U;

        printf(" start status2\r\n ");
        status = osTimerStart(id2, timerDelay);
        printf(" *******end status2\r\n ");
        if (status != osOK)
        {
            // Timer could not be started
            printf(" Timer could not be started \r\n");
        }else{
            printf(" Timer could be started\r\n ");
        }
        printf(" end status2\r\n ");
    }else{
        printf(" id2 = NULL\r\n ");
    }


    while(1){
        
        for(int i=0;i<8;i++){
            unsigned char hex = 0;
            for(int j=0;j<8;j++){
                hex = hex <<1;
                if(alpha[i][j] == '1'){
                     hex =  hex  | 0x1;
                }
            }
            OUT1[2] = hex;
            OUT0[1] = ~(1 << i);
            write_data(~(1 << i),hex);

            
            //usleep(100);    //延时,肉眼无法观察的速度
            //alpha[i][j] = 0xff;     //消隐,防止给下次扫描带来影响
            //alpha[i][j] == '0';
            // char alpha[8][9] = {
            //     "00000000",
            //     "00000000",
            //     "00000000",
            //     "00000000",
            //     "00000000",
            //     "00000000",
            //     "00000000",
            //     "00000000"
            // };      
            //hex = 0;     //消隐,防止给下次扫描带来影响
            //usleep(100);

            // printf("OUT1[2] = %c\n",OUT1[2]);
            // printf("OUT1[1] = %c\n",OUT1[1]);
        }


        //usleep(10000);    //延时,肉眼无法观察的速度

    exec3 = 1U;
    id3 = osTimerNew(Timer3_Callback, osTimerPeriodic, &exec3, NULL);
    if (id3 != NULL)
    {

        printf(" id3 != NULL\r\n ");
        // Hi3861 1U=10ms,300U=3S
        timerDelay = 300U;

        printf(" start status3\r\n ");
        status = osTimerStart(id3, timerDelay);
        printf(" *******end status3\r\n ");
        if (status != osOK)
        {
            // Timer could not be started
            printf(" Timer could not be started \r\n");
        }else{
            printf(" Timer could be started\r\n ");
        }
        printf(" end status3\r\n ");
    }
    // else
    // {
    //     printf(" id3 = NULL\r\n ");
    // }



        // //alpha[i][j] = 0xff;     //消隐,防止给下次扫描带来影响
        //osDelay(100);
        alpha[i][j] = '0';

    }

}

void iic_entry(){
    printf("iic_entry called \n");

    osThreadAttr_t attr;

    attr.name = "thread_iic";
    attr.attr_bits = 0U; // 如果为1 ,则可以使用osThreadJoin函数
    attr.cb_mem = NULL; //控制快的指针
    attr.cb_size = 0U;
    attr.stack_mem = NULL; //栈内存指针
    attr.stack_size = 1024 * 4; //栈大小
    attr.priority = 25; //优先级

    if (osThreadNew((osThreadFunc_t)iic, NULL, &attr) == NULL)
    {
        printf("Fail to create thread!\n");
    }
}

APP_FEATURE_INIT(iic_entry);




// #include <stdio.h>
// #include <string.h>
// #include <unistd.h>

// #include "ohos_init.h"
// #include "cmsis_os2.h"

// uint32_t exec1, exec2;

// /***** 定时器1 回调函数 *****/
// void Timer1_Callback(void *arg)
// {
//     (void)arg;
//     printf("This is BearPi Harmony Timer1_Callback!\r\n");
// }

// /***** 定时器2 回调函数 *****/
// void Timer2_Callback(void *arg)
// {
//     (void)arg;
//     printf("This is BearPi Harmony Timer2_Callback!\r\n");
// }

// /***** 定时器创建 *****/
// static void Timer_example(void)
// {
//     osTimerId_t id1, id2;
//     uint32_t timerDelay;
//     osStatus_t status;

//     exec1 = 1U;
//     id1 = osTimerNew(Timer1_Callback, osTimerPeriodic, &exec1, NULL);
//     if (id1 != NULL)
//     {

//         printf(" id1 != NULL\r\n");
//         // Hi3861 1U=10ms,100U=1S
//         timerDelay = 100U;
//         printf(" start status1\r\n ");
//         status = osTimerStart(id1, timerDelay);
//         printf(" ******end status1\r\n ");
//         if (status != osOK)
//         {
//             // Timer could not be started
//             printf(" Timer could not be started\r\n ");
//         }else{
//             printf(" Timer could be started\r\n ");    //have
//         }
//         printf(" end status1\r\n ");    //have
//     }else{
//         printf(" id1 = NULL\r\n ");
//     }

//     exec2 = 1U;
//     id2 = osTimerNew(Timer2_Callback, osTimerPeriodic, &exec2, NULL);
//     if (id2 != NULL)
//     {

//         printf(" id2 != NULL\r\n ");
//         // Hi3861 1U=10ms,300U=3S
//         timerDelay = 300U;

//         printf(" start status2\r\n ");
//         status = osTimerStart(id2, timerDelay);
//         printf(" *******end status2\r\n ");
//         if (status != osOK)
//         {
//             // Timer could not be started
//             printf(" Timer could not be started \r\n");
//         }else{
//             printf(" Timer could be started\r\n ");
//         }
//         printf(" end status2\r\n ");
//     }else{
//         printf(" id2 = NULL\r\n ");
//     }
// }

// APP_FEATURE_INIT(Timer_example);


//原文链接:https://blog.csdn.net/qq_36347513/article/details/117650058