ILF / Mbed 2 deprecated mbed_ILF

Dependencies:   mbed SDFileSystem

ILF.cpp

Committer:
Kujira
Date:
2022-01-18
Revision:
0:1977c2310ef7
Child:
1:f6a9410c46d2

File content as of revision 0:1977c2310ef7:

#include "mbed.h"
#include "SDFileSystem.h"
//#include "MODSERIAL.h"

//difine_mbed_LPC1768

/*******************************************************************************

2018.8.31
ILF Iop汎用器

仕様
電圧/抵抗測定:12bit
電流測定:14bit

割込みはP0~P2で可能
シーケンサスタート信号は、回路図「seq_yobi]で対応

ver1.2.3
EEPROM通信のコードを修正。
debug mode の追加

ver1.2.2
過充電防止検査の上限規格の判定追加
CAL情報登録画面において、登録項目の順序入替え(過充電防止上限規格の挿入)
過充電防止上限規格ゼロの場合、判定しない

ver1.2.1
過充電防止検査の上限規格を新たに設置。
それに伴い、規格値のメモリ割り当てと、上限規格設定画面を追加。

ver1.2.0

2021.9.7

CAL.LJ21(A1098A05)専用
発電検出時、高照度条件下でVSS電圧がIC耐圧超える為、VHD-VDD短絡する仕様へ変更(A05)
200lx下でもVHD-VDD短絡の電圧条件を満たす為、ILFも対応。
VSS端子でVOC測定をする。その為、VOC測定時以外はVSS端子と測定器を切り離すリレーを
サブ基板へ取り付け、制御プログラムを追加した。
CH1:P1_23(LPC1768) (led3_on)
CH2:P1_22(LPC1768) (led3_off)

アンテナ測定時にアンテナ測定端子切り離し用リレーのON/OFF制御を追加
(led4_on)
(led4_off)

ver1.1.0
1)VFD_SW23 SW31がタッチ感度故障の為、配置替え
CAL登録画面とMANUAL測定画面
2)DELETE EEPROM ボタンの配置変更
3)シーケンサ判定IOの変更

ver1.1.1
void auto_meas において初期 R[i]の値をクリアすることを追加
自動測定時、タッチパネルでスタートをやめる(外部IO入力のみ)

ver1.1.2
過充電防止検査時の電源電圧:VOC検査時の電圧となっていたのを修正。

ver1.1.3
1)SDカード未挿入の表示を削除

2)R=Hの時間を0.2sから1sへ変更

R5186 ver2.0.3の内容を反映。

未)フラグでR5186系と切替え
未)測定部ごとにクラス分け(過充電防止のところだけでも)

*******************************************************************************/
//
//各種定数
#define DEB_EN          1       //デバッグイネーブル
#define RL_EN           1       //1:io[]を外付けのリードリレー制御用に使用する場合は1.以外は0. ver1.2.3
#define SEQ_EN          0       //1:シーケンサ接続仕様 0:シーケンサ未接続仕様
#define period_pwm      200     //*us
#define COP             0.005   //pwm_duty(%) = COP * DATA(0~255)
#define rsense          1000    //抵抗測定回路のプルアップ抵抗値 1kΩ
#define res_vref        0x800   //抵抗測定回路のリファレンス電圧 2.048V
#define dac_vref        2500    //DACのリファレンス電圧 単位[mV]
#define number_of_channels   2  //測定チャンネル数(MAX 4)
#define time_discharge  0.5     //discharging time(s)
#define time_integral   2       //integral time(s)
#define touch           5       //GU-D タッチパネル感度 0~7で設定。低いほど敏感。
#define wait_voc        0.5     //[s]VOC測定電圧設定後からリセットまでの時間
#define wait_reset      0.3     //[s]リセット解除からVOC測定までの時間
#define wait_poweron    4       //[s]電源投入からリセットまでの時間
#define time_reset      0.5     //reset Hの時間 ver1.1.3
#define TIME_RELAY_ON   0.5     //外付けリードリレー用 Ton[s]
#define TIME_RELAY_OFF  0.2     //外付けリードリレー用 Toff[s]

/***************************************
RESOLUTION SETTINGS VS. LSB
 -----------------------------------
|Resolution Setting  |   LSB        |
 -----------------------------------
|    12bits(00)      |   1mv        |
|    14bits(01)      |   250uV      |
|    16bits(10)      |   62.5uV     |
|    18bits(11)      |   15.625uV   |
 -----------------------------------
****************************************/
//ver1.2.0
const int version_major = 1;    //ソフトバージョン
const int version_minor = 2;    //ソフトバージョン
const int version_build = 3;    //ソフトバージョン

//
//繰り返しタイマー割り込み
Ticker flipper; /* 初期化 */
//one shot timer
Timeout oneshot1;
Timeout oneshot2;
Timeout oneshot3;
Timeout oneshot4;
//
//SD-CARD
SDFileSystem sd(P0_9, P0_8, P0_7, P0_6, "sd"); //SDFileSystem name(mosi, miso, sck, cs, mount);
//
//interruput
InterruptIn seq_yobi(P0_19);
//
//start sw
DigitalIn sw_start(P0_4);
//
//DigitalOut
DigitalOut  houden[]  = {  //  配列を用意します
    DigitalOut( P2_1 ),  //houden1 配列の1番目の要素を**で初期化したDigitalOutに
    DigitalOut( P2_0 ),  //houden2
    DigitalOut( P1_28 ), //houden3
    DigitalOut( P1_29 )  //houden4
};

DigitalOut  io[]  = {  //  配列を用意します
    DigitalOut( P0_25 ),  //io1 配列の1番目の要素をP0_25で初期化したDigitalOutに
    DigitalOut( P0_26 ),  //io2
    DigitalOut( P0_23 ),  //io3
    DigitalOut( P0_24 ),  //io4
    DigitalOut( P1_22 ),  //io5
    DigitalOut( P1_23 ),  //io6
    DigitalOut( P1_24 ),  //io7
    DigitalOut( P1_25 )   //io8
};

DigitalOut  range[] = {  //  配列を用意します
    DigitalOut( P2_3 ),  //range1 配列の1番目の要素を**で初期化したDigitalOutに
    DigitalOut( P2_2 ),  //range2
    DigitalOut( P1_26 ), //range3
    DigitalOut( P1_27 )  //range4
};

/*
DigitalOut  led1_green(P0_17);
DigitalOut  led2_green(P1_31);
DigitalOut  led1_red(P0_18);
DigitalOut  led2_red(P1_30);
*/

DigitalOut  led_green[] = {
    DigitalOut( P0_17 ),
    DigitalOut( P1_31 ),
    DigitalOut( P2_11 ),
    DigitalOut( P1_18 )
};

DigitalOut  led_red[] = {
    DigitalOut( P0_18 ),
    DigitalOut( P1_30 ),
    DigitalOut( P2_12 ),
    DigitalOut( P1_19 )
};
//ver1.1.0
DigitalOut  seq_hantei[] = {
    DigitalOut( P0_21 ),
    DigitalOut( P0_22 ),
    DigitalOut( P3_25 ),
    DigitalOut( P3_26 )
};

DigitalOut  seq_busy(P0_20);
//DigitalIn
DigitalIn   seq_start(P4_28);
DigitalIn   seq_cal_a(P2_6);
DigitalIn   seq_cal_b(P2_7);
DigitalIn   seq_cal_c(P2_8);
DigitalIn   seq_kosuu_a(P2_13);
DigitalIn   seq_kosuu_b(P2_9);
//DigitalIn   seq_yobi(P0_19);

//
//PWM
PwmOut leds[] = {   //配列を用意
    PwmOut(P2_5),  //LED1
    PwmOut(P2_4),  //LED2
    PwmOut(P1_21), //LED3
    PwmOut(P1_20)  //LED4
};

//
//I2C
I2C i2c(P0_10,P0_11); //(PinName sda, PinName scl) I2Cを定義
//
/******************:
 SD Card
*******************/
void sd_writetext(char* text);
/******************:
gu-D(表示器) addr:50H
*******************/
//parameter_gu256X128C-D903M
const   int addr_gu = 0x50 << 1; // Address of gu256X128C-D903M
//
//prototype
const int Proportional1 = 0x02;
//const int Proportional2 = 0x03;
//const int Proportional3 = 0x04;
//
void gu_cls();
void gu_drawButton(int x, int y, int w, int h, const char *data);
void gu_cursor(int x, int y);
void gu_fontsize(const char code);
void gu_print_dot(int x, int y, const char *ptext);
void gu_fontWidth(const char fontWidth);
void gu_print(const char t[] );
void gu_fontReverse(int code);
void gu_RealTimeImage_dot(int x, int y, int w, int h, const char data[]);
void gu_RealTimeImage(int w, int h, char data[]);
void gu_magnify(int x, int y);
//
//オリジナルgu用関数
void gu_print1(const char* ptext);
void gu_luminance(const char* cl);
void gu_touchPara(int x,int y);
void gu_sendOneByte(char data);
void utility(); //輝度調整サブルーチン
void gu_CRLF();
void gu_reverse(char x);
void gu_drawbutton_cursor(char x,char y);
void gu_onebyte(char data);
//
//Button Trig Function
void adjust_illumination();//LED輝度調整サブ
void gu_initial();//初期設定サブ
void gu_set_button(char sw_num,char* text);//SWナンバーと表示テキストを指定
void gu_set_button_font1(char sw_num,char* text);//fontsize = 1
void gu_button_up(char sw_num); //upボタン表示
void gu_button_down(char sw_num);//downボタン表示
void gu_Button_up1();
void gu_Button_up2();
void gu_Button_up3();
void gu_Button_up4();
void gu_button_up_on(char sw_num);
void gu_Button_up_on2();
void gu_Button_down1();
void gu_Button_down2();
void gu_Button_down3();
void gu_Button_down4();
void gu_button_down_on(char sw_num);
void gu_Button_down_on2();
void gu_Button_power_on();
void gu_Button_power_off();

/***************************
LCP1768(EEPROM) addr:15H
***************************/
//parameter_PCAS08A(EEPROM)
//const   int addr_EEPROM = 0x15 << 3; // Address of PCAS08A(EEPROM) コメント化 ver1.2.1
char    rdata[17]; //EEPROMからのリードデータ
char    wdata[17]; //EEPROMへのライトデータ
int     Jyushin; //受信成功時 Jyushin=0
int     Soushin; //送信成功時 Soushin=0
const   int fixed_adrs = 0x15 << 3; // Address of PCAS08A(EEPROM) 始めの5bit ver1.2.1
int    adrs_eeprom; //slave address ver1.2.1
/***************************
MCP3424(ADC)
***************************/
//parameter_ADC(MCP3424)
const   int addr_ADC1 = 0x6C <<1;//電圧抵抗測定No.1,No.2用ADC
const   int addr_ADC2 = 0x6A <<1;//電圧抵抗測定No.3,No.4用ADC
const   int addr_ADC3 = 0x68 <<1;//電流測定No.1,No.2
const   int addr_ADC4 = 0x6E <<1;//電流測定No.3,No.4
//
char hd[] = "0123456789ABCDEF" ;
//
//関数
void    general_call(char com); //power on reset
char    adc_config(char ch, char rate);
//
/***************************
AD5625RBUZ(DAC) addr:1F
***************************/
const   char addr_dac = 0x1F <<1;
void    dac_out(short mvolt, char addr);
void    dac_init();
//
/***************************
表示
関数
***************************/
void    select_cal();//CAL選択画面
void    setup_cal_information(char cal_num);//CAL情報登録画面
void    manual_int_hyouji();
void    auto_int_hyouji();
/***************************
測定関係
関数
***************************/
void    set_pullup();//シーケンサからの入力ピンのプルアップ設定
void    trigger();//シーケンサからのスタート信号割込みサブ
void    calibration();
void    compute_adc(int adc_con, long *avg);//(ADCのCONFIG, 計算結果)
void    gu_putdec(short* x);//2byteを10進で表示
void    gu_putdeck(short* x);//2byteを10進で表示。1/1000.
void    gu_putdeci(float* x);// ver1.1.4
void    gu_putdeci_mA(float* x);// ver1.1.4
void    meas_current_automode(char amount);//AutoMOdeの電流測定サブ iop ocp共通
void    auto_run();//自動測定モード
void    auto_meas(char noc);//一括測定。ch:測定する総チャンネル数
void    meas_sub();//自動測定モード内の繰り返し処理
void    manual();//手動測定モード
void    hantei(char noc);//規格値比較エラーフラグ立てる
void    select_ich(char ch);//電流測定chの選択と設定
short   read_adc(char addr);//指定addressから2byte読込み
short   meas_voltage(char ch);//測定チャンネルを指定して、測定値(2byte)を返す
short   meas_resistor(char ch);//測定チャンネルを指定して、測定値(2byte)を返す
void    display_resistor(short sdata);//測定値を表示する。
void    led_off();//判定用LED全消灯
void    read_syoudo(char* c);//EEPROMから照度データ(PwmDuty)を読み込んでセットする

//
/***************************
測定関係
変数
***************************/
char    io_voc; //VOC測定時のIO操作。ON(=VDD)の場合は”0x01"OFF(=OPEN)は"0x00"
char    err_f[4];//ch1~4 規格外発生時のフラグ 0or1
short   V[4];//ADC入力値を3倍した値 測定値[V] 16進数
float   I[4];//電流測定値チャンネル毎の
short   R[4];//抵抗測定値
short   voc[4];//ADC入力値を3倍した値 測定値[mV] 16進数
short   vocp[4];//過充電防止確認用電圧
float   iop[4];//2byte 補数あり 測定値 1bit 0.01uA
float   ocp[4];//2byte 補数あり 測定値
char    ch_num ;//選択中の測定チャネル(0~3)

/**********************
暫定
**********************/
/*
#define     vss_voc     3600
#define     vss_iop     2800
#define     vss_ocp     3600
#define     wait_vss    4
#define     wait_io     2
#define     low_limit_voc   0xCE4//[mv] HEX
#define     low_limit_iop   0x44C//11uA換算:1100*0.01
#define     low_limit_ocp   0xFFE2//-0.3uA換算
*/
/******************************

    CAL情報登録 -> EEPROM

*******************************/
#define     caliber_number  6       /* CAL登録数 */
#define     addr_calnum     0x20    /* 起動時に選択するCALnumber */
#define     addr_cal1       0x80    /* CAL.No1の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1 */
#define     addr_cal2       0x90    /* CAL.No2の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
#define     addr_cal3       0xA0    /* CAL.No3の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
#define     addr_cal4       0xB0    /* CAL.No4の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
#define     addr_cal5       0xC0    /* CAL.No5の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
#define     addr_cal6       0xD0    /* CAL.No6の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
//ver1.2.1
//EEPROM BLOCK2へのアドレッシングは、別で初期8bitも制御する必要がある。
#define     addr_cal1_2     0x00    /* CAL.No1の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
#define     addr_cal2_2     0x10    /* CAL.No2の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
#define     addr_cal3_2     0x20    /* CAL.No3の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
#define     addr_cal4_2     0x30    /* CAL.No4の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
#define     addr_cal5_2     0x40    /* CAL.No5の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
#define     addr_cal6_2     0x50    /* CAL.No6の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
//up to here

//structure
struct cal_info {
    short   number;         /* CAL.No. */
    short   vss_iop;        /* IOP測定時のVss電圧 1bit * 0.01uA*/
    short   vss_ocp;        /* 過充電防止(over charge protection)測定時のVss電圧 */
    short   vss_voc;        /* VOC測定時のVss電圧 */
    short   low_limit_voc;  //1bit * 1mv
    short   low_limit_iop;  //1bit * 0.01uA
    short   low_limit_ocp;  //過充電防止検査の上限規格値(プラス側)
    short   up_limit_ocp;  //過充電防止検査の上限規格値(マイナス側)ver1.2.1追加
    float   wait_iop;       /* [s]Iop測定前の待機時間 1bit 1s 換算*/
    float   wait_ocp;       /* [s]過充電防止時消電測定前の待機時間 1bit 1s換算*/
    short   low_limit_resistor; /* アンテナ抵抗規格 1bit 10Ω*/
    short   up_limit_resistor; /* アンテナ抵抗規格 1bit 10Ω*/
} ;
//parameter
struct  cal_info calinfo;
char    reg_num;    /* 選択中の登録CALナンバー */
//function
void erace_calinfo();
void read_regnum();
void read_caliber(cal_info *cal, int num);
void write_caliber_information(cal_info *cal, int num);

