#ifndef _TM1637_H
#define _TM1637_H   1

#include "stdint.h"
#include "pico/stdlib.h"
#include "hardware/pio.h"

#define MINUS_SEG   0b01000000  // Minus
#define DOT_SEG     0b10000000  // DOT
#define STOP_COND   0x100       // ストップコンディションにする

#define TM1637_MAX_COL      6           // TM1637の最大カラム数は6
#define TM1637_MAX_CONTRAST 0b111       

#define TM1637_AUTOINC      0b01000000  // Data set Auto Increment
#define TM1637_DATASET      0b01000100  // Data set
#define TM1637_ADDRSET      0b11000000  // ADDR SET
#define TM1637_DISPOFF      0b10000000  // Display Off
#define TM1637_DISPON       0b10001000  // Display On

#define TM1637_ERR_INVALID_PARAM    -1
#define TM1637_ERR_NACK             -2

typedef struct TM1637st {
    PIO     pio;        // PIOインスタンス
    uint    sm;        // ステートマシン番号
    uint    offset;    // オフセットアドレス

    uint8_t contrast;   // コントラスト値
    uint8_t colmns;     // このユニットのカラム数

    bool    initialized;    // 初期化完了フラグ

    struct TM1637st *next;  // 次の構造体へのポインタ
} TM1637_t;

/*
TM1637_t *TM1637_init(uint8_t sda_base_pin, int col, uint8_t cont);
TM1637を初期化しハンドルを返す
パラメータ:
uint8_t sda_base_pin: TM1637のSDAが接続されているGPIO。SDAの次のGPIOにSCLKを接続すること
uint8_t col: 接続しているTM1637モジュールのカラム数
uint8_t cont: コントラスト値（0～7）
戻り値:
TM1637_tのポインタ。NULLは初期化失敗
*/
TM1637_t *TM1637_init(uint8_t sda_base_pin, uint8_t col, uint8_t cont);
/*
int TM1637_set_contrast(TM1637_t *p, uint8_t cont);
パラメータ:
TM1637_t *p: TM1637_tのポインタ
uint8_t cont: コントラスト値
戻り値:
0なら成功、負の値なら失敗
*/
int TM1637_set_contrast(TM1637_t *p, uint8_t cont);
/*
int TM1637_putchar(TM1637_t *p, char c, bool dot, uint8_t col);
1文字出力
パラメータ:
TM1637_t *p: TM1637_tのポインタ
bool dot: ドットセグメントをオンにするならtrue
uint8_t col: 表示するカラム
戻り値:
0なら成功、負の値なら失敗
*/
int TM1637_putchar(TM1637_t *p, char c, bool dot, uint8_t col);
/*
int TM1637_putstr(TM1637_t *t, char *str);
文字列表示
パラメータ:
TM1637_t *p: TM1637_tのポインタ
char *str: 表示する文字列
戻り値:
0なら成功、負の値なら失敗
*/
int TM1637_putstr(TM1637_t *t, char *str);

#endif
