#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>

//----------------------------------------------------------
// 大域変数
//----------------------------------------------------------
// シリアルポートのファイルハンドル(WIN32)
static HANDLE handle;

// シリアルポート(name)を開いて通信速度を設定し、ファイルハンドルを返す
HANDLE comm_open (char* name, int rate)
{
    HANDLE handle;
    // シリアルポートを開く(WIN32のAPI)
    handle = CreateFile(port,
                        GENERIC_READ|GENERIC_WRITE,	// アクセスモード
                        0,// 共有モード
                        NULL, // セキュリティ属性
                        OPEN_EXISTING,		// 作成方法フラグ
                        FILE_ATTRIBUTE_NORMAL,	// ファイル属性
                        NULL);			// テンプレート
    // シリアルポートの設定
    DCB dcb;
    if (GetCommState(handle, &dcb)==FALSE){
        CloseHandle(handle);
        return 0;
    }
    dcb.BaudRate	= rate;
    dcb.ByteSize 	= 8;
    dcb.Parity 	= NOPARITY;
    dcb.fParity	= FALSE;
    dcb.StopBits	= ONESTOPBIT;
    SetCommState(handle, &dcb);

    // タイムアウトの設定
    COMMTIMEOUTS cto;
    GetCommTimeouts(handle, &cto);
    cto.ReadIntervalTimeout		= 100;
    cto.ReadTotalTimeoutMultiplier 	= 1;
    cto.ReadTotalTimeoutConstant		= 100;
    cto.WriteTotalTimeoutMultiplier	= 0;
    cto.WriteTotalTimeoutConstant 	= 0;
    if(SetCommTimeouts(handle, &cto) == 0) {
        fprintf (stderr, "ERROR! (timeouts cannot set)\n");
        return 0;
    }
    return handle
}

// ファイルをとじる
void comm_close (HANDLE handle)
{
    CloseHandle(handle);
}

int comm_send (char *buff, int size)
{
}

int comm_recv (char *buff, int size)
{
}

//----------------------------------------------------------
// イベントに対するプロシージャ関数
//----------------------------------------------------------
void proc_win_main(WSCbase* object){
    // NONEイベントに対するプロシージャなので呼ばれることはない
}
static WSCfunctionRegister op_proc_win_main("proc_win_main",(void*)proc_win_main);

// トグルボタンが押されたときのイベント(VALUE_CH)に対するプロシージャ
void proc_comm_tgl_value_ch(WSCbase* object){
    // トグルボタンとして扱うためにキャストする
    WSCvtoggle* tgl = (WSCvtoggle*)object->cast("WSCvtoggle");
    // トグルボタンの状態を取得する
    WSCbool status = tgl->getStatus();
    // ボタンがオンになったとき
    if (status == True) {
        // シリアルポートを開く
        handle = comm_open ((char*)ifd_comm->getProperty (WSNlabelString), 115200);
        // シリアルポートを開けないとき
        if (handle == 0) {
            // 表示をオフにする
            tgl->setStatus (False);
        }
    }
    // ボタンがオフになったとき
    else {
        // シリアルポートをとじる
        comm_close (handle);
    }
}
static WSCfunctionRegister op_proc_comm_value_ch("proc_com_value_ch",(void*)proc_com_value_ch);


// トグルボタンが押されたときのイベント(VALUE_CH)に対するプロシージャ
void proc_comm_tim_activate(WSCbase* object){
}