/*******************************

 set mode interruptin/degitalin

*******************************/
void set_pullup()
{
    sw_start.mode(PullUp);
    seq_start.mode(PullUp);//シーケンサからのスタート信号
    seq_cal_a.mode(PullUp);
    seq_cal_b.mode(PullUp);
    seq_cal_c.mode(PullUp);
    seq_kosuu_a.mode(PullUp);
    seq_kosuu_b.mode(PullUp);
}
/*******************************

    Sequence Mode main screen

*******************************/
void seq()
{
    gu_cls();//clear screen
    gu_fontsize(2);
    gu_print1("Sequenser Mode");

    //seq_start.fall(&trigger);//スタート信号立下りで割込み

    //シーケンサのトリガ以外は受け付けない
    while(1) {

        if( seq_start == 0 ) {

            trigger();

        }

        wait(0.3);

    }//while(1)
}


/*******************************

    Strart Sequence

*******************************/
void trigger()
{
    char    meas_num;//測定個数
    char    cal_num; //CAL選択ナンバー
    //char    cmd_gu[2];

    gu_cls();//clear screen
    gu_fontsize(2);
    gu_print1("Sequenser Mode");
    gu_fontsize(1);
    gu_cursor(0,3);
    gu_print1("start  ");
    gu_cursor(128,0);
    gu_print1("CAL.");

    //シーケンサからCAL選択bit読込と表示
    cal_num = ( seq_cal_c << 2 ) + ( seq_cal_b << 1 ) +  seq_cal_a;

    cal_num = ( ~ cal_num ) & 0x7 ; //3bit入力の負論理

    //read caliber infomation from eeprom
    if( cal_num >= 1 && cal_num <= 6 ) {
        read_caliber(&calinfo, cal_num);
        gu_onebyte( cal_num + 0x30 );//CAL.No.確認用
    } else {
        gu_cls();
        gu_fontsize(1);
        gu_print1("Cal number error");
        wait(1);

    }

    meas_num = ( ~(( seq_kosuu_b << 1 ) + seq_kosuu_a )) & 0x3; //2bit負論理

    gu_cursor(128,1);
    gu_print1("n=");
    gu_onebyte( meas_num + 0x30 );//測定個数確認用

    seq_busy = 1;//DegitalOut busy

    auto_meas( meas_num );

    //判定結果をシーケンサへ出力
    hantei( meas_num );

    wait(0.1);

    //測定終了
    seq_busy = 0;//DegitalOut busy

    //終了表示
    gu_fontsize(1);
    gu_cursor(0,3);
    gu_print1("ready  ");

}

