#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include <WSCvtoggle.h>
#include <WSCvslider.h>
#include "main_win.h"

// シリアルポートのファイルハンドル(WIN32依存)
static HANDLE handle ;

// サーボの指令値[deg]
static double srvo_ref;

// シリアルポート(name)を開いて通信速度を設定し、ファイルハンドルを返す
HANDLE comm open(char* name, int rate)
{
   HANDLE handle;
   // シリアルポートを開く(WIN32のAPI)
   handle = CreateFile(name ,
                       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) ;
    handle = 0 ;
}
int comm_send(char *buff , int size)
{
    if(handle==0){
       return 0 ;
    }
    return 0 ;
}

// トグルボタンが押されたときのイベント(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*)comm_ifd-->getProperty(WSNlabelString),115200) ;
        // シリアルポートを開けないとき
        if(handle == 0){
           // 表示をオフにする
           tgl-->setStatus(False) ;
        }
     }
     // ボタンがオフになったとき
     else{
         // シリアルポートをとじる
         comm_close(handle) ;
     }
}

// タイマーが起動したときのイベント(ACTIVATE) に対するプロシージャ
void proc_comm_tim_activate(WSCbase* object){
     // シリアルポートに指令値を送る
     char buff [512] ;
     sprintf(buff , "%f\n" , srvo_ref) ;
     comm_send(buff , strlen(buff)+1) ;
     fprintf(stderr , "%s " , buff ) ;
     fflush (stderr) ;
}

void proc_srvo_sld_value_ch (WSCbase* object){
    // スライダとして扱うためにキャストする
    WSCvslider* sld = (WSCvslider*)object-->cast("WSCvslider") ;
    // スライダの値をサーボ指令値として取得する
    srvo_ref = (double)sld-->getProperty (WSNvalue) ;
    // サーボ指令値をインプットフィールドに表示する
    srvo_ifd-->setProperty (WSNlabelString , srvo_ref ) ;
}
8