PSoCのAPI関数を関数ポインタでエレガントに

PSoCのライブラリはクラスじゃないのがつくづくイラっとするけど、関数ポインタを使ってテーブル化したりクラスもどき構造体を作る手はあるな。

テーブル化

typedef uint16 (*UART_GetByte)(void);
UART_GetByte uart_GetByte[] = {
    UART_1_GetByte,
    UART_2_GetByte,
    UART_3_GetByte,
    UART_4_GetByte,
};
for(i=0;i<4;i++){
    uint16 data = uart_GetByte[i]();
}

クラスもどき化

typedef struct 
{
    uint16 (*GetByte)(void);
    uint8 (*GetRxBufferSize)(void);
} UART;

UART uart[]={
    {
        UART_1_GetByte,
        UART_1_GetRxBufferSize
    },
    {
        UART_2_GetByte,
        UART_2_GetRxBufferSize
    },
    {
        UART_3_GetByte,
        UART_3_GetRxBufferSize
    },
    {
        UART_4_GetByte,
        UART_4_GetRxBufferSize
    },
};
for(i=0;i<4;i++){
    uint8 size = uart[i].GetRxBufferSize();
    for(j=0;j<size;j++){
        uint16 data = uart[i].GetByte();
    }
}