/*******************************

    EEPROMへCAL情報(struct)を保存

*******************************/
void write_caliber_information(cal_info *cal, int num)
{
    char   cdata[17];//1byte

    //EEPROM書込み 先頭アドレス
    cdata[0] = addr_cal1 + 0x10 * ( num - 1 );

    //データ分割 EEPROM_BYTE 0x00~0x0Bまで
    cdata[1] = calinfo.vss_iop & 0xFF;//1byte分割
    cdata[2] = ( calinfo.vss_iop >> 8 ) & 0xFF;//1byte分割

    cdata[3] = calinfo.vss_ocp & 0xFF;//1byte分割
    cdata[4] = ( calinfo.vss_ocp >> 8 ) & 0xFF;//1byte分割

    cdata[5] = calinfo.vss_voc & 0xFF;//1byte分割
    cdata[6] = ( calinfo.vss_voc >> 8 ) & 0xFF;//1byte分割

    cdata[7] = calinfo.low_limit_voc & 0xFF;//1byte分割
    cdata[8] = ( calinfo.low_limit_voc >> 8 ) & 0xFF;//1byte分割

    cdata[9] = calinfo.low_limit_iop & 0xFF;//1byte分割
    cdata[10] = ( calinfo.low_limit_iop >> 8 ) & 0xFF;//1byte分割

    cdata[11] = calinfo.low_limit_ocp & 0xFF;//1byte分割
    cdata[12] = ( calinfo.low_limit_ocp >> 8 ) & 0xFF;//1byte分割

    //ver1.1.0
    cdata[13] = calinfo.wait_iop; //1bitあたり 1s
    cdata[14] = calinfo.wait_ocp; //1bitあたり 1s
    /*ver1.1.0
    cdata[13] = calinfo.wait_iop * 10; //1bitあたり0.1s
    cdata[14] = calinfo.wait_ocp * 10; //1bitあたり0.1s
    */

    cdata[15] = calinfo.low_limit_resistor / 10; //1bitあたり10ohm
    cdata[16] = calinfo.up_limit_resistor / 10;  //1bitあたり10ohm

    Soushin = i2c.write (fixed_adrs, cdata, 17);

    //ver1.2.1
    wait(0.1);

    char cdata_2[3];

    adrs_eeprom = fixed_adrs + 0x2; //BLOCK2の選択

    cdata_2[0] = addr_cal1_2 + 0x10 * ( num - 1 ); //PAGE選択
    cdata_2[1] = calinfo.up_limit_ocp & 0xFF;//1byte分割
    cdata_2[2] = ( calinfo.up_limit_ocp >> 8 ) & 0xFF;//1byte分割

    Soushin = i2c.write (adrs_eeprom, cdata_2, 3);
    //up to here

}
/*******************************

    EEPROMからCAL情報を
    読み出して構造体へ代入する

*******************************/
void read_caliber(cal_info *cal, int num)
{
    signed short    sdata[16];      //CAL設定条件
    int             i;

    //EEPROMからnumで指定したナンバーのCAL情報を読み出し
    wdata[0] = addr_cal1 + 0x10 * ( num - 1 );
    Soushin = i2c.write (fixed_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 16);//read 1byte

    //データ合成 EEPROM_BYTE 0x00~0x0Bまで2byte結合
    for ( i = 0; i <= 5; i++ ) {
        sdata[i] = rdata[i*2] | ( rdata[ i*2 + 1 ] << 8 );
    }
    sdata[6] = rdata[12];
    sdata[7] = rdata[13];
    sdata[8] = rdata[14];
    sdata[9] = rdata[15];

    cal -> number = num;
    cal -> vss_iop = sdata[0];
    cal -> vss_ocp = sdata[1];
    cal -> vss_voc = sdata[2];
    cal -> low_limit_voc = sdata[3];
    cal -> low_limit_iop = sdata[4];
    cal -> low_limit_ocp = sdata[5];
    //ver1.1.0
    cal -> wait_iop = sdata[6];
    cal -> wait_ocp = sdata[7];
    /*
    cal -> wait_iop = sdata[6] / 10;
    cal -> wait_ocp = sdata[7] / 10;
    */
    cal -> low_limit_resistor = sdata[8] * 10;
    cal -> up_limit_resistor = sdata[9] * 10;

    //ver1.2.3
    //EEPROMからnumで指定したナンバーのCAL情報を読み出し
    char            rdata2[2];

    adrs_eeprom = fixed_adrs + 0x02; //BLOCK2

    wdata[0] = addr_cal1_2 + 0x10 * ( num - 1 );
    Soushin = i2c.write (adrs_eeprom, wdata, 1,true);    //読込先頭アドレス指定 ReStart
    Jyushin = i2c.read ((adrs_eeprom + 0x01), rdata2, 2);//read 1byte

    //BYTE0~1
    i = 0;
    sdata[10] = rdata2[i*2] | ( rdata2[ i*2 + 1 ] << 8 );

    cal -> up_limit_ocp = sdata[10];
    //ver1.2.1 up to here

}
/*******************************

    EEPROMからCAL登録番号を読出し

*******************************/
void read_regnum()
{
    wdata[0] = addr_calnum;
    Soushin = i2c.write (fixed_adrs, wdata, 1,true);   //読込先頭アドレス指定 ReStart
    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte

    reg_num = rdata[0];
}
/*******************************

    EEPROMからCAL登録情報全消去

*******************************/
void erace_calinfo()
{
    int i;

    reg_num = 0x01;
    wdata[0] = addr_calnum;    //word address 書込み先頭アドレス指定
    wdata[1] = reg_num;
    Soushin = i2c.write (fixed_adrs, wdata, 2);

    wait(0.2);

    wdata[0] = addr_cal1;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (fixed_adrs, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal2;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (fixed_adrs, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal3;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (fixed_adrs, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal4;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (fixed_adrs, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal5;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (fixed_adrs, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal6;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (fixed_adrs, wdata, 17);

    //ver1.2.1
    //BLOCK2の消去
    wait(0.2);

    adrs_eeprom = fixed_adrs + 0x02; //BLOCK2

    wdata[0] = addr_cal1_2;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (adrs_eeprom, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal2_2;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (adrs_eeprom, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal3_2;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (adrs_eeprom, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal4_2;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (adrs_eeprom, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal5_2;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (adrs_eeprom, wdata, 17);

    wait(0.2);

    wdata[0] = addr_cal6_2;
    for( i = 1; i <= 16; i++) { //1page全消去
        wdata[i] = 0x00;
    }
    Soushin = i2c.write (adrs_eeprom, wdata, 17);

    wait(0.2);

    //up to herever1.2.1

}
/******************************************

    ADC(MCP3424) Configuration Register

    ch : Channel Selection Bit
        00 = Select Channel 1
        01 = Select Channel 2
        10 = Select Channel 3
        11 = Select Channel 4

    rate : Sample Rate Selection Bit
        00 = 240 SPS(12bits)
        01 = 60 SPS(14bits)
        10 = 15 SPS(16bits)
        11 = 3.75 SPS(18bits)

******************************************/
char adc_config(char ch, char rate)
{
    char confreg;   //Configuration Register 1byte

    char rdy = 0;   //Ready Bit
    char cm = 1;    //Conversion Mode Bit
    char gain = 0;  //PGA Gain Selection Bits

    confreg = (( rdy & 0x1 ) << 7 ) + (( ch & 0x3) << 5 ) + (( cm & 0x1 ) << 4) + (( rate  & 0x3 ) << 2) + ( gain & 0x3 ) ;

    return( confreg );
}
/******************************************

    ADC(MCP3424) Configuration Register
    電流測定チャンネルの選択
    char ch : 1~4ch

******************************************/
void select_ich(char ch)
{
    char    com;

    switch ( ch ) {
        case 0:
            com =  adc_config( 0, 1 );//ADC3_ch1選択 14bits
            i2c.write( addr_ADC3, &com, 1 );
            break;
        case 1:
            com =  adc_config( 1, 1 );//ADC3_ch2選択 14bits
            i2c.write( addr_ADC3, &com, 1 );
            break;
        case 2:
            com =  adc_config( 0, 1 );//ADC4_ch1選択 14bits
            i2c.write( addr_ADC4, &com, 1 );
            break;
        case 3:
            com =  adc_config( 1, 1 );//ADC4_ch2選択 14bits
            i2c.write( addr_ADC4, &com, 1 );
            break;
    }
}
/******************************************

    ADC(MCP3424)
    指定addressから2byte読込み

******************************************/
short read_adc(char addr)//指定addressから2byte読込み
{
    char cdata[2];//1byte
    short sdata;//2byte

    i2c.read( addr + 0x01, cdata, 2);

    //connect 2byte
    sdata = cdata[0] & 0xFF;
    sdata = ( sdata << 8 ) | cdata[1];

    return ( sdata );
}
/*****************************

    AUTO/SEQ Mode

    ワンショットタイマー発生イベント

    For Current measurement
     a recurring interrupt to repeatedly call a function at a specified rate.

*****************************/
void flip_ch1()
{
    short sdata;

    sdata = read_adc( addr_ADC3 );

    I[0] = sdata * 5 * 0.25;

    //次の測定chへ切替
    select_ich(1);
}

void flip_ch2()
{
    short sdata;

    sdata = read_adc( addr_ADC3 );

    I[1] = sdata * 5 * 0.25;

    //次の測定chへ切替
    select_ich(2);
}

void flip_ch3()
{
    short sdata;

    sdata = read_adc( addr_ADC4 );

    I[2] = sdata * 5 * 0.25;

    //次の測定chへ切替
    select_ich(3);
}

void flip_ch4()
{
    short sdata;

    sdata = read_adc( addr_ADC4 );

    I[3] = sdata * 5 * 0.25;

    //次の測定chへ切替 無し
}

/*****************************

    Manual Mode

    繰り返しタイマー発生イベント

    For Current measurement
     a recurring interrupt to repeatedly call a function at a specified rate.

*****************************/
void flip()
{
    short   sdata; //_2byte reading data of ADC
    float   fdata; // ver1.1.4

    switch ( ch_num ) {
        case 0:
        case 1:
            sdata = read_adc( addr_ADC3 );
            break;
        case 2:
        case 3:
            sdata = read_adc( addr_ADC4 );
            break;
    }

    //sdata = sdata * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv
    /*ver1.1.4*/
    fdata = sdata * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv

    gu_cursor(0,4);
    gu_print1(" ");
    /*ver1.1.4*/
    gu_putdeci(&fdata);
    //gu_putdeci(&sdata);

    houden[ ch_num ] = 1; //Discharge

    wait(time_discharge); //Discharge time

    houden[ ch_num ] = 0; //charging

}
/*********************************
    Manual Mode
    initial screen
*********************************/
void manual_int_hyouji()
{

    /* 画面表示 */
    gu_cls();
    gu_fontsize(2); //change fontsize
    gu_fontWidth(Proportional1);
    gu_print1("Manual Mode");

    gu_cursor(0, 2);
    gu_print1("CH.");
    gu_cursor(40, 14);
    gu_print1("vss");
    gu_cursor(192, 14);
    gu_print1("ch.");
    /*
    gu_cursor(128, 14);
    gu_print1("slct ch.");
    */

    //操作ボタン配置
    gu_Button_power_on();//メニューへ戻る
    gu_button_up(27);//印加電圧増加
    gu_button_down(28);//印加電圧減少
    gu_button_up(32);//ch切替
    //gu_button_down(32);//ch切替

    //Show Reset button(LEFT)
    gu_set_button(25,"R");

}
/*********************************

    Manual Mode (Main)

*********************************/
void manual()
{

    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
    char cswdata; // 0x00 or 0x01
    char crdata[3];
    char *pcswnum = &cswnum;
    char *pcswdata = &cswdata;
    int i;
    int j;
    float interval;//繰り返し測定間隔(s) <- 積分時間と、繰り返し割込みサブ中のwait(放電時間)も足す
    short vss;
    short sdata;
    int r_flag;
    float ima;
    short ssdata;

    ch_num = 0; //初期電流測定CH.

    interval = time_integral + time_discharge ;//繰り返し割込みの間隔設定
    flipper.attach(&flip, interval);

    read_regnum();//CAL登録No.読込
    read_caliber(&calinfo, reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入

    /* 初期表示 */
    manual_int_hyouji();
    //選択測定チャンネルの表示
    gu_fontsize(2); //change fontsize
    gu_cursor(24, 2);
    wdata[0] = ( ch_num + 1 ) + 0x30;
    i2c.write( addr_gu, wdata, 1);

    //初期測定設定
    //set range
    range[0] = 1;//ch.1 10uA測定レンジ
    //select channel
    wdata[0] =  adc_config( 0, 1 );//ADC3_ch1選択 14bits
    i2c.write( addr_ADC3, wdata, 1 );

    vss = calinfo.vss_iop;

    //apply Vss to all channel
    for ( i = 0; i <= (number_of_channels - 1); i++) {
        dac_out( calinfo.vss_iop,i); //Vss設定 DAC
    }

    gu_cursor(0,8);
    gu_print1("Vss ");

    gu_cursor(64,8);
    sdata = -1 * vss;
    gu_putdeck( &sdata );
    gu_print1("V");

    while(1) {

        crdata[0] = 0;
        crdata[1] = 0;
        crdata[2] = 0;

        //タッチパネルスイッチ読込
        Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);

        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
            *pcswnum = crdata[1]; //スイッチ番号
            *pcswdata = crdata[2];//ON/OFF情報

            if (cswdata == 0x01) { //タッチしたならば
                switch( cswnum ) { //SWの番号(位置)

                    case 26:
                        //gu_reverse(0x01);                         //gu_リバース指定
                        //gu_button_up(27);//印加電圧増加

                        if ( vss < 4500 ) {
                            vss = vss + 100;
                        }

                        //apply Vss to all channel
                        for ( i = 0; i <= (number_of_channels - 1); i++) {
                            dac_out( vss,i); //Vss設定 DAC
                        }

                        gu_reverse(0x00);
                        gu_cursor(64,8);
                        sdata = -1 * vss;
                        gu_putdeck( &sdata );
                        gu_print1("V");

                        //gu_button_up(27);//印加電圧減少

                        wait(0.1);

                        break;

                    case 27:
                        //gu_reverse(0x01);                         //gu_リバース指定
                        //gu_button_down(28);//印加電圧減少

                        if ( vss >= 100 ) {
                            vss = vss - 100;
                        }

                        //apply Vss to all channel
                        for ( i = 0; i <= (number_of_channels - 1); i++) {
                            dac_out( vss,i); //Vss設定 DAC
                        }

                        //gu_reverse(0x00);                         //gu_リバース指定
                        gu_cursor(64,8);
                        sdata = -1 * vss;
                        gu_putdeck( &sdata );
                        gu_print1("V");

                        //gu_button_down(28);//印加電圧減少

                        wait(0.1);

                        break;

                    case 0x07 ://Exit

                        gu_Button_power_off();//電源ボタンイメージ反転表示

                        //割り込み停止
                        flipper.detach();

                        for( i = 0; i <= 3; i++) {
                            houden[i] = 1;//discharge
                        }

                        wait( time_discharge );
                        //set measuring range
                        for( i = 0; i <= 3; i++) {
                            range[i] = 0;//range 1mA
                            houden[i] = 0;//not discharge
                        }

                        wait(0.2);

                        for ( i = 0; i <= 7; i++)
                            io[i] = 0; //全てのio"L"

                        return;//この関数を抜ける

                    case 0x18 ://sw25 mv_reset

                        //gu_リバース指定
                        gu_reverse(0x01);
                        //Show Reset button(Left)
                        gu_set_button(25,"R");

                        wait(0.1);

                        gu_reverse(0x00); //gu_リバース解除
                        gu_set_button(25,"R"); //Show Reset button(Left)

                        io[ch_num] = 1;

                        //set measuring range  ver1.1.0
                        for( i = 0; i <= 3; i++)
                            range[i] = 0;//range 1mA

                        r_flag = 1;

                        //割り込み停止
                        flipper.detach();

                        break;

                    case 31 ://sw32 CH選択

                        //gu_reverse(0x01);//gu_リバース指定
                        //gu_button_up(32);
                        //gu_reverse(0x00);//gu_リバース解除

                        if ( ch_num < ( number_of_channels - 1 )) {
                            ch_num = ch_num + 1;
                        } else {
                            ch_num = 0;
                        } //ver1.1.0

                        select_ich(ch_num);//ADC測定CHの変更

                        //set measuring range
                        for( i = 0; i <= 3; i++)
                            range[i] = 0; //range 1mA

                        range[ch_num] = 1; //range 10uA

                        //選択測定チャンネルの表示
                        gu_cursor(24, 2);
                        wdata[0] = ( ch_num + 1 ) + 0x30;
                        i2c.write( addr_gu, wdata, 1);

                        //gu_button_up(32);

                        wait(0.1);

                        break;

                        /*
                        case 0x1F ://sw32 CH選択

                            //gu_reverse(0x01);//gu_リバース指定
                            //gu_button_down(32);
                            //gu_reverse(0x00);//gu_リバース解除

                            if ( ch_num >= 1 )
                                ch_num = ch_num - 1;

                            select_ich(ch_num);//ADC測定CHの変更

                            //set measuring range
                            for( i = 0; i <= 3; i++)
                                range[i] = 0;

                            range[ ch_num ] = 1; //range 10uA

                            //選択測定チャンネルの表示
                            gu_cursor(24, 2);
                            wdata[0] =( ch_num + 1 ) + 0x30;
                            i2c.write( addr_gu, wdata, 1);

                            //gu_button_down(32);

                            wait(0.1);

                            break;
                        */

                } //switch
                Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);

            }//if
        }//if

        //ver1.1.0
        if ( j >= 5 ) {
            io[ch_num] = 0;
            range[ ch_num ] = 1; //range 10uA
            r_flag = 0;
            j = 0;
            flipper.attach(&flip, interval);//割込み開始
        }

        if ( r_flag == 1 ) {
            j = j + 1;

            //R=Hの時の電流測定(1ma renge)
            select_ich( ch_num );
            ssdata = read_adc( addr_ADC3 );
            ima = ssdata * 5 * 0.25;

            gu_cursor(0,4);
            gu_fontsize(2);
            gu_print1(" ");
            gu_putdeci_mA(&ima);
        }

        //電圧測定
        //ver1.2.0
        if (RL_EN == 1) {
            switch (ch_num) {
                case 0:
                    io[4] = 1; //外付けリレーON
                    wait(TIME_RELAY_ON);
                    break;
                case 1:
                    io[5] = 1; //外付けリレーON
                    wait(TIME_RELAY_ON);
                    break;
            }
        }
        //up to here

        sdata = meas_voltage( ch_num ) * -1 ;

        //ver1.2.0
        if (RL_EN == 1) {
            io[4] = 0; //外付けリレーOFF
            io[5] = 0; //外付けリレーOFF
        }
        //up to here

        gu_fontsize(2);
        gu_cursor(108,4);
        gu_putdeck(&sdata);
        gu_print1("V");

        //抵抗測定
        sdata = meas_resistor( ch_num );

        gu_fontsize(2);
        gu_cursor(192,4);

        display_resistor( sdata ); //抵抗値表示サブ

        wait( 0.1 );

    }//While
}

/*****************************

    I2C General Call

*****************************/
void general_call(char com)
{
    char    cmd[1];

    cmd[0]= com;
    i2c.write(0x00, cmd, 1); //General Call
}
/*******************************************************************************

    MAIN

*******************************************************************************/
int main(void)
{
    while(1) {

        wait(0.2);

        set_pullup();

        general_call(0x06); //ADC power on reset

        dac_init(); //DAC 初期化

        gu_initial();//初期画面へ
        //utility();
    }
}                                                                               //main end

void gu_initial()
{
    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte0
    //char *pcmd = cmd_gu;
    char clumi; //輝度設定用変数 01h<=n<=08h
    char* pclumi = &clumi; //ポインタの定義
    char crdata[3];
    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
    char cswdata; // 0x00 or 0x01
    char *pcswnum = &cswnum;
    char *pcswdata = &cswdata;
    char csyoudo[4];
    int i;
    float duty_pwm;


    for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
        leds[i].period_us(period_pwm); //Set tha PWM period(us)
    }


    duty_pwm = 0; //表示器立ち上がるまでLEDOFF

    for( i = 0; i <= 3; i++) {
        leds[i].write(duty_pwm);//Set Duty
    }


    i2c.frequency(100000); //gu_D I2Cクロックレート(HZ) 400khz以下

    cmd_gu[0]= 0x1B;
    cmd_gu[1]= 0x40;
    i2c.write(addr_gu, cmd_gu, 2); //gu-D ESC 初期化
    wait(0.2);

    //メモリ00h番地(GU_D輝度設定データ)読み出し
    wdata[0] = 0x00;
    Soushin = i2c.write (fixed_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte
    *pclumi = rdata[0];
    //輝度設定更新
    if(*pclumi==0x00 || *pclumi > 0x08) *pclumi=0x05;
    gu_luminance(pclumi);

    gu_fontsize(2); //change fontsize
    //ver1.2.3
    //gu_print1("ILF Iop/Voc/O.C.P/R");
    gu_print1("ILF mode selectiion");
    //upto
    //gu_CRLF();//CR+LF
    //gu_print1("Settings");
    gu_fontsize(1);
    gu_cursor(192,1);
    gu_print1("ver");
    gu_onebyte( version_major + 0x30 );
    gu_print1(".");
    gu_onebyte( version_minor + 0x30 );
    gu_print1(".");
    gu_onebyte( version_build + 0x30 );

    gu_touchPara(0,touch);//タッチ感度 00h~07h

    //MODE選択用ボタンの表示
    gu_set_button(9,"");
    gu_set_button(17,"");
    gu_set_button(25,"");
    gu_set_button(13,"");
    gu_set_button(21,"");
    gu_set_button(29,"");
    //LED Brighness
    gu_fontsize(2);
    gu_cursor(36,32/8);
    gu_print1("CAL");
    gu_cursor(36,64/8);
    gu_print1("LUX");
    //gu_cursor(36,80/8);
    //gu_print1("illumi");
    //Display Brightness
    gu_cursor(36,96/8);
    gu_print1("Utility");
    //Auto MODE
    gu_cursor(164,32/8);
    gu_print1("Auto");
    //Manual Mode
    gu_cursor(164,64/8);
    gu_print1("Manual");
    //Sequenser Mode
    gu_cursor(164,96/8);
    gu_print1("SEQ");

    /**********************
     SDカードファイルオープン
    **********************/

    mkdir("/sd/mydir", 0777);

    FILE *fp = fopen("/sd/mydir/iop.csv", "ab+");//ディレクトリとファイル名の指定

    if(fp == NULL) {
        /*ver1.1.3
        gu_fontsize(1);
        gu_cursor(0,2);
        gu_print1("Could not open file for SD card");
        */
    } else {
        fprintf(fp, "NewData  R IOP OCP VOC");
        fprintf(fp, "\n");
        fclose(fp);
    }
    /**********************
        LED照度初期設定
    **********************/
    read_syoudo( csyoudo );

    //gu-D タッチスイッチ読み出し動作設定 p49
    cmd_gu[0]= 0x1F;
    cmd_gu[1]= 0x4B;
    cmd_gu[2]= 0x18;
    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

    while(1) {
        //タッチスイッチ読み出し
        i2c.read ((addr_gu + 0x01), crdata, 3, true);

        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
            *pcswnum = crdata[1]; //スイッチ番号
            *pcswdata = crdata[2];//ON/OFF情報

            if (cswdata == 0x01) { //タッチしたならば
                switch( cswnum ) { //SWの番号(位置)

                    case 0x08 ://SW9 CAL登録画面
                        //gu_リバース指定
                        gu_reverse(0x01);
                        //Show Button
                        gu_set_button(9,"");
                        wait(0.1);
                        //gu_リバース解除
                        gu_reverse(0x00);

                        select_cal();//CAL選択画面へ移動

                        return;

                    case 0x10 ://SW17
                        //gu_リバース指定
                        gu_reverse(0x01);
                        //Show Button
                        gu_set_button(17,"");
                        wait(0.1);
                        //gu_リバース解除
                        gu_reverse(0x00);

                        adjust_illumination();//LED照度調整へ移動

                        return;

                    case 0x18 ://SW25
                        //gu_リバース指定
                        gu_reverse(0x01);
                        //Show Button
                        gu_set_button(25,"");
                        wait(0.1);
                        //gu_リバース解除
                        gu_reverse(0x00);

                        utility();//画面輝度調整へ移動

                        return;

                    case 0x0C ://SW13 自動測定モード
                        //gu_リバース指定
                        gu_reverse(0x01);
                        //Show Button
                        gu_set_button(13,"");
                        wait(0.1);
                        //gu_リバース解除
                        gu_reverse(0x00);

                        auto_run();

                        return;

                    case 0x14 ://SW21 手動測定モード
                        //gu_リバース指定
                        gu_reverse(0x01);
                        //Show Button
                        gu_set_button(21,"");
                        wait(0.1);
                        //gu_リバース解除
                        gu_reverse(0x00);

                        manual();

                        return;

                    case 0x1C ://SW29 シーケンサ制御モード
                        //gu_リバース指定
                        gu_reverse(0x01);
                        //Show Button
                        gu_set_button(29,"");
                        wait(0.1);
                        //gu_リバース解除
                        gu_reverse(0x00);

                        seq();

                        return;

                } //switch

            }//if(cswdata == 0x01) {
        } //if(crdata[0] == 0x11 ) {

        wait(0.1);//タッチスイッチ入力読み出し間隔

    } //while(1) {

}

/*********************************

    CAL選択画面 sub

*********************************/
void show_info(int n)
{
    short sdata[6];

    read_caliber(&calinfo,n);

    //読出したCAL情報の表示
    gu_fontsize(1);
    gu_cursor(0,2);
    gu_print1("No.");
    gu_putdec(&calinfo.number);
    gu_cursor(0,3);
    gu_print1("Vss(Iop) =");
    sdata[0] = -1 * calinfo.vss_iop;
    gu_putdeck(&sdata[0]);
    gu_print1("V ");
    gu_cursor(0,4);
    gu_print1("Vss(ocp) =");
    sdata[1] = -1 * calinfo.vss_ocp;
    gu_putdeck(&sdata[1]);
    gu_print1("V ");
    gu_cursor(0,5);
    gu_print1("Vss(Voc) =");
    sdata[2] = -1 * calinfo.vss_voc;
    gu_putdeck(&sdata[2]);
    gu_print1("V ");
}
/*********************************

    CAL選択画面 #CAL登録画面

*********************************/
void select_cal()
{
    char crdata[3];
    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
    char cswdata; // 0x00 or 0x01
    char *pcswnum = &cswnum;
    char *pcswdata = &cswdata;
    char calnum;    //選択したCALナンバー
    //short sdata[3]; //印加電圧表示用wr

    calnum = 0;//initial

    gu_cls();

    read_regnum();//EEPROMに保存した選択CAL_NO.の読み出し

    show_info(reg_num);

    /*
    read_caliber(&calinfo,reg_num);

    //読出したCAL情報の表示
    gu_fontsize(1);
    gu_cursor(0,2);
    gu_print1("No.");
    gu_putdec(&calinfo.number);
    gu_cursor(0,3);
    gu_print1("Vss(Iop) =");
    sdata[0] = -1 * calinfo.vss_iop;
    gu_putdeck(&sdata[0]);
    gu_print1("V ");
    gu_cursor(0,4);
    gu_print1("Vss(ocp) =");
    sdata[1] = -1 * calinfo.vss_ocp;
    gu_putdeck(&sdata[1]);
    gu_print1("V ");
    gu_cursor(0,5);
    gu_print1("Vss(Voc) =");
    sdata[2] = -1 * calinfo.vss_voc;
    gu_putdeck(&sdata[2]);
    gu_print1("V ");
    */

    gu_fontsize(2); //change fontsize
    gu_cursor(0,0);
    gu_print1("Select CAL.");
    //Set Button
    gu_set_button(17,"1");
    gu_set_button(19,"2");
    gu_set_button(21,"3");
    gu_set_button(25,"4");
    gu_set_button(27,"5");
    gu_set_button(29,"6");
    gu_set_button_font1(7,"slct");
    gu_set_button_font1(8,"reg");
    //gu_set_button_font1(32,"del"); //ver1.1.0


    while(1) {
        //タッチスイッチ読み出し
        i2c.read ((addr_gu + 0x01), crdata, 3, true);

        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
            *pcswnum = crdata[1]; //スイッチ番号
            *pcswdata = crdata[2];//ON/OFF情報

            if (cswdata == 0x01) { //タッチしたならば
                switch( cswnum ) { //SWの番号(位置)

                    case 0x10:  //SW17

                        gu_reverse(0x01);   //gu_リバース指定
                        gu_set_button(17,"1");
                        gu_reverse(0x00);   //gu_リバース解除
                        gu_set_button(19,"2");
                        gu_set_button(21,"3");
                        gu_set_button(25,"4");
                        gu_set_button(27,"5");
                        gu_set_button(29,"6");

                        calnum = 1;

                        show_info(calnum);

                        break;

                    case 0x12:  //SW19

                        gu_reverse(0x01);   //gu_リバース指定
                        gu_set_button(19,"2");
                        gu_reverse(0x00);   //gu_リバース解除
                        gu_set_button(17,"1");
                        gu_set_button(21,"3");
                        gu_set_button(25,"4");
                        gu_set_button(27,"5");
                        gu_set_button(29,"6");

                        calnum = 2;

                        show_info(calnum);

                        break;

                    case 0x14:  //SW21

                        gu_reverse(0x01);   //gu_リバース指定
                        gu_set_button(21,"3");
                        gu_reverse(0x00);   //gu_リバース解除
                        gu_set_button(17,"1");
                        gu_set_button(19,"2");
                        //gu_set_button(21,"3");
                        gu_set_button(25,"4");
                        gu_set_button(27,"5");
                        gu_set_button(29,"6");

                        calnum = 3;

                        show_info(calnum);

                        break;

                    case 0x18:  //SW25

                        gu_reverse(0x01);   //gu_リバース指定
                        gu_set_button(25,"4");
                        gu_reverse(0x00);   //gu_リバース解除
                        gu_set_button(17,"1");
                        gu_set_button(19,"2");
                        gu_set_button(21,"3");
                        //gu_set_button(25,"4");
                        gu_set_button(27,"5");
                        gu_set_button(29,"6");

                        calnum = 4;

                        show_info(calnum);

                        break;

                    case 0x1A:  //SW27

                        gu_reverse(0x01);   //gu_リバース指定
                        gu_set_button(27,"5");
                        gu_reverse(0x00);   //gu_リバース解除
                        gu_set_button(17,"1");
                        gu_set_button(19,"2");
                        gu_set_button(21,"3");
                        gu_set_button(25,"4");
                        //gu_set_button(27,"5");
                        gu_set_button(29,"6");

                        calnum = 5;

                        show_info(calnum);

                        break;

                    case 0x1C:  //SW29

                        gu_reverse(0x01);   //gu_リバース指定
                        gu_set_button(29,"6");
                        gu_reverse(0x00);   //gu_リバース解除
                        gu_set_button(17,"1");
                        gu_set_button(19,"2");
                        gu_set_button(21,"3");
                        gu_set_button(25,"4");
                        gu_set_button(27,"5");
                        //gu_set_button(29,"6");

                        calnum = 6;

                        show_info(calnum);

                        break;

                    case 0x06:  //SW7 CAL選択ボタン

                        if ( calnum >= 1 && calnum <=6 ) {
                            reg_num = calnum;

                            //EEPROM書込み
                            wdata[0] = addr_calnum;    //word address 書込み先頭アドレス指定
                            wdata[1] = reg_num;
                            Soushin = i2c.write (fixed_adrs, wdata, 2);

                            gu_reverse(0x01);   //gu_リバース指定
                            gu_set_button_font1(7,"slct");
                            wait(0.2);
                            gu_reverse(0x00);   //gu_リバース解除

                            read_caliber(&calinfo,reg_num);
                            return;

                        } else if( calnum == 0 ) {
                            //CALNo.選択しなければ、何もしないでこのサブを抜ける
                            gu_reverse(0x01);   //gu_リバース指定
                            gu_set_button_font1(7,"slct");
                            wait(0.2);
                            gu_reverse(0x00);   //gu_リバース解除
                            return;
                        }

                        break;

                    case 0x07:  //SW8

                        if ( calnum >= 1 && calnum <= 6 ) {
                            gu_reverse(0x01);   //gu_リバース指定
                            gu_set_button_font1(8,"reg");
                            wait(0.2);
                            gu_reverse(0x00);   //gu_リバース解除

                            setup_cal_information(calnum);//CAL情報登録画面へ
                            return;
                        }
                        break;

                        /*ver1.1.0
                        case 0x1F:  //SW32

                            gu_reverse(0x01);   //gu_リバース指定
                            gu_set_button_font1(32,"del");
                            gu_reverse(0x00);   //gu_リバース解除

                            erace_calinfo();

                            gu_set_button_font1(32,"del");

                            break;
                        */

                } //switch

            }//if(cswdata == 0x01) {
        } //if(crdata[0] == 0x11 ) {
        wait(0.1);//タッチスイッチ入力読み出し間隔
    } //while(1)
}

/*********************************

    CAL情報登録画面 サブルーチン
    表示パラメータ
    x=0 : vss_iop[V]
    x=1 : vss_ocp[V]
    x=2 : vss_voc[V]
    x=3 : low_limit_voc[V]
    x=4 : low_limit_iop[uA]
    x=5 : low_limit_ocp[uA]
    x=6 : wait_iop[s]
    x=7 : wait_ocp[s]
    x=8 : low_limit_resistor[Ω]
    x=9 : up_limit_resistor[Ω]

    ver1.2.2
    up_limit_ocp[]の追加と
    順序の入替え

    x=6 : up_limit_ocp[]
    x=7 : wait_iop[s]
    x=8 : wait_ocp[s]
    x=9 : low_limit_resistor[Ω]
    x=10 : up_limit_resistor[Ω]

*********************************/
void hyouji_cal_param(char x)
{
    gu_fontsize(2);
    gu_cursor(0,4);
    gu_print1("                                ");

    switch ( x ) {
        case 0:
            gu_cursor(0,4);
            gu_print1("Vss(Iop)");
            gu_cursor(208,4);
            gu_print1("[V]");
            break;
        case 1:
            gu_cursor(0,4);
            gu_print1("Vss(O.C.P)");
            gu_cursor(208,4);
            gu_print1("[V]");
            break;
        case 2:
            gu_cursor(0,4);
            gu_print1("Vss(Voc)");
            gu_cursor(208,4);
            gu_print1("[V]");
            break;
        case 3:
            gu_cursor(0,4);
            gu_print1("low limit(Voc)");
            gu_cursor(208,4);
            gu_print1("[V]");
            break;
        case 4:
            gu_cursor(0,4);
            gu_print1("low limit(Iop)");
            gu_cursor(208,4);
            gu_print1("[uA]");
            break;
        case 5:
            gu_cursor(0,4);
            gu_print1("low limit(O.C.P)");
            gu_cursor(208,4);
            gu_print1("[uA]");
            break;
        //ver1.2.2
        case 6:
            gu_cursor(0,4);
            gu_print1("up limit(O.C.P)");
            gu_cursor(208,4);
            gu_print1("[uA]");
            break;
        case 7:
            gu_cursor(0,4);
            gu_print1("Wait(Iop)");
            gu_cursor(208,4);
            gu_print1("[s]");
            break;
        case 8:
            gu_cursor(0,4);
            gu_print1("Wait(O.C.P)");
            gu_cursor(208,4);
            gu_print1("[s]");
            break;
        case 9:
            gu_cursor(0,4);
            gu_print1("low limit(ohm)");
            gu_cursor(208,4);
            wdata[0] = 0xEA; //Ω
            i2c.write( addr_gu, wdata, 1);
            break;
        case 10:
            gu_cursor(0,4);
            gu_print1("up limit(ohm)");
            gu_cursor(208,4);
            wdata[0] = 0xEA; //Ω
            i2c.write( addr_gu, wdata, 1);
            break;
            //ver1.2.2 up to here

    }
}

/*********************************

    CAL情報登録画面 sub
    para    kind of parameter
    idata   data value
    inc     add number  ex)0x64 0x0A 0x01

*********************************/
void increase_param(char para, signed short *sdata, short inc)
{
    switch ( para ) { //パラメータの項目によって上限値異なる
        case 0://vss_iop
        case 1://vss_ocp
        case 2://vss_voc
        case 3://low_limit_voc
            if(*sdata <= ( 4999 - inc )) {
                *sdata = *sdata + inc ;
            }
            break;//switch ( param ){

        case 4://low_limit_iop
        case 5://low_limit_o.c.p
            if(*sdata <= ( 2500 - inc / 10 )) {
                *sdata = *sdata + inc /10 ;
            }
            break;//switch ( param )
        case 7://wait_iop
        case 8://wait_ocp

            if(*sdata <= ( 2550 - inc / 10 )) {
                *sdata = *sdata + inc / 10 ;
            }
            break;//switch ( param )

        case 9:
        case 10:
            if(*sdata <= ( 2550 - inc )) {
                *sdata = *sdata + inc;
            }
            break;

        //ver1.2.2
        case 6://up_limit_o.c.p
            if(*sdata <= ( 2500 - inc / 10 )) {
                *sdata = *sdata + inc /10 ;
            }
            break;//switch ( param )
            //ver1.2.1 up to here

    }//switch ( param ){
}

void decrease_param(char para, signed short *sdata, short dec)
{
    switch ( para ) { //パラメータの項目によって上限値異なる
        case 0://vss_iop
        case 1://vss_ocp
        case 2://vss_voc
        case 3://low_limit_voc

            if(*sdata >= dec ) {
                *sdata = *sdata - dec;
            }
            break;

        case 4://low_limit_iop

            if(*sdata >= dec / 10 ) {
                *sdata = *sdata - dec / 10;
            }
            break;

        case 5://low_limit_o.c.p

            if(*sdata >= -2500 + dec / 10 ) {
                *sdata = *sdata - dec / 10;
            }
            break;

        case 7://wait_iop
        case 8://wait_ocp

            if(*sdata >= dec / 10 ) {
                *sdata = *sdata - dec / 10 ;
            }
            break;//switch ( param )

        case 9:
        case 10:
            if(*sdata >= dec ) {
                *sdata = *sdata - dec;
            }
            break;

        //ver1.2.1
        case 6://up_limit_o.c.p

            if(*sdata >= -2500 + dec / 10 ) {
                *sdata = *sdata - dec / 10;
            }
            break;
            //ver1.2.1 ここまで

    }//switch ( param ){
}
/*********************************

    CAL情報登録画面   MAIN
    別途システム設計図,EEPROMのシートを参照
    param:
        0:vss_iop
        1:vss_ocp
        2:vss_voc
        3:low_limit_voc
        4:low_limit_iop
        5:low_limit_ocp
        6:up_limit_ocp ver1.2.2
        7:wait_iop
        8:wait_ocp
        9:LowLimitResistor
        10:UPLimitResistor

*********************************/
void setup_cal_information(char cal_num)   //xは登録ナンバー=EEPROMのPAGEナンバーex)登録No.1→BLOCK0x00 PAGE0x00
{
    char            param;              //設定するパラメータの選択 0~9まで ver1.2.1 0~10まで
    char            crdata[3];
    signed short    sdata_cal[16];      //CAL設定条件
    signed short    hyouji_data;
    int             param_sum;            //設定するパラメータの数 ver1.2.1
    //int i;
    //short           sdata_byte[16];     //EEPROM BYTEごとのDATA 1byte
    //char          cmd_gu[32];         //gu-DへのI2Cコマンド用配列 1byte0
    //char            adrs_cal;           //EEPROM CAL情報を保存しているアドレス 0x90~

    param_sum = 11; //ver1.2.1

    //画面表示
    gu_cls();//画面のクリア
    gu_fontsize(2);
    gu_print1("Setup Cal No.");
    wdata[0] = ( cal_num % 10 ) + 0x30;//CALナンバーの表示
    i2c.write(addr_gu, wdata, 1);

    //CAL情報読込
    read_caliber(&calinfo,cal_num);

    sdata_cal[0] = calinfo.vss_iop;
    sdata_cal[1] = calinfo.vss_ocp;
    sdata_cal[2] = calinfo.vss_voc;
    sdata_cal[3] = calinfo.low_limit_voc;
    sdata_cal[4] = calinfo.low_limit_iop;
    sdata_cal[5] = calinfo.low_limit_ocp;
    //ver1.2.2
    sdata_cal[6] = calinfo.up_limit_ocp;
    sdata_cal[7] = calinfo.wait_iop;
    sdata_cal[8] = calinfo.wait_ocp;
    sdata_cal[9] = calinfo.low_limit_resistor;
    sdata_cal[10] = calinfo.up_limit_resistor;
    /*
    sdata_cal[6] = calinfo.wait_iop;
    sdata_cal[7] = calinfo.wait_ocp;
    sdata_cal[8] = calinfo.low_limit_resistor;
    sdata_cal[9] = calinfo.up_limit_resistor;
    */
    //ver1.2.2 up to here

    //ボタンの配置
    gu_set_button_font1(8,"reg");
    gu_button_up(17);
    gu_button_down(25);

    gu_button_up(20);
    gu_button_up(22);
    gu_button_up(24);
    gu_button_down(28);
    gu_button_down(30);
    gu_button_down(32);

    /*
    gu_button_up(21);
    gu_button_up(22);
    gu_button_up(23);
    gu_button_down(29);
    gu_button_down(30);
    gu_button_down(31);
    */

    //初期表示はVss_Iop
    param = 0;
    gu_cursor(0,4);
    gu_fontsize(2);
    gu_print1("Vss(Iop)");
    gu_cursor(208,4);
    gu_print1("V");

    while(1) {
        i2c.read ((addr_gu + 0x01), crdata, 3, true);

        if (crdata[0] == 0x11 && crdata[2] == 0x01 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。&& タッチしたならば
            //cswnum = crdata[1]; //スイッチ番号
            //cswdata = crdata[2];//ON/OFF情報

            switch( crdata[1] ) { //SWの番号(位置)

                /* ver1.2.1
                case 0x10 ://sw17 パラメータ変更スイッチ(上)

                    if ( param <= 8 ) {
                        param = param + 1;
                    } else {
                        param = 0;
                    }

                    hyouji_cal_param(param);//設定パラメータ表示
                    break;

                case 0x18 ://sw25 パラメータ変更スイッチ(下)

                    if ( param >= 1 ) {
                        param = param - 1;
                    } else {
                        param = 9;
                    }

                    hyouji_cal_param(param);//設定パラメータ表示
                    break;
                */

                case 0x10 ://sw17 パラメータ変更スイッチ(上)

                    if ( param <= param_sum -2 ) {
                        param = param + 1;
                    } else {
                        param = 0;
                    }

                    hyouji_cal_param(param);//設定パラメータ表示
                    break;

                case 0x18 ://sw25 パラメータ変更スイッチ(下)

                    if ( param >= 1 ) {
                        param = param - 1;
                    } else {
                        param = param_sum - 1;
                    }

                    hyouji_cal_param(param);//設定パラメータ表示
                    break;

                //ver1.2.1 up to here

                case 19 ://SW20 increase 0x3E8

                    increase_param(param, &sdata_cal[param], 1000);
                    break;

                case 27 ://SW28 decrease 0x3E8

                    decrease_param(param, &sdata_cal[param], 1000);
                    break;

                case 0x15 ://SW22 increase 0x64

                    increase_param(param, &sdata_cal[param], 100);
                    break;

                case 0x1D ://SW30 decrease 0x64

                    decrease_param(param, &sdata_cal[param], 100);
                    break;

                case 23 ://SW24 increase 0x0A

                    increase_param(param, &sdata_cal[param], 10);
                    break;

                case 31 ://SW32 decrease 0x0A

                    decrease_param(param, &sdata_cal[param], 10);
                    break;


                case 0x07 ://保存ボタン

                    calinfo.vss_iop = sdata_cal[0];
                    calinfo.vss_ocp = sdata_cal[1];
                    calinfo.vss_voc = sdata_cal[2];
                    calinfo.low_limit_voc = sdata_cal[3];
                    calinfo.low_limit_iop = sdata_cal[4];
                    calinfo.low_limit_ocp = sdata_cal[5];
                    //ver1.2.2
                    calinfo.up_limit_ocp = sdata_cal[6];
                    calinfo.wait_iop = sdata_cal[7];
                    calinfo.wait_ocp = sdata_cal[8];
                    calinfo.low_limit_resistor = sdata_cal[9];
                    calinfo.up_limit_resistor = sdata_cal[10];
                    /*
                    calinfo.wait_iop = sdata_cal[6];
                    calinfo.wait_ocp = sdata_cal[7];
                    calinfo.low_limit_resistor = sdata_cal[8];
                    calinfo.up_limit_resistor = sdata_cal[9];
                    */
                    //ver1.2.2 up to here

                    reg_num = cal_num;

                    //CALNO.EEPROM書込み
                    wdata[0] = addr_calnum;    //word address 書込み先頭アドレス指定
                    wdata[1] = reg_num;
                    Soushin = i2c.write (fixed_adrs, wdata, 2);

                    wait(0.2);

                    //CAL情報
                    //送信完了ならば実行
                    if(Soushin == 0) {

                        write_caliber_information(&calinfo, cal_num);

                        //ver1.2.3
                    } else {
                        gu_fontsize(1);
                        gu_cursor(0,2);
                        gu_print1("can not save cal no");
                        wait(2);
                        return;
                    }

                    //送信完了ならば実行
                    if(Soushin == 0) {
                        gu_reverse(1);
                        gu_set_button_font1(8,"reg");
                        wait(0.2);
                        return;//CAL情報登録画面を抜ける

                        //ver1.2.3
                    } else {
                        gu_fontsize(1);
                        gu_cursor(0,2);
                        gu_print1("can not save cal information");
                        wait(2);
                        return;
                    }

                    //break;

            } //switch
        } //if
        //gu-D表示
        gu_cursor(150,4);

        switch ( param ) {
            case 0://vss_iop
            case 1://vss_ocp
            case 2://vss_voc
            case 3://low_limit_voc
                hyouji_data = sdata_cal[param] * -1;
                gu_putdeck ( &hyouji_data );
                break;
            case 4:
            case 5:
                hyouji_data = sdata_cal[param] * 10;
                gu_putdeck ( &hyouji_data );
                break;
            //ver1.2.2
            case 6:
                hyouji_data = sdata_cal[param] * 10;
                gu_putdeck ( &hyouji_data );
                break;
            case 7:
            case 8:
                //ver1.1.0
                hyouji_data = sdata_cal[param];
                gu_putdec ( &hyouji_data );
                break;
            case 9://low_limit_resistor
            case 10://up_limit_resistor
                hyouji_data = sdata_cal[param];
                gu_putdec ( &hyouji_data );
                break;
                /*
                case 6:
                case 7:
                    //ver1.1.0
                    hyouji_data = sdata_cal[param];
                    gu_putdec ( &hyouji_data );
                    break;
                case 8://low_limit_resistor
                case 9://up_limit_resistor
                    hyouji_data = sdata_cal[param];
                    gu_putdec ( &hyouji_data );
                    break;
                */
                //ver1.2.2 uptohere

        }
        wait(0.1);//gu-D 読込間隔の設定
    }//while
}

/*********************************

    Auto Mode (sub)
    自動測定モード 初期画面

*********************************/
void auto_int_hyouji()
{
    //short st;
    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte

    gu_cls();
    gu_fontsize(1);
    gu_print1("AUTO MODE CAL No.");
    cmd_gu[0] = reg_num + 0x30;
    i2c.write(addr_gu, cmd_gu, 1);
    gu_Button_power_on();//show button

}
/*******************************************************

    Auto Mode (Main)
    自動測定モード 画面
    ver1.04 パネルタッチ -> スタートスイッチで測定開始へ変更

*******************************************************/
void auto_run()
{
    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte
    char crdata[6];
    //char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
    //int     i;
    //float   fdata[4][4];//ファイル出力用
    //short   sdata[4];
    //short   s;

    read_regnum();//CAL登録No.読込
    read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入

    auto_int_hyouji();

    //dac_init(); //DAC 初期化

    //gu-D タッチスイッチ読み出し動作設定 p49
    cmd_gu[0]= 0x1F;
    cmd_gu[1]= 0x4B;
    cmd_gu[2]= 0x18;
    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

    wait(0.1);

    Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);

    while(1) {

        //スタートスイッチで測定開始
        if ( sw_start == 0 ) {
            meas_sub();
        }

        wait(0.1);

        crdata[0] = 0;
        crdata[1] = 0;
        crdata[2] = 0;

        i2c.read ((addr_gu + 0x01), crdata, 3, true);

        if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。

            //cswnum = crdata[1]; //スイッチ番号
            //cswdata = crdata[2];//ON/OFF情報

            //gu-D タッチスイッチ読み出し動作設定 p49
            cmd_gu[0]= 0x1F;
            cmd_gu[1]= 0x4B;
            cmd_gu[2]= 0x18;
            cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除
            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

            if ( crdata[1] == 7 ) {

                gu_Button_power_off();//電源ボタンイメージ反転表示
                wait(0.5);

                led_off();//LED全消灯

                return;//この関数を抜ける

            }   //end if

            /* ver 1.1.1 タッチパネルで測定開始を削除
            else {

                meas_sub();//測定用サブ


            } //else if
            */

            //gu-D タッチスイッチ読み出し動作設定 p49
            cmd_gu[0]= 0x1F;
            cmd_gu[1]= 0x4B;
            cmd_gu[2]= 0x18;
            cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除
            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

            wait(0.1);

            i2c.read ((addr_gu + 0x01), crdata, 3, true);

        }//if
        wait(0.1);
    }//While
}

/*
    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte
    char crdata[6];
    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
    //int     i;
    //float   fdata[4][4];//ファイル出力用
    //short   sdata[4];
    //short   s;

    read_regnum();//CAL登録No.読込
    read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入

    auto_int_hyouji();

    //dac_init(); //DAC 初期化

    //gu-D タッチスイッチ読み出し動作設定 p49
    cmd_gu[0]= 0x1F;
    cmd_gu[1]= 0x4B;
    cmd_gu[2]= 0x18;
    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

    wait(0.1);

    Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);

    while(1) {

        wait(0.1);

        crdata[0] = 0;
        crdata[1] = 0;
        crdata[2] = 0;

        i2c.read ((addr_gu + 0x01), crdata, 3, true);

        if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
            cswnum = crdata[1]; //スイッチ番号
            //cswdata = crdata[2];//ON/OFF情報

            //gu-D タッチスイッチ読み出し動作設定 p49
            cmd_gu[0]= 0x1F;
            cmd_gu[1]= 0x4B;
            cmd_gu[2]= 0x18;
            cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除
            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

            //SWの番号(位置)
            if ( cswnum == 7 ) {

                gu_Button_power_off();//電源ボタンイメージ反転表示
                wait(0.5);

                led_off();//LED全消灯

                return;//この関数を抜ける

            }

            //gu-D タッチスイッチ読み出し動作設定 p49
            cmd_gu[0]= 0x1F;
            cmd_gu[1]= 0x4B;
            cmd_gu[2]= 0x18;
            cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除
            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

            wait(0.1);

            i2c.read ((addr_gu + 0x01), crdata, 3, true);

        } else if ( sw_start == 0 ) { //if

            auto_int_hyouji();

            gu_cursor(0,2);
            gu_print1("Please Wait..");
            gu_fontsize(2);

            read_regnum();//CAL登録No.読込

            read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入

            auto_meas( number_of_channels );//2個測定

            hantei( number_of_channels );//判定LED

            wait(0.5);

            gu_fontsize(1);
            gu_cursor(0,2);
            gu_print1("READY           ");

        }
        wait(0.1);
    }//While
}
*/

/*
void auto_run()
{
    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte
    char crdata[6];
    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
    //int     i;
    //float   fdata[4][4];//ファイル出力用
    //short   sdata[4];
    //short   s;

    read_regnum();//CAL登録No.読込
    read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入

    auto_int_hyouji();

    //dac_init(); //DAC 初期化

    //gu-D タッチスイッチ読み出し動作設定 p49
    cmd_gu[0]= 0x1F;
    cmd_gu[1]= 0x4B;
    cmd_gu[2]= 0x18;
    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

    wait(0.1);

    Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);

    while(1) {

        wait(0.1);

        crdata[0] = 0;
        crdata[1] = 0;
        crdata[2] = 0;

        i2c.read ((addr_gu + 0x01), crdata, 3, true);

        if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
            cswnum = crdata[1]; //スイッチ番号
            //cswdata = crdata[2];//ON/OFF情報

            //gu-D タッチスイッチ読み出し動作設定 p49
            cmd_gu[0]= 0x1F;
            cmd_gu[1]= 0x4B;
            cmd_gu[2]= 0x18;
            cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除
            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

            //SWの番号(位置)
            if ( cswnum == 7 ) {

                gu_Button_power_off();//電源ボタンイメージ反転表示
                wait(0.5);

                led_off();//LED全消灯

                return;//この関数を抜ける

            } else {

                auto_int_hyouji();

                gu_cursor(0,2);
                gu_print1("Please Wait..");
                gu_fontsize(2);

                read_regnum();//CAL登録No.読込

                read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入

                auto_meas( number_of_channels );//2個測定

                hantei( number_of_channels );//判定LED

                wait(0.5);

                gu_fontsize(1);
                gu_cursor(0,2);
                gu_print1("READY           ");

            } //else if

            //gu-D タッチスイッチ読み出し動作設定 p49
            cmd_gu[0]= 0x1F;
            cmd_gu[1]= 0x4B;
            cmd_gu[2]= 0x18;
            cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除
            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

            wait(0.1);

            i2c.read ((addr_gu + 0x01), crdata, 3, true);

        }//if

        wait(0.1);

    }//While

}
*/

/*********************************

    Auto Mode (Sub)

*********************************/
void meas_sub()
{
    auto_int_hyouji();

    gu_cursor(0,2);
    gu_print1("Please Wait..");
    gu_fontsize(2);

    read_regnum();//CAL登録No.読込

    read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入

    auto_meas( number_of_channels );//2個測定

    hantei( number_of_channels );//判定LED

    wait(0.5);

    gu_fontsize(1);
    gu_cursor(0,2);
    gu_print1("READY           ");

}

/*********************************

    Auto Mode/SEQ Mode (sub)
    自動測定
    char noc -> 総測定数 1~4

*********************************/
void auto_meas(char noc)
{
    int     x[4] = {0,0,128,128};   //GU_D x座標 4個測定時の表示スタート位置
    int     y[4] = {5,11,5,11};     //GU_D y座標 4個測定時の表示スタート位置
    int     iy  ;                   //GU_D y座標 2個測定時の表示スタート位置
    int     i;
    float   fdata[4][4];//ファイル出力用
    short   sdata[4];

    iy = 4;//GU_D 2個測定時の測定値の表示開始位置 y座標

    if ( noc > 4 ) {
        noc = 4;
    }

    //値の初期化
    for ( i = 0; i <= 3; i++) {
        I[i] = 0;
        R[i] = 0;   //ver 1.1.1
        iop[i] = 0;
        voc[i] = 0;
        ocp[i] = 0;
    }

    //判定用LED消灯
    led_off();

    //電源投入
    for ( i = 0; i <= ( noc - 1 ); i++) {
        dac_out( calinfo.vss_iop,i); //Vss設定 DAC_A~D
    }

    wait( wait_poweron );//パワーブレイク復帰待機?

    //Reset CAL
    for ( i = 0; i <= ( noc -1 ); i++) {
        io[i] = 1; //io1 = "H"
    }

    wait(time_reset); //ver1.1.3
    //wait(0.2);

    for ( i = 0; i <= ( noc -1 ); i++) {
        io[i] = 0; //io1 = "L"
    }

    //抵抗測定
    for ( i = 0; i <= ( noc -1 ); i++ ) {
        R[i] = meas_resistor(i);
    }

    //display GU_D
    if ( number_of_channels <= 2 ) { //2個測定の時の表示
        gu_fontsize(2);
        gu_cursor(0,iy);
        gu_print1("[ch.1]");
        gu_cursor(128,iy);
        gu_print1("[ch.2]");
        //CH.1 表示
        gu_cursor(0, iy + 2);
        gu_print1("R     ");
        display_resistor( R[0] );
        //CH.2 表示
        gu_cursor(128, iy + 2);
        gu_print("R     ");
        display_resistor( R[1] );
    } else if( number_of_channels >= 3) { //3.4個測定の時の表示
        gu_fontsize(1);
        gu_cursor(x[0],y[0]);
        gu_print1("ch.1");
        gu_cursor(x[1],y[1] );
        gu_print1("ch.2");
        gu_cursor(x[2],y[2]);
        gu_print1("ch.3");

        if ( number_of_channels == 4 ) {
            gu_cursor(x[3],y[3]);
            gu_print1("ch.4");
        }

        //CH.1~4 表示
        for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
            gu_cursor( x[i], y[i] + 1 );//x座標指定
            gu_print1("R      ");
            display_resistor( R[i] );
        }
    }

    //iop測定
    wait(calinfo.wait_iop);//Vss印加~リセット後からiop測定までの待機時間

    meas_current_automode( noc );//電流測定サブ 測定値をI[]へ代入

    for( i = 0; i <= ( noc - 1) ; i++) {
        iop[i] = I[i];
    }

    //display GU_D
    if ( number_of_channels <= 2 ) { //2個測定の時の表示
        gu_cursor(0, iy + 4 );//IOP測定値表示位置指定
        gu_print1("Iop   ");
        gu_putdeci(&iop[0]);
        gu_cursor(128, iy + 4 );
        gu_print1("Iop   ");
        gu_putdeci(&iop[1]);
    } else {
        //CH.1~4 表示
        for ( i=0; i <= ( number_of_channels - 1 ); i++) {
            gu_cursor( x[i], y[i] + 2 ); //x座標指定
            gu_print1("Iop   ");
            gu_putdeci(&iop[i]);
        }
    }

    wait(0.01);

    //過充電防止時電流測定
    for ( i = 0; i <= ( noc - 1 ); i++) {
        dac_out( calinfo.vss_ocp,i); //Vss設定 DAC_A~D //ver1.1.2
    }

    wait( calinfo.wait_ocp );

    meas_current_automode( noc );

    for( i = 0; i <= ( noc - 1) ; i++) {
        ocp[i] = I[i];
    }

    //display GU_D
    if ( number_of_channels <= 2 ) { //2個測定の時の表示
        gu_cursor(0, iy + 6 );//IOP測定値表示位置指定
        gu_print1("OCP   ");
        gu_putdeci(&ocp[0]);
        gu_cursor(128, iy + 6 );
        gu_print1("OCP   ");
        gu_putdeci(&ocp[1]);
    } else {
        //CH.1~4 表示
        for ( i=0; i <= ( number_of_channels - 1 ); i++) {
            gu_cursor( x[i], y[i] + 3 ); //x座標指定
            gu_print1("OCP   ");
            gu_putdeci(&ocp[i]);
        }
    }

    //VOC測定
    for ( i = 0; i <= ( noc - 1 ); i++) {
        dac_out( calinfo.vss_voc,i); //Vss設定 DAC_A~D
    }

    wait( wait_voc );

    for ( i = 0; i <= ( noc -1 ); i++) {
        io[i] = 1; //io1 = "H"
    }

    wait( wait_reset );

    for ( i = 0; i <= ( noc -1 ); i++ ) {

        //ver1.2.0
        if (RL_EN == 1) {
            switch (i) {
                case 0:
                    io[4] = 1; //外付けリレーON
                    wait(TIME_RELAY_ON);
                case 1:
                    io[5] = 1; //外付けリレーON
                    wait(TIME_RELAY_ON);
            }
        }
        //up to here ver1.2.0

        voc[i] = meas_voltage(i);
        sdata[i] = voc[i] * -1;

        //ver1.2.0
        if (RL_EN == 1) {
            io[4] = 0; //外付けリレーOFF
            io[5] = 0; //外付けリレーOFF
            wait(TIME_RELAY_OFF);
        }
        //up to here
    }


    //display GU_D
    if ( number_of_channels <= 2 ) { //2個測定の時の表示
        gu_cursor(0, iy + 8 );//IOP測定値表示位置指定
        gu_print1("Voc   ");
        gu_putdeck(&sdata[0]);
        gu_print1("V");
        gu_cursor(128, iy + 8 );
        gu_print1("Voc   ");
        gu_putdeck(&sdata[1]);
        gu_print1("V");
    } else {
        //CH.1~4 表示
        for ( i=0; i <= ( number_of_channels - 1 ); i++) {
            gu_cursor( x[i], y[i] + 4 );//x座標指定
            gu_print1("Voc   ");
            gu_putdeck(&sdata[i]);
            gu_print1("V");
        }
    }

    //R = "L"
    for ( i = 0; i <= ( noc -1 ); i++) {
        io[i] = 0; //io1 = "L"
    }

    wait(0.1);

    //Vss=0V
    for ( i = 0; i <= ( noc - 1 ); i++) {
        dac_out( 0, i );//Vss設定 DAC_A~D
    }

    //ファイルオープン
    mkdir("/sd/mydir", 0777);

    FILE *fp = fopen("/sd/mydir/iop.csv", "ab+");//ディレクトリとファイル名の指定,追加モード

    if(fp == NULL) {
        /* ver1.1.3
        gu_fontsize(1);
        gu_cursor(0,2);
        gu_print1("Could not open file for SD card");
        */
    } else {
        for ( i = 0; i <= ( noc - 1 ); i++) {
            fdata[i][0] = iop[i] * 0.01;    //1bitあたり0.01uA
            fdata[i][1] = ocp[i] * 0.01;    //1bitあたり0.01uA
            fdata[i][2] = voc[i] * 0.001;   //1bitあたり0.001V
        }

        for( i = 0; i <= ( noc - 1 ); i++) {

            switch ( i ) {
                case 0:
                    fprintf(fp, "CH.1");
                    break;
                case 1:
                    fprintf(fp, "CH.2");
                    break;
                case 2:
                    fprintf(fp, "CH.3");
                    break;
                case 3:
                    fprintf(fp, "CH.4");
                    break;
            }

            fprintf(fp, " ");//excel 区切り位置
            if ( R[i] < res_vref && R[0] >= 0 ) {
                fprintf(fp, "%d", R[i]);
            } else {
                fprintf(fp,"OL");
            }
            fprintf(fp, " ");
            fprintf(fp, "%f", fdata[i][0]);
            fprintf(fp, " ");
            fprintf(fp, "%f", fdata[i][1]);
            fprintf(fp, " ");
            fprintf(fp, "%f", fdata[i][2]);
            fprintf(fp, " ");
        }//for

        //ファイルクローズ
        fprintf(fp, "\n");
        fclose(fp);
    }

}

/*********************************

    電流測定(iop/voc共通)
    char amount;//測定数

*********************************/
void meas_current_automode(char amount)   //a quantity of measuring channel
{
    int i;

    //amount = number_of_channels;

    //set range
    for ( i = 0; i <= ( amount - 1 ); i++)
        range[i] = 1;   //range 10uA

    wait(0.1);

    //discharge condenser
    for ( i = 0; i <= ( amount - 1 ); i++)
        houden[i] = 1;  //discharge condenser

    wait(time_discharge);//discharge time

    ch_num = 0;
    select_ich( ch_num ); //select channel that mesuring current
    houden[0] = 0; //start integral

    oneshot1.attach ( &flip_ch1, time_integral );

    if ( amount >= 2 ) {
        wait(0.1);
        houden[1] = 0;
        oneshot2.attach ( &flip_ch2, time_integral );
    }

    if ( amount >= 3 ) {
        wait(0.1);
        houden[2] = 0;
        oneshot3.attach ( &flip_ch3, time_integral );
    }

    if ( amount == 4 ) {
        wait(0.1);
        houden[3] = 0;
        oneshot4.attach ( &flip_ch4, time_integral );
    }

    wait( time_integral + 0.3 );//wait Timeout

    //discharge condenser
    for ( i = 0; i <= ( amount - 1 ); i++)
        houden[i] = 1;  //discharge condenser

    wait(time_discharge);//discharge time

    //not discharge condenser
    for ( i = 0; i <= ( amount - 1 ); i++)
        houden[i] = 0;

    //set range
    for ( i = 0; i <= ( amount - 1 ); i++)
        range[i] = 0;  //range 1mA

    oneshot1.detach();
    oneshot2.detach();
    oneshot3.detach();
    oneshot4.detach();

}

/*********************************
    DAC 初期設定
    LDACレジスタの設定
    内部リファレンス電圧のセットアップ
    入力シフトレジスタ:
    0011 1000 0000 0000 0000 0001
    (0x3F0001)
*********************************/
void dac_init()
{

    //内部リファレンス電圧のセットアップ
    wdata[0] = 0x38;
    wdata[1] = 0x00;
    wdata[2] = 0x01;//

    i2c.write ( addr_dac, wdata, 3);

    wait(0.1);

    //LDAC設定
    wdata[0] = 0x30;
    wdata[1] = 0x00;
    wdata[2] = 0x0F;//

    i2c.write ( addr_dac, wdata, 3);

}

/**************************************
    DAC 電圧印加
    Vout = 2 * Vref(2.5V) * ( D /2^2 )
    mvolt[mV] 0~5000で設定
    addrは、0x00~03.全チャネルは0x07で指定
**************************************/
void dac_out(short mvolt, char addr)   //addr DACA:0x00 DACB:0x01 DACC:0x02 DACD:0x03 allDACs:0x07
{
    char    command;//1byte
    short   dacdata;//2byte

    command = 0x02;//write to input register n 仕様書p25参照

    dacdata = mvolt * 4095 / 2 / dac_vref ; //12bit mvolt[mV] 0~5000で設定する

    dacdata = dacdata << 4; //後ろ4bitはdon't care bit

    wdata[0] = command << 3 | addr; //1byte
    wdata[1] = dacdata >> 8 ; //1byte
    wdata[2] = dacdata & 0xFF;//1byte

    i2c.write(addr_dac, wdata, 3);

}
/*********************************
    ADC測定し、平均値を算出する

    貰う値:平均値の分母
    渡す値:平均値
*********************************/
void compute_adc(int adc_con, long *avg)   //(ADCのCONFIG, 計算結果)
{

    //short    sdata[10];//2byte
    long    ldata[10];//4byte
    long    nu;//平均値の分子 4byte
    long    max;
    long    min;
    char    i;
    char    x;
    //int     n;

    x = 10;

    wdata[0] = adc_con; //ADC configuration data チャンネルの選択など
    i2c.write( addr_ADC1, wdata, 1 );
    wait(0.1);

    //平均値の母数の数、測定を実施。
    for( i=0; i<=(x-1); i++) {

        i2c.read( addr_ADC1 + 0x01, rdata, 3);
        //2byte結合
        ldata[i] = rdata[0] & 0xFF;
        ldata[i] = ( ldata[i] << 8 ) | rdata[1];

        if ( ldata[i] >= 0x8000 ) {
            ldata[i] = ldata[i] | 0xFFFF0000; //4byteの補数へ変換
        }

        wait(0.05);

    }//for

    //最大値を取得
    max = ldata[0];
    for ( i=0; i<=(x-2); i++) {
        if ( ldata[i+1] > ldata[i]) {
            max = ldata[i+1];
        }
    }
    //最小値
    min = ldata[0];
    for ( i=0; i<=(x-2); i++) {
        if ( ldata[i+1] < ldata[i]) {
            min = ldata[i+1];
        }
    }

    //平均値
    nu = 0x00000000;    //4byte
    for ( i=0; i<=(x-1); i++) {
        nu = nu + ldata[i];
    }

    *avg = ( nu - max - min ) / ( x - 2 );

}


/**************************************
    2バイトを10進数で表示する 0~65535
    format *0.000
    mV→uAへ変換(1/1000)
    プリアンプ GAIN 1/5
    ADC_LSB:0.25mV
    積分時間 2s
    容量 20uF
**************************************/
void gu_putdeci(float* idata)
{

    float uA; //ver1.1.4
    long y; //ver1.1.4
    long x; //ver1.1.4

    //千分の一、四捨五入。
    if ( *idata > 0 ) {
        uA = *idata + 0.5;
    } else {
        uA = *idata - 0.5;
    }

    x = uA; //小数点以下切り捨て

    //四捨五入 up to here

    //プラスマイナスの表示
    if( x >= 0 ) {
        wdata[0] = 0x2B;//ascii "+"
        i2c.write(addr_gu, wdata, 1);

        y = x;

    } else {
        wdata[0] = 0x2D;//ascii "-"
        i2c.write(addr_gu, wdata, 1);

        y = ( ~x ) + 0x01;//2の補数
    }

    //y = y * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv

    wdata[0] = (( y / 1000 ) % 10 ) + 0x30;

    if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。
        wdata[0] = 0x20;

    wdata[1] = (( y / 100 ) % 10 ) + 0x30;
    wdata[2] = 0x2E;//ASCII "."
    wdata[3] = (( y / 10 ) % 10 ) + 0x30;
    wdata[4] = ( y % 10 ) + 0x30;

    i2c.write(addr_gu, wdata, 5);

    gu_print1("uA");

}

/**************************************
    2バイトを10進数で表示する 0~65535
    format *0.000
    mV→uAへ変換(1/1000)
    プリアンプ GAIN 1/5
    ADC_LSB:0.25mV
    シャント抵抗1kΩ
**************************************/
void gu_putdeci_mA(float* idata)
{
    float uA; //ver1.1.4
    long y; //ver1.1.4
    long x; //ver1.1.4

    //千分の一、四捨五入。
    if ( *idata > 0 ) {
        uA = *idata + 0.5;
    } else {
        uA = *idata - 0.5;
    }

    x = uA; //小数点以下切り捨て

    //四捨五入 up to here

    //プラスマイナスの表示
    if( x >= 0 ) {
        wdata[0] = 0x2B;//ascii "+"
        i2c.write(addr_gu, wdata, 1);

        y = x;

    } else {
        wdata[0] = 0x2D;//ascii "-"
        i2c.write(addr_gu, wdata, 1);

        y = ( ~x ) + 0x01;//2の補数
    }

    //y = y * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv

    /*
    wdata[0] = (( *y / 100000 ) % 10 ) + 0x30;

    if( wdata[0] == 0x30 )//3桁目が零の場合、"0"を表示しない。
        wdata[0] = 0x20;
    */

    wdata[0] = (( y / 1000 ) % 10 ) + 0x30;

    if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。
        wdata[0] = 0x20;

    wdata[1] = (( y / 100 ) % 10 ) + 0x30;
    wdata[2] = 0x2E;//ASCII "."
    wdata[3] = (( y / 10 ) % 10 ) + 0x30;
    wdata[4] = ( y % 10 ) + 0x30;

    i2c.write(addr_gu, wdata, 5);

    gu_print1("mA");

}

/**************************************
    2バイトを10進数で表示する 0~65535
    1/1000倍 format *0.000
    mV→V Ω→kΩ
**************************************/
void gu_putdeck(short* x)
{

    short num;

    //プラスマイナスの表示
    if( *x >= 0 ) {
        wdata[0] = 0x2B;//ascii "+"
        i2c.write(addr_gu, wdata, 1);
        num = *x;

    } else {
        wdata[0] = 0x2D;//ascii "-"
        i2c.write(addr_gu, wdata, 1);

        //*x = ( ~*x ) + 0x01;//2の補数
        num = *x * -1;
    }

    wdata[0] = (( num / 10000 ) % 10 ) + 0x30;

    if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。
        wdata[0] = 0x20;

    wdata[1] = (( num / 1000 ) % 10 ) + 0x30;
    wdata[2] = 0x2E;//ASCII "."
    wdata[3] = (( num / 100 ) % 10 ) + 0x30;
    wdata[4] = (( num / 10 ) % 10 ) + 0x30;
    //wdata[5] = ( num % 10 ) + 0x30;

    i2c.write(addr_gu, wdata, 5);

}

/********************************

    判定 LED点灯

********************************/
void hantei(char noc)
{
    int i;

    //エラーフラグ
    for ( i=0; i<= 3 ; i++) {
        err_f[i] = 0;
    }

    //ver1.2
    if (DEB_EN == 1) {
        voc[0] = 3100;//[mV]
        ocp[0] = -0.4*100;//[uA] 0.1uAのときocp[]の値は10
        iop[0] = 16.5*100;//[uA] 0.1uAのときicp[]の値は10
        voc[1] = 3100;//[V]
        ocp[1] = 0.4*100;//[uA]
        iop[1] = 16.5*100;//[uA]
    }
    //upto

    for ( i = 0; i <= ( noc - 1 ); i++) {

        /*ver1.1.3 規格設置値=0の場合は判定しない*/
        if( voc[i] < calinfo.low_limit_voc && calinfo.low_limit_voc != 0) {
            err_f[i] = 1;
        }

        if( iop[i] < calinfo.low_limit_iop ) {
            err_f[i] = 1;
        }

        if( ocp[i] > calinfo.low_limit_ocp ) {
            err_f[i] = 1;
        }

        //ver1.2.2
        if( ocp[i] < calinfo.up_limit_ocp && calinfo.up_limit_ocp != 0) {
            err_f[i] = 1;
        }

        if( R[i] < calinfo.low_limit_resistor && calinfo.low_limit_resistor != 0 ) {
            err_f[i] = 1;
        }

        if( R[i] > calinfo.up_limit_resistor && calinfo.up_limit_resistor != 0 ) {
            err_f[i] = 1;
        }

        if( err_f[i] == 1) {
            led_red[i] = 1;
        } else {
            led_green[i] = 1;
        }

        if ( SEQ_EN == 1 && err_f[i] == 0 ) {
            seq_hantei[i] = 1;
        }

        //ver1.2.3
        char *print_text;

        if(DEB_EN == 1) {

        gu_fontsize(1);
        gu_cursor(0,2);
        gu_print1("                ");

            if(err_f[i] == 1) {

                switch(i){
                    case 0: 
                        print_text="FAIL DUT1";
                        break;
                    case 1: 
                        print_text="FAIL DUT2";
                        break;
                }

                gu_fontsize(1);
                gu_cursor(0,2);
                gu_print1(print_text);
                wait(1);
            }
            if(err_f[i] == 0) {

                
                switch(i){
                    case 0: 
                        print_text="PASS DUT1";
                        break;
                    case 1: 
                        print_text="PASS DUT2";
                        break;
                }

                gu_fontsize(1);
                gu_cursor(0,2);
                gu_print1(print_text);

                wait(1);
            }
        }
        //upto

    }//for


}

/*********************************

    measure voltage
    測定CHを指定して、電圧値Rを返す
    char ch 0~3 -> 1ch ~ 4ch

*********************************/
short meas_voltage(char ch)//ch 0~3 -> 1ch ~ 4ch
{
    char    com;
    short   sdata;

    switch(ch) {
        case 0:
            com = adc_config(2,0);//ch1(adc),12bit
            i2c.write( addr_ADC1, &com, 1);
            wait(0.1);
            sdata = read_adc(addr_ADC1);
            break;
        case 1:
            com = adc_config(3,0);//ch2(adc),12bit
            i2c.write( addr_ADC1, &com, 1);
            wait(0.1);
            sdata = read_adc(addr_ADC1);
            break;
        case 2:
            com = adc_config(2,0);//ch1(adc),12bit
            i2c.write( addr_ADC2, &com, 1);
            wait(0.1);
            sdata = read_adc(addr_ADC2);
            break;
        case 3:
            com = adc_config(3,0);//ch2(adc),12bit
            i2c.write( addr_ADC2, &com, 1);
            wait(0.1);
            sdata = read_adc(addr_ADC2);
            break;
    }// end switch

    //プリアンプ倍率を代入して、電圧値を算出する(単位はmV)


    sdata = sdata * 5;//プリアンプ倍率

    return ( sdata );
}


/*********************************

    measure resistor
    測定CHを指定して、抵抗測定値Rを返す
    char ch 0~3 -> 1ch ~ 4ch

*********************************/
short meas_resistor(char ch)//ch 0~3 -> 1ch ~ 4ch
{
    char    com;
    short   sdata;

    switch(ch) {
        case 0:
            //ver1.2.0
            if (RL_EN == 1) {
                io[6] = 1; //外付けリレーON
                wait(TIME_RELAY_ON);
            }
            //up to here

            com = adc_config(0,0);//ch1(adc),12bit
            i2c.write( addr_ADC1, &com, 1);
            wait(0.1);
            sdata = read_adc(addr_ADC1);
            //ver1.2.0
            if (RL_EN == 1) {
                io[6] = 0 ;
            }

            break;

        case 1:
            //ver1.2.0
            if (RL_EN == 1) {
                io[7] = 1; //外付けリレーON
                wait(TIME_RELAY_ON);
            }
            //up to here

            com = adc_config(1,0);//ch2(adc),12bit
            i2c.write( addr_ADC1, &com, 1);
            wait(0.1);
            sdata = read_adc(addr_ADC1);
            //ver1.2.0
            if (RL_EN == 1) {
                io[7] = 0;
            }

            break;

        case 2:
            com = adc_config(0,0);//ch1(adc),12bit
            i2c.write( addr_ADC2, &com, 1);
            wait(0.1);
            sdata = read_adc(addr_ADC2);
            break;
        case 3:
            com = adc_config(1,0);//ch2(adc),12bit
            i2c.write( addr_ADC2, &com, 1);
            wait(0.1);
            sdata = read_adc(addr_ADC2);
            break;
    }// end switch

    //検出用抵抗値を代入して、測定抵抗値を算出する(単位はmV,Ω)
    if ( sdata < res_vref ) {
        sdata =( rsense * sdata ) / ( res_vref - sdata);
    } else {
        sdata = res_vref;//overload
    }


    return ( sdata );
}


/*********************************

    display resistor
    測定抵抗値を表示する

*********************************/
void display_resistor(short sdata)//測定値を表示する。
{
    if ( sdata < res_vref && sdata >= 0 ) {
        gu_putdec(&sdata);
    } else {
        gu_print1(" OL ");//overload
    }
    gu_onebyte(0xEA);//ohm
}

/**************************************
    4バイトを10進数で表示する 0~9999
**************************************/
void gu_putdec(short* x)
{

    char cmd[4];

    //cmd[0] = (( *x / 100000 ) % 10 ) + 0x30;
    cmd[0] = (( *x / 1000 ) % 10 ) + 0x30;
    cmd[1] = (( *x / 100 ) % 10 ) + 0x30;
    cmd[2] = (( *x / 10 ) % 10 ) + 0x30;
    cmd[3] = ( *x % 10 ) + 0x30;

    i2c.write(addr_gu, cmd, 4);

}
/*********************************

    LED 照度
    設定読込~反映
    //メモリから設定値を読み出して、LEDのPWMのDutyを設定する
    //LED1設定値&LED2設定値の計2Byte読込

*********************************/
void read_syoudo(char* c)
{
    char cmd;       //gu-DへのI2Cコマンド用配列 1byte0
    //char csyoudo[4];//led出力用pwm duty 設定比1バイト255段階
    float duty_pwm; //pwm パーセンテージ
    int i;

    //
    //メモリ10h番地(照度設定データ)読み出し
    cmd = 0x10;
    i2c.write (fixed_adrs, &cmd, 1,true);    //読込先頭アドレス指定 ReStart
    i2c.read ((fixed_adrs + 0x01), rdata, 4);//read 1byte

    for ( i = 0; i <=3; i++) {
        c[i] = rdata[i];
    }

    //set pwm duty
    for ( i = 0; i <= ( number_of_channels - 1 ); i++) {

        if(c[i] == 0x00) {
            c[i] = 0x32;
        }

        duty_pwm = COP * c[i];

        leds[i].write (duty_pwm);//Set Duty
    }
}
/*********************************

    LED 照度調整 (Main)

*********************************/
void adjust_illumination()
{
    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte0
    //char *pcmd = cmd_gu;
    //char msg;
    //char *pmsg = &msg;
    char crdata[3];
    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F gu-D スイッチNo.
    char cswdata; // 0x00 or 0x01 ONかOFFか
    char *pcswnum = &cswnum;
    char *pcswdata = &cswdata;
    char csyoudo[4];//led出力用pwm duty 設定比1バイト255段階
    char ch;
    float duty_pwm;//pwm パーセンテージ
    int i;
    int x[4] = {64,64,192,192}; //レベル値の表示位置 x座標
    int y[4] = {2,4,2,4}; //レベル値の表示位置 y座標
    //
    //EEPROMから照度データ読込とPWMDUTYセット
    read_syoudo( csyoudo );
    //
    //画面表示
    gu_cls();//画面のクリア
    gu_fontsize(2);
    gu_print1("Adjust illumination ");
    //照度レベルを256段階で表示
    //LED1
    gu_cursor(0,16/8);
    gu_print1("LED1 Lv ");
    //LED2
    gu_cursor(0,32/8);
    gu_print1("LED2 Lv ");
    //LED3
    if( number_of_channels >= 3 ) {
        gu_cursor(128,2);
        gu_print1("LED3 Lv ");
    }
    //LED4
    if( number_of_channels >= 4 ) {
        gu_cursor(128,4);
        gu_print1("LED4 Lv ");
    }
    //
    for ( i = 0; i <= ( number_of_channels - 1 ); i++) {

        gu_cursor(x[i],y[i]);

        cmd_gu[0] = ((csyoudo[i] / 100) & 0xFF) + 0x30;
        cmd_gu[1] = (csyoudo[i] - (csyoudo[i] / 100) * 100) / 10 + 0x30;
        cmd_gu[2] = ((csyoudo[i] % 10) & 0xFF) + 0x30;
        i2c.write(addr_gu, cmd_gu, 3);
    }

    //
    gu_fontsize(1);
    gu_cursor(0,56/8);
    gu_print1("LED1");
    gu_cursor(32,56/8);
    gu_print1("fine");
    gu_cursor(64,56/8);
    gu_print1("LED2");
    gu_cursor(96,56/8);
    gu_print1("fine");

    if( number_of_channels >= 3) {
        gu_cursor(128,56/8);
        gu_print1("LED3");
        gu_cursor(160,56/8);
        gu_print1("fine");
    }
    if( number_of_channels >= 4) {
        gu_cursor(192,56/8);
        gu_print1("LED4");
        gu_cursor(224,56/8);
        gu_print1("fine");
    }
    //
    //gu-D タッチスイッチ読み出し動作設定 p49
    cmd_gu[0]= 0x1F;
    cmd_gu[1]= 0x4B;
    cmd_gu[2]= 0x18;
    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
    //
    //ボタンイメージの表示
    for ( i = 17; i < 17 + ( number_of_channels * 2 ); i++) {
        gu_button_up(i);
    }
    for ( i = 25; i < 25 + ( number_of_channels * 2 ); i++) {
        gu_button_down(i);
    }
    gu_Button_power_on();//show button
    wait(0.2);

    while(1) {

        i2c.read ((addr_gu + 0x01), crdata, 3);

        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
            *pcswnum = crdata[1]; //スイッチ番号
            *pcswdata = crdata[2];//ON/OFF情報

            if (cswdata == 0x01) { //タッチしたならば

                switch ( number_of_channels ) { //ver1.1.0

                    case 1:
                    case 2:
                        if ( cswnum >= 20 && cswnum <= 23 )
                            cswnum = 0;

                        if ( cswnum >= 28 && cswnum <= 31 )
                            cswnum = 0;

                        break;

                    case 3:
                        if ( cswnum >= 22 && cswnum <= 23 )
                            cswnum = 0;

                        if ( cswnum >= 30 && cswnum <= 31 )
                            cswnum = 0;

                        break;

                } //switch

                switch( cswnum ) { //SWの番号(位置)

                    case 22:
                    case 20:
                    case 16:
                    case 18:

                        ch = ( cswnum - 16 ) / 2; //SWnoから選択したLEDNoの算出

                        gu_button_up_on( cswnum + 1 );
                        wait(0.2);
                        gu_button_up( cswnum + 1 );
                        wait(0.1);

                        if(csyoudo[ch] <= 0xEF ) {
                            csyoudo[ch] = csyoudo[ch] + 0x0A;
                        }

                        break;

                    case 23:
                    case 21:
                    case 17:
                    case 19:

                        ch = ( cswnum - 17 ) / 2; //SWnoから選択したLEDNoの算出

                        gu_button_up_on( cswnum + 1 );
                        wait(0.2);
                        gu_button_up( cswnum + 1 );
                        wait(0.1);

                        if(csyoudo[ch] <= 0xFF ) {
                            csyoudo[ch] = csyoudo[ch] + 0x01;
                        }

                        break;

                    case 24:
                    case 26:
                    case 28:
                    case 30:

                        ch = ( cswnum - 24 ) / 2; //SWnoから選択したLEDNoの算出

                        gu_button_down_on( cswnum + 1 );
                        wait(0.2);
                        gu_button_down( cswnum + 1 );
                        wait(0.1);

                        if(csyoudo[ch] >= 0x0A ) {
                            csyoudo[ch] = csyoudo[ch] - 0x0A;
                        }

                        break;

                    case 25:
                    case 27:
                    case 29:
                    case 31:

                        ch = ( cswnum - 24 ) / 2; //SWnoから選択したLEDNoの算出

                        gu_button_down_on( cswnum + 1 );
                        wait(0.2);
                        gu_button_down( cswnum + 1 );
                        wait(0.1);

                        if(csyoudo[ch] >= 0x01 ) {
                            csyoudo[ch] = csyoudo[ch] - 0x01;
                        }

                        break;

                    case 7 ://SW.8 保存ボタンを押すと現在の輝度をEEPROMへ保存する

                        wdata[0] = 0x10 ; //word address 書込み先頭アドレス指定

                        for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
                            wdata[ i + 1 ] = csyoudo[i]; //DATA_LED i
                        }

                        Soushin = i2c.write (fixed_adrs, wdata,( number_of_channels + 1 ));

                        if(Soushin == 0) {
                            gu_Button_power_off();//電源ボタンイメージ反転表示
                            wait(0.3);

                            return;//照度調整ルーチンを抜ける
                        }
                } //switch



                //PWMのDUTY設定

                for( i = 0; i <= ( number_of_channels - 1 ); i++) {
                    duty_pwm = COP * csyoudo[i];
                    leds[i].write (duty_pwm);//Set Duty
                }


                //照度レベルを256段階で表示
                //LED1
                gu_fontsize(2);

                for ( i = 0; i <= ( number_of_channels - 1 ); i++) {

                    gu_cursor(x[i],y[i]);

                    cmd_gu[0] = ((csyoudo[i] / 100) & 0xFF) + 0x30;
                    cmd_gu[1] = (csyoudo[i] - (csyoudo[i] / 100) * 100) / 10 + 0x30;
                    cmd_gu[2] = ((csyoudo[i] % 10) & 0xFF) + 0x30;
                    i2c.write(addr_gu, cmd_gu, 3);
                }
            }
        } //if

        wait(0.1);//gu-D 読込間隔の設定

    }
}

/*********************************

    サブ基板LED(判定用)全消灯

*********************************/
void led_off()
{
    int i;

    for( i = 0; i <= ( number_of_channels - 1 ); i++) {
        led_green[ i ] = 0;
        led_red[ i ] = 0;
    }

}
/*********************************

    Utility Main
    gu_D 輝度調整 タッチ感度調整

*********************************/
void utility()   //輝度調整サブルーチン
{

    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte0
    //char *pcmd = cmd_gu;
    char clumi; //輝度設定用変数 01h<=n<=08h
    char* pclumi = &clumi; //ポインタの定義
    char msg;
    char *pmsg = &msg;
    char crdata[3];
    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
    char cswdata; // 0x00 or 0x01
    char *pcswnum = &cswnum;
    char *pcswdata = &cswdata;
    //
    //メモリ00h番地(輝度設定データ)読み出し
    wdata[0] = 0x00;
    Soushin = i2c.write (fixed_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte
    *pclumi = rdata[0];

    //輝度設定更新
    if(*pclumi==0x00 || *pclumi > 0x08) *pclumi=0x05;
    gu_luminance(pclumi);

    //画面表示
    gu_cls();//画面のクリア
    gu_print1("Set Display Brightness");
    gu_cursor(0,16/8);
    gu_print1("LEVEL ");
    *pmsg = *pclumi + 0x30;
    gu_print1(pmsg);

    gu_cursor(0,96/8); //ver1.1.0
    gu_print1("DELETE EEPROM_DATA");
    gu_set_button_font1(30,"del");

    //SW状態変化時自動送信モード2
    cmd_gu[0]= 0x1F;
    cmd_gu[1]= 0x4B;
    cmd_gu[2]= 0x18;
    cmd_gu[3]= 0x02;
    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49

    //ボタンイメージの表示
    gu_button_up(6);//show button
    gu_button_down(14);//show button
    gu_Button_power_on();//show button

    while(1) {

        i2c.read ((addr_gu + 0x01), crdata, 3, true);

        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
            *pcswnum = crdata[1]; //スイッチ番号
            *pcswdata = crdata[2];//ON/OFF情報

            if (cswdata == 0x01) { //タッチしたならば
                switch( cswnum ) { //SWの番号(位置)
                    case 5 ://SW6
                        gu_button_up_on( 6 );
                        wait(0.2);
                        gu_button_up( 6 );
                        wait(0.1);

                        if(clumi < 8 ) *pclumi = *pclumi + 1;

                        break;

                    case 13 ://SW14
                        gu_button_down_on( 14 );
                        wait(0.2);
                        gu_button_down( 14 );
                        wait(0.1);

                        if(clumi >= 1 ) *pclumi = *pclumi - 1;

                        break;

                    case 29:  //SW30

                        gu_reverse(0x01);   //gu_リバース指定
                        gu_set_button_font1(30,"del");
                        gu_reverse(0x00);   //gu_リバース解除

                        erace_calinfo();

                        gu_set_button_font1(30,"del");

                        break;

                    case 0x07 ://保存ボタンを押すと現在の輝度をEEPROMへ保存する

                        wdata[0] = 0x00 ; //word address 書込み先頭アドレス指定
                        wdata[1] = *pclumi ; //DATA
                        Soushin = i2c.write (fixed_adrs, wdata, 2);

                        if(Soushin == 0) {
                            gu_Button_power_off();//電源ボタンイメージ反転表示
                            wait(0.5);
                            return;//輝度調整ルーチンを抜ける
                        }

                } //switch

                gu_luminance(pclumi);//輝度変更
                gu_cursor(0,16/8);
                gu_print1("LEVEL ");
                *pmsg = *pclumi + 0x30;
                gu_print1(pmsg);

            }
        } //if

        wait(0.1);//gu-D 読込間隔の設定

    }
}

/*********************************
    gu_D グラフィックデータ
*********************************/
char gu_Button_MODE_data[] = {
    0x7F,0xF0,0x80,0x08,0x80,0x0C,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,
    0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x7F,0xF2,0x20,0x02,0x1F,0xFC,0x00,0x00,
};

void gu_set_button(char sw_num,char* text)
{
    char    x;
    char    y;

    //SW_NoからSWの座標を求める
    x = ((sw_num - 1) % 8 ) * 32;
    y = ((sw_num - 1) / 8 ) * 32;

    gu_drawButton(x,y,32,32, gu_Button_MODE_data );

    // Change Font Size
    gu_fontsize(2);
    // set font width
    gu_fontWidth(Proportional1);
    gu_print_dot( x + 8,y + 8,text);
    // Change Font Size
    gu_fontsize(1);
    // set font width
    gu_fontWidth(1);
}

void gu_set_button_font1(char sw_num,char* text)
{
    char    x;
    char    y;

    //SW_NoからSWの座標を求める
    x = ((sw_num - 1) % 8 ) * 32;
    y = ((sw_num - 1) / 8 ) * 32;

    gu_drawButton(x,y,32,32, gu_Button_MODE_data );

    // Change Font Size
    gu_fontsize(1);
    // set font width
    gu_fontWidth(1);
    gu_print_dot( x + 2,y + 10,text);

}

char gu_Button_up_data[] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08,
    0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x18,0x04,
    0x20,0x00,0x38,0x04,0x20,0x00,0x78,0x04,0x20,0x00,0xF8,0x04,0x20,0x01,0xF8,0x04,
    0x20,0x03,0xF8,0x04,0x20,0x07,0xF8,0x04,0x20,0x0F,0xF8,0x04,0x20,0x1F,0xF8,0x04,
    0x20,0x1F,0xF8,0x04,0x20,0x0F,0xF8,0x04,0x20,0x07,0xF8,0x04,0x20,0x03,0xF8,0x04,
    0x20,0x01,0xF8,0x04,0x20,0x00,0xF8,0x04,0x20,0x00,0x78,0x04,0x20,0x00,0x38,0x04,
    0x20,0x00,0x18,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,
    0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void gu_button_up(char sw_num)
{
    char    x;
    char    y;

    //SW_NoからSWの座標を求める
    x = ((sw_num - 1) % 8 ) * 32;
    y = ((sw_num - 1) / 8 ) * 32;

    gu_cursor( x, y/8 );
    gu_RealTimeImage(32, 32, gu_Button_up_data);
}

void gu_Button_up1()
{
    gu_cursor(224,8);
    gu_RealTimeImage(32, 32, gu_Button_up_data);
}

void gu_Button_up2()
{
    gu_cursor(192,8);
    gu_RealTimeImage(32, 32, gu_Button_up_data);
}

void gu_Button_up3()
{
    gu_cursor(160,8);
    gu_RealTimeImage(32, 32, gu_Button_up_data);
}

void gu_Button_up4()
{
    gu_cursor(128,8);
    gu_RealTimeImage(32, 32, gu_Button_up_data);
}

char gu_Button_down_data[] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08,
    0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x18,0x00,0x04,
    0x20,0x1C,0x00,0x04,0x20,0x1E,0x00,0x04,0x20,0x1F,0x00,0x04,0x20,0x1F,0x80,0x04,
    0x20,0x1F,0xC0,0x04,0x20,0x1F,0xE0,0x04,0x20,0x1F,0xF0,0x04,0x20,0x1F,0xF8,0x04,
    0x20,0x1F,0xF8,0x04,0x20,0x1F,0xF0,0x04,0x20,0x1F,0xE0,0x04,0x20,0x1F,0xC0,0x04,
    0x20,0x1F,0x80,0x04,0x20,0x1F,0x00,0x04,0x20,0x1E,0x00,0x04,0x20,0x1C,0x00,0x04,
    0x20,0x18,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,
    0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void gu_button_down(char sw_num)
{
    char    x;
    char    y;

    //SW_NoからSWの座標を求める
    x = ((sw_num - 1) % 8 ) * 32;
    y = ((sw_num - 1) / 8 ) * 32;

    gu_cursor( x, y/8 );
    gu_RealTimeImage(32, 32, gu_Button_down_data);
}

void gu_Button_down1()
{
    gu_cursor(224,12);
    gu_RealTimeImage(32, 32, gu_Button_down_data);
}

void gu_Button_down2()
{
    gu_cursor(192,12);
    gu_RealTimeImage(32, 32, gu_Button_down_data);
}

void gu_Button_down3()
{
    gu_cursor(160,12);
    gu_RealTimeImage(32, 32, gu_Button_down_data);
}

void gu_Button_down4()
{
    gu_cursor(128,12);
    gu_RealTimeImage(32, 32, gu_Button_down_data);
}

char gu_Button_up_on_data[] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,
    0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xE7,0xFC,
    0x3F,0xFF,0xC7,0xFC,0x3F,0xFF,0x87,0xFC,0x3F,0xFF,0x07,0xFC,0x3F,0xFE,0x07,0xFC,
    0x3F,0xFC,0x07,0xFC,0x3F,0xF8,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xE0,0x07,0xFC,
    0x3F,0xE0,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xF8,0x07,0xFC,0x3F,0xFC,0x07,0xFC,
    0x3F,0xFE,0x07,0xFC,0x3F,0xFF,0x07,0xFC,0x3F,0xFF,0x87,0xFC,0x3F,0xFF,0xC7,0xFC,
    0x3F,0xFF,0xE7,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
    0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void gu_button_up_on( char sw_num )
{
    char    x;
    char    y;

    //SW_NoからSWの座標を求める
    x = ((sw_num - 1) % 8 ) * 32;
    y = ((sw_num - 1) / 8 ) * 32;

    gu_cursor( x, y/8 );

    gu_RealTimeImage(32, 32, gu_Button_up_on_data);
}

void gu_Button_up_on2()
{
    gu_cursor(192,8);
    gu_RealTimeImage(32, 32, gu_Button_up_on_data);
}

char gu_Button_down_on_data[] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,
    0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xE7,0xFF,0xFC,
    0x3F,0xE3,0xFF,0xFC,0x3F,0xE1,0xFF,0xFC,0x3F,0xE0,0xFF,0xFC,0x3F,0xE0,0x7F,0xFC,
    0x3F,0xE0,0x3F,0xFC,0x3F,0xE0,0x1F,0xFC,0x3F,0xE0,0x0F,0xFC,0x3F,0xE0,0x07,0xFC,
    0x3F,0xE0,0x07,0xFC,0x3F,0xE0,0x0F,0xFC,0x3F,0xE0,0x1F,0xFC,0x3F,0xE0,0x3F,0xFC,
    0x3F,0xE0,0x7F,0xFC,0x3F,0xE0,0xFF,0xFC,0x3F,0xE1,0xFF,0xFC,0x3F,0xE3,0xFF,0xFC,
    0x3F,0xE7,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
    0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void gu_button_down_on(char sw_num)
{
    char    x;
    char    y;

    //SW_NoからSWの座標を求める
    x = ((sw_num - 1) % 8 ) * 32;
    y = ((sw_num - 1) / 8 ) * 32;

    gu_cursor( x, y/8 );

    gu_RealTimeImage(32, 32, gu_Button_down_on_data);
}

void gu_Button_down_on2()
{
    gu_cursor(192,12);
    gu_RealTimeImage(32, 32, gu_Button_down_on_data);
}

char gu_Button_power_on_data[] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08,
    0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x03,0xF0,0x04,
    0x20,0x0F,0xFC,0x04,0x20,0x1F,0xFE,0x04,0x20,0x3C,0x0F,0x04,0x20,0x38,0x07,0x84,
    0x20,0x00,0x03,0x84,0x20,0x00,0x03,0xC4,0x20,0x00,0x01,0xC4,0x21,0xFF,0x01,0xC4,
    0x21,0xFF,0x01,0xC4,0x20,0x00,0x01,0xC4,0x20,0x00,0x03,0xC4,0x20,0x00,0x03,0x84,
    0x20,0x38,0x07,0x84,0x20,0x3C,0x0F,0x04,0x20,0x1F,0xFE,0x04,0x20,0x0F,0xFC,0x04,
    0x20,0x03,0xF0,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,
    0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void gu_Button_power_on()
{
    gu_cursor(224,0);
    gu_RealTimeImage(32, 32, gu_Button_power_on_data);
}


char gu_Button_power_off_data[] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,
    0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFC,0x0F,0xFC,
    0x3F,0xF0,0x03,0xFC,0x3F,0xE0,0x01,0xFC,0x3F,0xC3,0xF0,0xFC,0x3F,0xC7,0xF8,0x7C,
    0x3F,0xFF,0xFC,0x7C,0x3F,0xFF,0xFC,0x3C,0x3F,0xFF,0xFE,0x3C,0x3C,0x00,0x7E,0x3C,
    0x3C,0x00,0x7E,0x3C,0x3F,0xFF,0xFE,0x3C,0x3F,0xFF,0xFC,0x3C,0x3F,0xFF,0xFC,0x7C,
    0x3F,0xC7,0xF8,0x7C,0x3F,0xC1,0xE0,0xFC,0x3F,0xE0,0x01,0xFC,0x3F,0xF0,0x03,0xFC,
    0x3F,0xFC,0x0F,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
    0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void gu_Button_power_off()
{
    gu_cursor(224,0);
    gu_RealTimeImage(32, 32, gu_Button_power_off_data);
}

/*********************************
    ノリタケ関数
    ここから
**********************************/
//
// Clear screen//
void gu_cls()
{

    i2c.start();
    i2c.write(addr_gu);
    i2c.write(0x0c);
    i2c.stop();

}

void gu_drawButton(int x, int y, int w, int h, const char data[])
{
    h = h >> 3;  // get height in byte
    y = y >> 3;  // get Y location in byte

    gu_cursor(x,y);
    // Realtime Image draw header

    i2c.start();
    i2c.write(addr_gu);
    gu_sendOneByte(0x1f);
    gu_sendOneByte(0x28);
    gu_sendOneByte(0x66);
    gu_sendOneByte(0x11);
    gu_sendOneByte( w & 0xff);
    gu_sendOneByte( w >> 8);
    gu_sendOneByte( h & 0xff);
    gu_sendOneByte( h >> 8);
    gu_sendOneByte(0x01);

    for(int i = 0; i<w; i++) {
        if(i<8) {                           // 8 dots from left
            gu_sendOneByte(data[i*2]);
            if(h>2) {
                for(int j=0; j<(h-2); j++) {
                    if((data[i*2]&0x01)==0) {
                        gu_sendOneByte(0x00);
                    } else {
                        gu_sendOneByte(0xff);
                    }
                }
            }
            gu_sendOneByte(data[i*2+1]);
        } else if (i > (w-8)) {             // 8 dots from right

            gu_sendOneByte(data[(16+i-w)*2]);
            if(h>2) for(int j=0; j<(h-2); j++) {
                    if((data[(16+i-w)*2]&0x01)==0) {
                        gu_sendOneByte(0x00);
                    } else {
                        gu_sendOneByte(0xff);
                    }
                }
            gu_sendOneByte(data[(16+i-w)*2+1]);

        } else {                              // in the middle
            gu_sendOneByte(data[14]);
            if(h>2) {
                for(int j=0; j<(h-2); j++) {
                    if((data[14]&0x01)==0) {
                        gu_sendOneByte(0x00);
                    } else {
                        gu_sendOneByte(0xff);
                    }
                }
            }
            gu_sendOneByte(data[15]);
        }
    }

    i2c.stop();

}


// ドット単位キャラクタ表示 p37
void gu_print_dot(int x, int y, const char* ptext)
{

    i2c.start();
    i2c.write(addr_gu);
    gu_sendOneByte(0x1f);
    gu_sendOneByte(0x28);
    gu_sendOneByte(0x64);
    gu_sendOneByte(0x30);
    gu_sendOneByte(x & 0xff);
    gu_sendOneByte(x >> 8);
    gu_sendOneByte(y & 0xff);
    gu_sendOneByte(y >> 8);
    gu_sendOneByte(0x00);

    int i=0;
    int j=0;
    while(*(ptext+i)) {
        if (*(ptext + i++) =='%') {
            j+=2;   //文字列終端”0%"までインクリメント
        }
    }

    gu_sendOneByte(i-j);  //キャラクタデータ長
    gu_print(ptext);       //キャラクタデータ

    i2c.stop();

}

//
// Print test//
void gu_print(const char t[] )
{
    i2c.start();
    i2c.write(addr_gu);

    int i=0;
    int j=0;
    int k=0;
    while(t[i]) {
        if(t[i] != 37) {
            gu_sendOneByte(t[i++]);
        } else {
            i++;
            j=t[i++]-0x30;
            if(j>9) {
                j -= 7;
            }
            if(j>0x10) {
                j -= 0x20;
            }
            k=t[i++]-0x30;
            if(k>9) {
                k -= 7;
            }
            if(k>0x10) {
                k -= 0x20;
            }
            gu_sendOneByte(j*16+k);
        }
    }
    i2c.stop();
}

void gu_RealTimeImage(int w, int h, char data[])
{
    h = h >> 3;  // get height in byte

    i2c.start();
    gu_sendOneByte(addr_gu);
    gu_sendOneByte(0x1f);
    gu_sendOneByte(0x28);
    gu_sendOneByte(0x66);
    gu_sendOneByte(0x11);
    gu_sendOneByte( w & 0xff);
    gu_sendOneByte( w >> 8);
    gu_sendOneByte( h & 0xff);
    gu_sendOneByte( h >> 8);
    gu_sendOneByte(0x01);
    for( int i=0; i < ( w * h ); i++) {
        gu_sendOneByte( data[i]);
    }
    i2c.stop();
}

// Draw RealTimeBitImage by dot
void gu_RealTimeImage_dot(int x, int y, int w, int h, const char data[])
{
    i2c.start();
    gu_sendOneByte(addr_gu);
    gu_sendOneByte(0x1f);
    gu_sendOneByte(0x28);
    gu_sendOneByte(0x64);
    gu_sendOneByte(0x21);
    gu_sendOneByte(x & 0xff);
    gu_sendOneByte(x >> 8);
    gu_sendOneByte(y & 0xff);
    gu_sendOneByte(y >> 8);
    gu_sendOneByte(w & 0xff);
    gu_sendOneByte(w >> 8);
    gu_sendOneByte(h & 0xff);
    gu_sendOneByte(h >> 8);
    gu_sendOneByte(0x01);
    for(int i=0; i<( w * ((h + 7)>>3)); i++ ) {
        gu_sendOneByte(data[i]);
    }
    i2c.stop();
}


// Set Font width
void gu_fontWidth(const char fontWidth)
{
    /*
    gu_sendOneByte(0x1f);
    gu_sendOneByte(0x28);
    gu_sendOneByte(0x67);
    gu_sendOneByte(0x03);
    gu_sendOneByte(fontWidth);
    */

    char accom_gu[5] ;   //gu-DへのI2Cコマンド用配列

    accom_gu[0] = 0x1F;
    accom_gu[1] = 0x28;
    accom_gu[2] = 0x67;
    accom_gu[3] = 0x03;
    accom_gu[4] = fontWidth;

    i2c.write(addr_gu, accom_gu, 5);

}

//
// Move Cursor
// 動作確認完了 2017/6/26
void gu_cursor(int x, int y)
{

    /*
    gu_sendOneByte(0x1f);
    gu_sendOneByte(0x24);
    gu_sendOneByte(x%256);
    gu_sendOneByte(x>>8);
    gu_sendOneByte(y%256);
    gu_sendOneByte(y>>8);
    */

    char accom_gu[6] ;   //gu-DへのI2Cコマンド用配列

    accom_gu[0] = 0x1f;
    accom_gu[1] = 0x24;
    accom_gu[2] = x & 0xFF;
    accom_gu[3] = x >> 8;
    accom_gu[4] = y & 0xFF;
    accom_gu[5] = y >> 8;

    i2c.write(addr_gu, accom_gu, 6);

}

// Font Body Size
// 動作確認2017/6/26
void gu_fontsize(const char code)
{
    /*
    gu_sendOneByte(0x1f);
    gu_sendOneByte(0x28);
    gu_sendOneByte(0x67);
    gu_sendOneByte(0x01);
    gu_sendOneByte(code);
    */
    char accom_gu[5] ;   //gu-DへのI2Cコマンド用配列

    accom_gu[0] = 0x1F;
    accom_gu[1] = 0x28;
    accom_gu[2] = 0x67;
    accom_gu[3] = 0x01;
    accom_gu[4] = code;

    i2c.write(addr_gu, accom_gu, 5);

}


//
// Reverse video font
void gu_fontReverse(int code)
{

    i2c.start();
    gu_sendOneByte(addr_gu);
    gu_sendOneByte(0x1f);
    gu_sendOneByte(0x72);
    gu_sendOneByte(code);
    i2c.stop();

}

void gu_touchPara(int x,int y)
{
    i2c.start();
    i2c.write(addr_gu);
    i2c.write(0x1F);
    i2c.write(0x4B);
    i2c.write(0x70);
    i2c.write(x & 0xFF);
    i2c.write(y & 0xFF);
    i2c.stop();
}

// Magnify Font キャラクタ拡大表示
void gu_magnify(int x, int y)
{
    gu_sendOneByte(0x1f);
    gu_sendOneByte(0x28);
    gu_sendOneByte(0x67);
    gu_sendOneByte(0x40);
    gu_sendOneByte(x);
    gu_sendOneByte(y);
}

/*********************************
    ノリタケ関数
    ここまで
**********************************/
//
//Show text
void gu_print1(const char* ptext)
{
    i2c.write(addr_gu, ptext, strlen(ptext));
}
//
//輝度調整
void gu_luminance(const char* cl)
{
    i2c.start();
    i2c.write(addr_gu);
    i2c.write(0x1F);
    i2c.write(0x58);
    i2c.write(*cl & 0xFF);
    i2c.stop();
}
//
//gu_Dクラス用 1バイト送信
void gu_sendOneByte(char data)                                            //arduino->mbed
{
    i2c.write(data);
    //while(digitalRead(gu_MBUSY)==HIGH){} // wait for ready.
    //Serial.write(data);               // send a byte.
}
//
//CF+RF
void gu_CRLF()
{
    char com[2];

    com[0] = 0x0A; //LF
    com[1] = 0x0D; //CR
    i2c.write(addr_gu, com, 2);  //LF+CR
}
//
//リバース指定or解除
void gu_reverse(char x)   //リバース指定or解除
{
    char com[3];

    com[0] = 0x1F;
    com[1] = 0x72;
    com[2] = x & 0xFF; //0x01:指定 0x00:解除
    i2c.write(addr_gu, com, 3);
}
//1byte送信用
void gu_onebyte(char data)
{
    i2c.write(addr_gu, &data, 1);
}
/*****************************************

    SD CARD

*****************************************/
void sd_writetext(const char* ptext)
{

    mkdir("/sd/mydir", 0777);

    FILE *fp = fopen("/sd/mydir/iop.txt", "w");//ディレクトリとファイル名の指定

    if(fp == NULL) {

        gu_fontsize(1);
        gu_cursor(0,2);
        /* ver1.1.3*/
        gu_print1("No SD card");
        //gu_print1("Could not open file for SD card");
        //error("Could not open file for write\n");

    }

    fprintf(fp, ptext);
    fclose(fp);

}