/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// レーシングSimに設置したウィンカー&ワイパーレバーからの入力をゲームに認識させるプログラムの動作確認のため、
// Wokwiのデバッグ機能を使わせてもらった。(Ver 9.5 2025/02/18 13:44 更新)
//
// デバッグするにあたり、Joystick関係の行はコメントアウトし、代わりにJoystick操作の模擬情報をLCDへ表示する。
// 各スライドスイッチはウィンカーレバーやワイパーレバーの操作に伴って切替わる電気的接続を模擬するのに用いる。
// 但し、実際のウィンカーレバーやワイパーレバーの作動では起こり得ない順番飛ばしの切替等がスライドスイッチ操作では
// 可能となってしまう点に注意を要する。(意味をよく考えてスライドスイッチを動かす必要あり。)
//
// ウインカーレバーとワイパーレバーは中古品をヤフオクで購入した。
// ● ウィンカーレバー:H27アテンザワゴンGJ2FW用の KF20-66-122 をそのまま使用した。
// ● ワイパーレバー :H27アテンザワゴンGJ2FW用の K015-66-128 を使用した。ツマミSWからの信号は白コネクターを抜きそこから直接取出した。
// ・ワイパーレバーのオートワイパー感度調整ツマミは、ゲーム種類(AC/ACC/DR2/ETS2/vacant)の選択用として使用した。
// ・ワイパーレバーのRワイパーツマミは上から順番に、HORN/OFF/HAZARD/入力無効化/レバー状態読込、を割り当てた。
// ・ワイパーレバーを手前に引く操作は、1)FウォッシャーON/OFF 2)通常モードとボタンアサインモードの切替、の2つの機能を持たせた。
//
// -----《GJ2FW用ウィンカーレバー&ワイパーレバーの各コネクターピン間の導通状態による各ポジション判別》--------------------------------------------------
// 〈ライト〉 OFF: FP06のみGND(FP07)と導通 AUTO: 全端子とも相互に導通無し POSITION: FP08がGNDと導通かつFP01がGNDと非導通
// HEAD-ON: FP01がGNDと導通かつFP03とFP09がGNDと非導通 HIGH_BEAM: FP03がGNDと導通 PASSING: FP09がGNDと導通
// 〈方向指示器〉 左折: FP11がGNDと導通 OFF: FP10とFP11両方ともGNDと非導通 右折: FP10がGNDと導通
// 〈フォグランプ〉ON: FP05がGNDと導通
//
// 〈Fワイパー〉 MIST: WP10がGND(WP05)と導通かつWP09がGNDと非導通 OFF: WP09とWP10両方ともGNDと非導通
// AUTO: WP09がGNDと導通かつWP10がGNDと非導通 LO: WP10がGNDと導通かつWP09がGNDと非導通 HI: WP09とWP10両方ともGNDと導通
// ※MISTとLOは各コネクターピン間の導通状態では区別がつかないので、遷移順番(前の状態が何だったか)で判断する。
// 〈Fウォッシャー〉ON:WP04がGNDと導通
// 〈AUTO-WP 感度〉マイナス2: WBLACKとWPURPLEとWBROWNがGND(WWHITE)と導通 マイナス1: WBLACKとWBROWNがGNDと導通かつWPURPLEがGNDと非導通
// 標準: WBLACKがGNDと導通かつWPURPLEとWBROWNがGNDと非導通 プラス1: WBLACKとWPURPLEがGNDと導通かつWBROWNがGNDと非導通
// プラス2: WPURPLEがGNDと導通かつWBLACKとWBROWNがGNDと非導通
// 〈Rワイパー〉 R_WIPER & R_WASHER-MOMENTARY_ON: WREDがGNDと導通かつWYELLOWとWGREENがGNDと非導通
// OFF: WREDとWYELLOWとWGREENの3つともGNDと非導通 R_WIPER-INT: WGREENがGNDと導通かつWREDとWYELLOWがGNDと非導通
// R_WIPER-ON: WYELLOWがGNDと導通かつWREDとWGREENがGNDと非導通
// R_WASHER-MOMENTARY_ON(WHEN R_WIPER IS MOVING): WREDとWYELLOWがGNDと導通かつWGREENがGNDと非導通
// --------------------------------------------------------------------------------------------------------------------------------------------
//
//
// ※スケッチ作成の参考にさせていただいたサイト:●Cavalera Games ●マヨけんの趣味・実験場 ●ツール・ラボ 、、、
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//ヘッダファイルの設定 ************************************************************************************************************************************************************
#include <Wire.h> // I2C通信用のヘッダファイル
#include <LiquidCrystal_I2C.h> // LDC_I2C
//#include "Joystick.h" //ArduinoJoystickLibrary-2.1.1
//インスタンスの生成 **************************************************************************************************************************************************************
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
//Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 0x04, // 0x04 = joystick, 0x05 = gamepad, 0x08 = flight_controller
// 32, 0, // Button Count, Hat Switch Count
// false, false, false, // X, Y, Z
// false, false, false, // Rx, Ry, Rz
// false, false, // Rudder, Throttle
// false, false, false); // Accelerator, Brake, Steering
//ジョイスティックのボタン定義 (56~80行はプログラムではなくメモです。) ***************************************************************************************************************
// Button(No_1):右ウィンカー 〈押すたびにON ⇔ OFF繰り返し)
// Button(No_2):左ウィンカー 〈押すたびにON ⇔ OFF繰り返し)
// Button(No_3):ライトモード(ETS2ではOFF⇒(POSITION or AUTOLIGHT)⇒LO⇒OFF⇒以降繰り返し,
// ACCでは OFF⇒ON(POSITION & HEADLIGHT)⇒以降繰り返し,
// Dirt Rally_2.0 では 普通に押すとパッシング、長押しでライトON⇔OFF)
// Button(No_4):ハイビーム(OFF⇒ON⇒OFF⇒以降繰り返し) ;for ETS2
// Button(No_5):パッシング(ACとETS2 ではボタンを押している間だけON、離すとOFF,
// ACC ではボタンを押して離した瞬間をトリガーに5回ほど短く点滅する)
// Button(No_6):レインライト〈押すたびにON ⇔ OFF繰り返し);for ACC
// Button(No_7):ライトモードAUTO ;for something
// Button(No_8):ワイパーの切替1(OFF⇒ON⇒OFF⇒以降繰り返し);for ACC(但し、当スケッチでは使用しない)
// Button(No_9):Fワイパー(OFF⇒INT⇒LOW⇒HIGH⇒HIGH⇒HIGH… );for ETS2
// Fワイパー速度UP(OFF⇒INT⇒LOW⇒MID⇒HIGH⇒OFF⇒INT… );for AC
// ワイパーの切替2(OFF⇒LOW⇒MID⇒HIGH⇒OFF⇒LOW… );for ACC
// Button(No_10):Fワイパーを1段戻す;for ETS2
// Fワイパー速度DOWN(HIGH⇒MID⇒LOW⇒INT⇒OFF⇒HIGH… );for AC
// Button(No_11):割当なし
// Button(No_12):割当なし
// Button(No_13):Fウォッシャー;for something
// Button(No_14):停止時に長押しでFワイパーMIST 、連続作動時に長押しでFワイパーOFF、短押しでONのLO⇔HI繰り返し ;for Diat Rally 2.0
// Button(No_15)~Button(No_20):割当無し
// Button(No_21):ハザード for ETS & ACC
// Button(No_22):ホーン for ETS2
// Button(No_23)~Button(No_32):割当無し
//ゲーム上でボタン割当時に表示される番号(多くは"1" から始まる) と Joystickのボタン番号("0" から始まる) の相関取り ************************************************************************
#define No_1 0
#define No_2 1
#define No_3 2
#define No_4 3
#define No_5 4
#define No_6 5
#define No_7 6
#define No_8 7
#define No_9 8
#define No_10 9
#define No_11 10
#define No_12 11
#define No_13 12
#define No_14 13
#define No_21 20
#define No_22 21
//Arduinoのピン定義(実機はPRO MICROを使用するが、WokwiではNANOを使う。) **************************************************************************************************************
#define LED 11 //for NANO //ボタンアサインモード中に発光するLEDのアノード端子側を接続
//#define LED 1 //for PRO MICRO
#define FP01 2 //for NANO //ウィンカーレバーのコネクタ1番ピン
//#define FP01 0 //for PRO MICRO
#define FP03 3 //for NANO //ウィンカーレバーのコネクタ3番ピン
//#define FP03 1 //for PRO MICRO
#define FP05 4 //ウィンカーレバーのコネクタ5番ピン
#define FP06 5 //ウィンカーレバーのコネクタ6番ピン
// FP07 GND2 //ウィンカーレバーのコネクタ7番ピン
#define FP08 6 //ウィンカーレバーのコネクタ8番ピン
#define FP09 7 //ウィンカーレバーのコネクタ9番ピン
#define FP10 8 //ウィンカーレバーのコネクタ10番ピン
#define FP11 9 //ウィンカーレバーのコネクタ11番ピン
#define WP04 0 //ワイパーレバーのコネクタ4番ピン
// WP05 GND1 //ワイパーレバーのコネクタ5番ピン
#define WP09 12 //for NANO //ワイパーレバーのコネクタ9番ピン
//#define WP09 21 //for PRO MICRO
#define WP10 13 //for NANO //ワイパーレバーのコネクタ10番ピン
//#define WP10 20 //for PRO MICRO
#define WBLACK 10 //ワイパーレバーの白コネクタ1番ピン(リード線:黒)
#define WPURPLE 16 //ワイパーレバーの白コネクタ2番ピン(リード線:紫)
#define WBROWN 14 //ワイパーレバーの白コネクタ3番ピン(リード線:茶)
#define WRED 15 //ワイパーレバーの白コネクタ4番ピン(リード線:赤)
#define WYELLOW 17 //for NANO //ワイパーレバーの白コネクタ5番ピン(リード線:黃)
//#define WYELLOW 18 //for PRO MICRO
#define WGREEN 1 //for NANO //ワイパーレバーの白コネクタ6番ピン(リード線:緑)
//#define WGREEN 19 //for PRO MICRO
// WWHITE GND3 //ワイパーレバーの白コネクタ7番ピン(リード線:白)
// SDA 18 //for NANO //LDCへのデータ出力ピン
// SDA 2 //for PRO MICRO
// SCL 19 //for NANO //LCDのクロック用出力ピン
// SCL 3 //for PRO MICRO
//各レバーやツマミのポジション状態に番号を振る*****************************************************************************************************************************************
#define light_off 1
#define light_auto 2
#define light_position 3
#define head_on 4
#define hibeam_on 5
#define passing_on 6
#define winker_left 7
#define winker_ctr 8
#define winker_right 9
#define fog_on 10
#define fwiper_mist 11
#define fwiper_off 12
#define fwiper_int 13
#define fwiper_lo 14
#define fwiper_hi 15
#define awiper_m2 16
#define awiper_m1 17
#define awiper_0 18
#define awiper_p1 19
#define awiper_p2 20
#define fwasher_on 21
#define rwiperwasher_on 22
#define rwiper_off 23
#define rwiper_int 24
#define rwiper_on 25
#define rwasher_on 26
//状態監視において一回前の値を保管するためのグローバル変数 *****************************************************************************************************************************
boolean gLastPASSING = false;
boolean gLastHIBEAM = false;
boolean gLastFOG = false;
boolean gLastWPULL = false;
boolean gLastHORN = false;
boolean gLastHAZARD = false;
int lightmode = 999; // 0:off 1:position 2: position +head on 8:auto
int winkermode = 999; // 0:センター 1:右折 2:左折
int fwipermode = 999; // 0:w-off 1:w-int 2:w-lo(w-mist) 3:w-hi
int awipermode = 999; // 0:AC(感度-2) 1:ACC(感度-1) 2:Dirt_Rally_2.0(感度標準) 3:ETS2(感度+1) 4:vacant(感度+2)
int rwipermode = 999; // 0:horn 1:--- 2:hazard 3:disable 4:read
boolean sgncancel = false; // 信号キャンセル false:キャンセルしない true:キャンセルする
boolean lever_chk = false; // レバー初期位置チェック false:未チェック true:チェック済み
boolean FLAG_BUTTONASSIGN = false; // ボタンアサインモード中は true
//その他の変数 *********************************************************************************************************************************************************************
unsigned long time_data = 2000000000; // ボタンアサインモード切替タイマー用
unsigned long time_data_2 = 2000000000; // ボタンアサインモード自動解除タイマー用
unsigned long time_w_int = 2000000000; // Dirt_Rally_2.0でW-INT(間欠ワイパー)を実現させるためのタイマー用
char game_0[] = "Assetto Corsa";
char game_1[] = "AssettoCorsaComp";
char game_2[] = "Dirt Rally 2.0";
char game_3[] = "EuroTruckSim 2";
char game_4[] = "(----------)";
char game_00[] = "<AC>";
char game_01[] = "<ACC>";
char game_02[] = "<DR2>";
char game_03[] = "<ETS2>";
char game_04[] = "<--->";
//初期設定 ************************************************************************************************************************************************************************
void setup() {
barInitPin();
lcd.begin(16, 2);
lcd.backlight();
//Joystick.begin();
}
//Arduinoのピンの初期化 ************************************************************************************************************************************************************
void barInitPin() {
pinMode(LED, OUTPUT);
pinMode(FP01, INPUT_PULLUP);
pinMode(FP03, INPUT_PULLUP);
pinMode(FP05, INPUT_PULLUP);
pinMode(FP06, INPUT_PULLUP);
pinMode(FP08, INPUT_PULLUP);
pinMode(FP09, INPUT_PULLUP);
pinMode(FP10, INPUT_PULLUP);
pinMode(FP11, INPUT_PULLUP);
pinMode(WP04, INPUT_PULLUP);
pinMode(WP09, INPUT_PULLUP);
pinMode(WP10, INPUT_PULLUP);
pinMode(WBLACK, INPUT_PULLUP);
pinMode(WPURPLE, INPUT_PULLUP);
pinMode(WBROWN, INPUT_PULLUP);
pinMode(WRED, INPUT_PULLUP);
pinMode(WYELLOW, INPUT_PULLUP);
pinMode(WGREEN, INPUT_PULLUP);
}
//メインループ ********************************************************************************************************************************************************************
void loop() {
barPOSIREAD(); //レバー状態読込(起動直後とボタンアサインモード中に実行。また、Rワイパーツマミで読込指示された際にも実行する。)
if (FLAG_BUTTONASSIGN == false){ //ボタンアサインモードのフラッグが立っていないとき、
barRW(); // Rワイパーのツマミを ホーン / ハザード / レバー入力無効化 / レバー状態読込 の選択に使用
if (sgncancel == false){ // 入力無効化が選択されていないとき(*)、
barLR(); // 方向指示器処理
barLM(); // ヘッドライト処理(ライトモード処理)
barPASSING(); // パッシング処理
barFOG(); // レインライト処理
barFW(); // Fワイパー処理
barHAZARD(); // ハザード処理(*ツマミ構造上、実際には入力無効化が選択されているはずはないが、、)
barHORN(); // ホーン処理(*ツマミ構造上、実際には入力無効化が選択されているはずはないが、、)
}
}
else { //ボタンアサインモードのフラッグが立っているとき、
lever_chk = false; // レバーチェックフラッグを一時的に解除
if (barPOSIREAD()){ // レバーやツマミのポジションが前回と異なっていたら
buttonASSIGN(); // ゲームへボタンをアサインする処理
}
}
if (sgncancel == false){ //(ボタンアサインモード中かどうかに関わらず、)入力無効化が選択されていないとき、
barAW(); // オートワイパー感度調整のツマミをゲーム種類の選択に使用
barFWASH(); // Fウォッシャー処理 (長押しでのボタンアサインモードへの切替処理を含む)
}
}
// LCDへゲームタイトルを表示させる **************************************************************************************************************************************************
void printLCD(char GAME_TITLE[]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("<GAME TITLE>");
lcd.setCursor(0, 1);
lcd.print(GAME_TITLE);
}
// LCDへゲームタイトルとアサインする機能を表示させる **********************************************************************************************************************************
void printLCD2(char GAME_TITLE[], char ASSIGN_FUNC[]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(GAME_TITLE);
lcd.setCursor(0, 1);
lcd.print(ASSIGN_FUNC);
}
// Joystick操作行をコメントアウトする代わりに、Joystickがアクティブな場合の振る舞いをLCDへ表示させる *************************************************************************************
void printLCD3(char BUTTON_NUM[], char FUNC[]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(BUTTON_NUM);
lcd.setCursor(0, 1);
lcd.print(FUNC);
}
//レバー&ツマミの各機能についてON/OFF状態を調べる関数(GJ2FW用ウィンカーレバー&ワイパーレバーの場合) **********************************************************************************
boolean checkupSWTCHES(int funcNAME) {
boolean RESULT;
switch (funcNAME) {
case light_off:
RESULT = digitalRead(FP01) == HIGH
&& digitalRead(FP03) == HIGH
&& digitalRead(FP05) == HIGH
&& digitalRead(FP06) == LOW
&& digitalRead(FP08) == HIGH
&& digitalRead(FP09) == HIGH
&& digitalRead(FP10) == HIGH
&& digitalRead(FP11) == HIGH;
break;
case light_auto:
RESULT = digitalRead(FP01) == HIGH
&& digitalRead(FP03) == HIGH
&& digitalRead(FP05) == HIGH
&& digitalRead(FP06) == HIGH
&& digitalRead(FP08) == HIGH
&& digitalRead(FP09) == HIGH
&& digitalRead(FP10) == HIGH
&& digitalRead(FP11) == HIGH;
break;
case light_position:
RESULT = digitalRead(FP01) == HIGH && digitalRead(FP08) == LOW;
break;
case head_on:
RESULT = digitalRead(FP01) == LOW && digitalRead(FP09) == HIGH;
break;
case hibeam_on:
RESULT = digitalRead(FP03) == LOW;
break;
case passing_on:
RESULT = digitalRead(FP09) == LOW;
break;
case winker_left:
RESULT = digitalRead(FP11) == LOW;
break;
case winker_ctr:
RESULT = digitalRead(FP10) == HIGH && digitalRead(FP11) == HIGH;
break;
case winker_right:
RESULT = digitalRead(FP10) == LOW;
break;
case fog_on:
RESULT = digitalRead(FP05) == LOW;
break;
case fwiper_mist:
RESULT = digitalRead(WP09) == HIGH && digitalRead(WP10) == LOW;
break;
case fwiper_off:
RESULT = digitalRead(WP09) == HIGH && digitalRead(WP10) == HIGH;
break;
case fwiper_int:
RESULT = digitalRead(WP09) == LOW && digitalRead(WP10) == HIGH;
break;
case fwiper_lo:
RESULT = digitalRead(WP09) == HIGH && digitalRead(WP10) == LOW;
break;
case fwiper_hi:
RESULT = digitalRead(WP09) == LOW && digitalRead(WP10) == LOW;
break;
case awiper_m2:
RESULT = digitalRead(WBLACK) == LOW && digitalRead(WPURPLE) == LOW && digitalRead(WBROWN) == LOW;
break;
case awiper_m1:
RESULT = digitalRead(WBLACK) == LOW && digitalRead(WPURPLE) == HIGH && digitalRead(WBROWN) == LOW;
break;
case awiper_0:
RESULT = digitalRead(WBLACK) == LOW && digitalRead(WPURPLE) == HIGH && digitalRead(WBROWN) == HIGH;
break;
case awiper_p1:
RESULT = digitalRead(WBLACK) == LOW && digitalRead(WPURPLE) == LOW && digitalRead(WBROWN) == HIGH;
break;
case awiper_p2:
RESULT = digitalRead(WBLACK) == HIGH && digitalRead(WPURPLE) == LOW && digitalRead(WBROWN) == HIGH;
break;
case fwasher_on:
RESULT = digitalRead(WP04) == LOW;
break;
case rwiperwasher_on:
RESULT = digitalRead(WRED) == LOW && digitalRead(WYELLOW) == HIGH && digitalRead(WGREEN) == HIGH;
break;
case rwiper_off:
RESULT = digitalRead(WRED) == HIGH && digitalRead(WYELLOW) == HIGH && digitalRead(WGREEN) == HIGH;
break;
case rwiper_int:
RESULT = digitalRead(WRED) == HIGH && digitalRead(WYELLOW) == HIGH && digitalRead(WGREEN) == LOW;
break;
case rwiper_on:
RESULT = digitalRead(WRED) == HIGH && digitalRead(WYELLOW) == LOW && digitalRead(WGREEN) == HIGH;
break;
case rwasher_on:
RESULT = digitalRead(WRED) == LOW && digitalRead(WYELLOW) == LOW && digitalRead(WGREEN) == HIGH;
break;
}
return RESULT;
}
// // ジョイスティックボタンを操作する関数(SWITCH_TYPE 0:press&release 1:press only -1:release only ) **************************************************************************
// void operateJOYBUTTON(int SWITCH_TYPE, int NUM_BUTTON, int NUM_REPETITION, int MS_DELAY_1, int MS_DELAY_2 = 0) {
// int n;
// while (n <= NUM_REPETITION) {
// switch (SWITCH_TYPE) {
// case 0:
// Joystick.pressButton(NUM_BUTTON);
// delay(MS_DELAY_1);
// Joystick.releaseButton(NUM_BUTTON);
// if(NUM_REPETITION >= 2 && n < NUM_REPETITION){
// delay(MS_DELAY_1);
// }
// break;
// case 1:
// Joystick.pressButton(NUM_BUTTON);
// break;
// case -1:
// Joystick.releaseButton(NUM_BUTTON);
// break;
// }
// delay(MS_DELAY_2);
// n++;
// }
// }
//レバー&ツマミのポジションを読み取りArduino内のモードをそれに合わせる ****************************************************************************************************************
boolean barPOSIREAD() {
boolean LEVERCHANGED = false;
if (checkupSWTCHES(rwasher_on) || lever_chk == false) {
//ライトのモード合わせ ------------------------------------------------------------------------------------------------
int VAL_LIGHTMODE = 999;
if (checkupSWTCHES(light_off)) {
VAL_LIGHTMODE = 0;
} else if (checkupSWTCHES(light_auto)) {
VAL_LIGHTMODE = 8;
} else if (checkupSWTCHES(light_position)) {
VAL_LIGHTMODE = 1;
} else if (checkupSWTCHES(head_on)) {
VAL_LIGHTMODE = 2;
}
if (VAL_LIGHTMODE != lightmode){
LEVERCHANGED = true;
lightmode = VAL_LIGHTMODE;
}
//ハイビームON/OFFのモード合わせ ---------------------------------------------------------------------------------------
//gLastHIBEAM = false ;LOビーム ,gLastHIBEAM = true ;HIビーム
boolean FLAG_HIBEAM = false;
FLAG_HIBEAM = checkupSWTCHES(hibeam_on);
if (FLAG_HIBEAM != gLastHIBEAM){
LEVERCHANGED = true;
gLastHIBEAM = FLAG_HIBEAM;
}
//パッシングON/OFFのモード合わせ ----------------------------------------------------------------------------------------
boolean FLAG_PASSING = false;
FLAG_PASSING = checkupSWTCHES(passing_on);
if (FLAG_PASSING != gLastPASSING){
LEVERCHANGED = true;
gLastPASSING = FLAG_PASSING;
}
//ウインカーのモード合わせ -----------------------------------------------------------------------------------------------
int VAL_WINKERMODE = 999;
if (checkupSWTCHES(winker_ctr)) {
VAL_WINKERMODE = 0; //センター
} else if (checkupSWTCHES(winker_right)) {
VAL_WINKERMODE = 1; //右折
} else if (checkupSWTCHES(winker_left)) {
VAL_WINKERMODE = 2; //左折
}
if (VAL_WINKERMODE != winkermode){
LEVERCHANGED = true;
winkermode = VAL_WINKERMODE;
}
//フォグランプON/OFFのモード合わせ ----------------------------------------------------------------------------------------
boolean FLAG_FOG = false;
FLAG_FOG = checkupSWTCHES(fog_on);
if (FLAG_FOG != gLastFOG){
LEVERCHANGED = true;
gLastFOG = FLAG_FOG;
}
//Fワイパーのモード合わせ -------------------------------------------------------------------------------------------------
int VAL_FWIPERMODE = 999;
if (checkupSWTCHES(fwiper_off)) {
VAL_FWIPERMODE = 0; //w-off
} else if (checkupSWTCHES(fwiper_int)) {
VAL_FWIPERMODE = 1; //w-int
} else if (checkupSWTCHES(fwiper_lo)) {
VAL_FWIPERMODE = 2; //w-lo (w-mist)
} else if (checkupSWTCHES(fwiper_hi)) {
VAL_FWIPERMODE = 3; //w-hi
}
if (VAL_FWIPERMODE != fwipermode){
LEVERCHANGED = true;
fwipermode = VAL_FWIPERMODE;
}
//Fウォッシャーのモード合わせ -----------------------------------------------------------------------------------------------
boolean FLAG_WPULL = false;
FLAG_WPULL = checkupSWTCHES(fwasher_on);
if (FLAG_WPULL != gLastWPULL){
LEVERCHANGED = true;
gLastWPULL = FLAG_WPULL;
}
//オートワイパーのモード合わせ -----------------------------------------------------------------------------------------------
// awipermode = 0:AC awipermode = 1:ACC awipermode = 2:Dirt_Rally_2.0 awipermode = 3:ETS2 awipermode = 4:vacant
int VAL_AWIPERMODE = 999;
if (checkupSWTCHES(awiper_m2)) {
VAL_AWIPERMODE = 0; // AC
} else if (checkupSWTCHES(awiper_m1)) {
VAL_AWIPERMODE = 1; // ACC
} else if (checkupSWTCHES(awiper_0)) {
VAL_AWIPERMODE = 2; // Dirt_Rally_2.0
} else if (checkupSWTCHES(awiper_p1)) {
VAL_AWIPERMODE = 3; // ETS2
} else if (checkupSWTCHES(awiper_p2)) {
VAL_AWIPERMODE = 4; // vacant
}
if (VAL_AWIPERMODE != awipermode){
LEVERCHANGED = true;
awipermode = VAL_AWIPERMODE;
if (awipermode == 0) {
printLCD(game_0);
} else if (awipermode == 1) {
printLCD(game_1);
} else if (awipermode == 2) {
printLCD(game_2);
} else if (awipermode == 3) {
printLCD(game_3);
} else if (awipermode == 4) {
printLCD(game_4);
}
}
//Rワイパーツマミのモード合わせ -----------------------------------------------------------------------------------------------
if (lever_chk == false) {
int VAL_RWIPERMODE = 999;
if (checkupSWTCHES(rwiperwasher_on)) {
sgncancel = false;
gLastHORN = LOW; //horn
VAL_RWIPERMODE = 0;
} else if (checkupSWTCHES(rwiper_off)) {
sgncancel = false;
VAL_RWIPERMODE = 1;
} else if (checkupSWTCHES(rwiper_int)) {
sgncancel = false;
gLastHAZARD = LOW; //hazard
VAL_RWIPERMODE = 2;
} else if (checkupSWTCHES(rwiper_on)) {
sgncancel = true; //disable
VAL_RWIPERMODE = 3;
} else if (checkupSWTCHES(rwasher_on)) {
sgncancel = false;
VAL_RWIPERMODE = 4;
}
if (VAL_RWIPERMODE != rwipermode){
LEVERCHANGED = true;
rwipermode = VAL_RWIPERMODE;
}
}
lever_chk = true;
return LEVERCHANGED;
}
}
//レバー&ツマミ入力有効/無効の切替処理 ********************************************************************************************************************************************
void barRW() {
sgncancel = false; //レバー&ツマミ入力有効
if (checkupSWTCHES(rwiper_on)) { //RワイパーONのとき(レバー&ツマミ入力無効化が選択されているとき)
sgncancel = true; // レバー&ツマミ入力無効
}
}
//オートワイパー処理 (オートワイパー感度ツマミをゲーム種類の選択に使用) ***************************************************************************************************************
void barAW() {
int VAL_AWIPERMODE = 999;
if (checkupSWTCHES(awiper_m2)) {
VAL_AWIPERMODE = 0; //感度: -2 (AC)
} else if (checkupSWTCHES(awiper_m1)) {
VAL_AWIPERMODE = 1; //感度: -1 (ACC)
} else if (checkupSWTCHES(awiper_0)) {
VAL_AWIPERMODE = 2; //感度: +/- 0 (Dirt Rally 2.0)
} else if (checkupSWTCHES(awiper_p1)) {
VAL_AWIPERMODE = 3; //感度: +1 (ETS2)
} else if (checkupSWTCHES(awiper_p2)) {
VAL_AWIPERMODE = 4; //感度: +2 (vacant)
}
if (VAL_AWIPERMODE != awipermode) { //オートワイパー感度ツマミをひねったとき
if (VAL_AWIPERMODE == 0) { // 今回 感度: -2 のとき、
awipermode = 0; // AC
printLCD(game_0); //
} else if (VAL_AWIPERMODE == 1) { // 今回 感度: -1 のとき、
awipermode = 1; // ACC
printLCD(game_1); //
} else if (VAL_AWIPERMODE == 2) { // 今回 感度: +/-0 のとき、
awipermode = 2; // Dirt Rally 2.0
printLCD(game_2); //
} else if (VAL_AWIPERMODE == 3) { // 今回 感度: +1 のとき、
awipermode = 3; // ETS2
printLCD(game_3); //
} else if (VAL_AWIPERMODE == 4) { // 今回 感度: +2 のとき、
awipermode = 4; // vacant
printLCD(game_4); //
}
delay(10);
}
}
//ボタンアサインモード(ゲームにボタンの割当を行うためのモード) ************************************************************************************************************************
// なお、割当を行う際には対象以外のポジション(レバーやツマミの位置)はOFFや中立に戻しておくこと!(例:ウインカーレバーを右折にしたままではパッシングの割当等はできない。)
void buttonASSIGN() {
if (checkupSWTCHES(awiper_m2)) { // ■ Assetto Corsa ----------------------------------------------
printLCD2(game_00, "-------"); // LCDに無割当を表示
if (checkupSWTCHES(winker_left)) { // 方向指示器が左折になったら、
printLCD2(game_00, "turn left"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき、
//operateJOYBUTTON(0 , No_2 , 1 , 300 , 0); // 左折割当
printLCD3("Button2","pressed"); //
} //
} else if (checkupSWTCHES(winker_right)) { // 方向指示器が右折になったら、
printLCD2(game_00, "turn right"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき、
//operateJOYBUTTON(0 , No_1 , 1 , 300 , 0); // 右折割当
printLCD3("Button1","pressed"); //
} //
} else if (checkupSWTCHES(winker_ctr)) { // 方向指示器がOFFのとき、
if (checkupSWTCHES(passing_on)) { // パッシングがONになったら、
printLCD2(game_00, "passing"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき、
//operateJOYBUTTON(0 , No_5 , 1 , 300 , 0); // パッシング割当
printLCD3("Button5","pressed"); //
} //
} else if (checkupSWTCHES(head_on)) { // head onになったら、
printLCD2(game_00, "head light"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき、
//operateJOYBUTTON(0 , No_3 , 1 , 300 , 0); // ヘッドライト割当
printLCD3("Button3","pressed"); //
} //
} else if (checkupSWTCHES(hibeam_on)) { // HIビームになったら、
printLCD2(game_00, "hi beam"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき、
//operateJOYBUTTON(0 , No_4 , 1 , 300 , 0); // ハイビーム割当
printLCD3("Button4","pressed"); //
} //
} else if (checkupSWTCHES(rwiper_int)) { // ハザードがONになったら、
printLCD2(game_00, "hazard"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_21 , 1 , 300 , 0); // ハザード割当
printLCD3("Button21","pressed"); //
} //
} else if (checkupSWTCHES(fwiper_hi)) { // w-hiになったら、
printLCD2(game_00, "Sp up wps"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_9 , 1 , 300 , 0); // Speed up wipers割当
printLCD3("Button9","pressed"); //
} //
} else if (checkupSWTCHES(fwiper_lo)) { // w-loになったら、
printLCD2(game_00, "Sl down wps"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_10 , 1 , 300 , 0); // Slow down wipers 割当
printLCD3("Button10","pressed"); //
} //
}
}
} else if (checkupSWTCHES(awiper_m1)) { // ■ ACC ---------------------------------------------------------
printLCD2(game_01, "-------"); // LCDに無割当を表示
if (checkupSWTCHES(winker_left)) { // 方向指示器が左折になったら、
printLCD2(game_01, "turn left"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_2 , 1 , 300 , 0); // 左折割当
printLCD3("Button2","pressed"); //
} //
} else if (checkupSWTCHES(winker_right)) { // 方向指示器が右折になったら、
printLCD2(game_01, "turn right"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_1 , 1 , 300 , 0); // 右折割当
printLCD3("Button1","pressed"); //
} //
} else if (checkupSWTCHES(winker_ctr)) { // 方向指示器がOFFのとき、
if (checkupSWTCHES(passing_on)) { // パッシングがONになったら、
printLCD2(game_01, "passing"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_4 , 1 , 300 , 0); // パッシング割当
printLCD3("Button4","pressed"); //
} //
} else if (checkupSWTCHES(head_on)) { // head on(not passing)になったら
printLCD2(game_01, "head light"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_3 , 1 , 300 , 0); // ヘッドライト割当
printLCD3("Button3","pressed"); //
} //
} else if (checkupSWTCHES(fog_on)) { // fog lamp on になったら、
printLCD2(game_01, "fog on"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_6 , 1 , 300 , 0); // レインライト割当
printLCD3("Button6","pressed"); //
} //
} else if (checkupSWTCHES(fwiper_lo) ||
checkupSWTCHES(fwiper_hi)) { // w-lo or w-hi になったら、
printLCD2(game_01, "wiper"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_9 , 1 , 300 , 0); // ワイパー割当
printLCD3("Button9","pressed"); //
} //
}
}
} else if (checkupSWTCHES(awiper_0)) { // ■ Dirt_Rally_2.0 ----------------------------------------------
printLCD2(game_02, "-------"); // LCDに無割当を表示
if (checkupSWTCHES(head_on)) { // head onになったら、
printLCD2(game_02, "head light"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_3 , 1 , 300 , 0); // ヘッドライト割当
printLCD3("Button3","pressed"); //
}
} else if (checkupSWTCHES(fwiper_lo) ||
checkupSWTCHES(fwiper_hi)) { // w-lo or w-hi になったら、
printLCD2(game_02, "wiper"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_9 , 1 , 300 , 0); // ワイパー割当
printLCD3("Button9","pressed"); //
}
}
} else if (checkupSWTCHES(awiper_p1)) { // ■ ETS2 ---------------------------------------------------------
printLCD2(game_03, "-------"); // LCDに無割当を表示
if (checkupSWTCHES(winker_left)) { // 方向指示器が左折になったとき、
printLCD2(game_03, "turn left"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_2 , 1 , 300 , 0); // 左折割当
printLCD3("Button2","pressed"); //
} //
} else if (checkupSWTCHES(winker_right)) { // 方向指示器が右折になったら、
printLCD2(game_03, "turn right"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_1 , 1 , 300 , 0); // 右折割当
printLCD3("Button1","pressed"); //
}
} else if (checkupSWTCHES(winker_ctr)) { // 方向指示器がOFFのとき、
if (checkupSWTCHES(passing_on)) { // パッシングがONになったら、
printLCD2(game_03, "passing on"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_5 , 1 , 300 , 0); // パッシング割当
printLCD3("Button5","pressed"); //
} //
} else if (checkupSWTCHES(head_on)) { // head onになったら、
printLCD2(game_03, "head light"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_3 , 1 , 300 , 0); // ヘッドライト割当
printLCD3("Button3","pressed"); //
} //
} else if (checkupSWTCHES(hibeam_on)) { // HIビームになったら、
printLCD2(game_03, "hi-beam"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_4 , 1 , 300 , 0); // ハイビーム割当
printLCD3("Button4","pressed"); //
} //
} else if (checkupSWTCHES(rwiper_int)) { // ハザードがONになったら、
printLCD2(game_03, "hazard"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_21 , 1 , 300 , 0); // ハザード割当
printLCD3("Button21","pressed"); //
} //
} else if (checkupSWTCHES(rwiperwasher_on)) { // ホーンがONになったら、
printLCD2(game_03, "horn"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_22 , 1 , 300 , 0); // ホーン割当
printLCD3("Button22","pressed"); //
} //
} else if (checkupSWTCHES(fwiper_hi)) { // w-hiになったら、
printLCD2(game_03, "Sp up wipers"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_9 , 1 , 300 , 0); // ワイパー割当
printLCD3("Button9","pressed"); //
} //
} else if (checkupSWTCHES(fwiper_lo)) { // w-loになったら、
printLCD2(game_03, "Sl down wipers"); // LCDに表示
if (checkupSWTCHES(fwasher_on)){ // FウォッシャーSWがONのとき
//operateJOYBUTTON(0 , No_10 , 1 , 300 , 0); // ワイパーを1段戻す割当
printLCD3("Button10","pressed"); //
}
}
}
} else if (checkupSWTCHES(awiper_p2)){ // ■ vacant ----------------------------------------------------------------------------------
printLCD2(game_04, "-------"); // LCDに無割当を表示
// 割当無し
}
delay(300);
}
//方向指示器処理 *******************************************************************************************************************************************************************
void barLR() {
int VAL_WINKERMODE = 999;
if (checkupSWTCHES(winker_ctr)) {
VAL_WINKERMODE = 0; //センター
} else if (checkupSWTCHES(winker_right)) {
VAL_WINKERMODE = 1; //右折
} else if (checkupSWTCHES(winker_left)) {
VAL_WINKERMODE = 2; //左折
}
if (winkermode == 0) { //★前回がセンター
if (VAL_WINKERMODE == 1) { // ☆今回のレバー位置:右折
//operateJOYBUTTON(0 , No_1 , 1 , 100 , 0); // No.1ボタンを押して離す(センター ⇒ 右折)
printLCD3("Button1","wkr-right"); //
winkermode = 1; // ウィンカーモードを更新
} else if (VAL_WINKERMODE == 2) { // ☆今回のレバー位置:左折
//operateJOYBUTTON(0 , No_2 , 1 , 100 , 0); // No.2ボタンを押して離す(センター ⇒ 左折)
printLCD3("Button2","wkr-left"); //
winkermode = 2; // ウィンカーモードを更新
}
} else if (winkermode == 1) { //★前回が右折
if (VAL_WINKERMODE == 0) { // ☆今回のレバー位置:センター
//operateJOYBUTTON(0 , No_1 , 1 , 100 , 0); // No.1ボタンを押して離す(右折 ⇒ センター)
printLCD3("Button1","wkr-ctr"); //
winkermode = 0; // ウィンカーモードを更新
}
} else if (winkermode == 2) { //★前回が左折
if (VAL_WINKERMODE == 0) { // ☆今回のレバー位置:センター
//operateJOYBUTTON(0 , No_2 , 1 , 100 , 0); // No.2ボタンを押して離す(左折 ⇒ センター)
printLCD3("Button2","wkr-ctr"); //
winkermode = 0; // ウィンカーモードを更新
}
}
delay(10);
}
//パッシング処理 *******************************************************************************************************************************************************************
void barPASSING() {
boolean FLAG_PASSING = checkupSWTCHES(passing_on);
if (awipermode == 0) { // ■ Assetto Corsa のとき(フラッシュヘッドライト)------------------------------------------
if (gLastPASSING != FLAG_PASSING) { // パッシングSWが切り替わったとき、
if (FLAG_PASSING == true) { // パッシングがONのとき、
//operateJOYBUTTON(1 , No_5 , 1 , 0 , 0); // No.5ボタンを押す
printLCD3("Button5","passing-on(AC)"); //
} //
else { // パッシングがOFFになったとき、
//operateJOYBUTTON(-1 , No_5 , 1 , 0 , 0); // No.5ボタンを離す
printLCD3("Button5","passing-off(AC)"); //
} //
delay(100); //
gLastPASSING = FLAG_PASSING; //
}
} else if (awipermode == 1) { // ■ ACC のとき(ボタンを押して離した瞬間をトリガーに5回ほど短く点滅する)----------------------
if (gLastPASSING != FLAG_PASSING) { // パッシングSWが切り替わったとき、
if (FLAG_PASSING == true) { // パッシングがONのとき、
//operateJOYBUTTON(0 , No_5 , 1 , 100 , 0); // No.5ボタンを押して離す
printLCD3("Button5","passing-on(ACC)"); //
} //
gLastPASSING = FLAG_PASSING; //
}
} else if (awipermode == 2) { // ■ Dirt_Rally_2.0 のとき(ボタンを押した瞬間をトリガーにヘッドライトON⇔OFFの繰り返し)--------
if (gLastPASSING != FLAG_PASSING) { // パッシングSWが切り替わったとき、
if (lightmode != 2) { // ヘッドライトがOFFのとき、
//operateJOYBUTTON(0 , No_3 , 1 , 100 , 0); // No.3ボタンを押して離す
lcd.clear(); //
delay(100); //
printLCD3("Button3","pass-on/off(dr2)"); //
} //
gLastPASSING = FLAG_PASSING; //
}
} else if (awipermode == 3) { // ■ ETS2 のとき--------------------------------------------------------------------------
if (gLastPASSING != FLAG_PASSING) { // パッシングSWが切り替わったとき、
if (FLAG_PASSING == true) { // パッシングがONのとき、
//operateJOYBUTTON(1 , No_5 , 1 , 0 , 0); // No.5ボタンを押す
printLCD3("Button5","passing-on(ETS)"); //
} //
else { // パッシングがOFFになったとき、
//operateJOYBUTTON(-1 , No_5 , 1 , 0 , 0); // No.5ボタンを離す
printLCD3("REL Button5","passing-off(ETS)"); //
} //
delay(100); //
gLastPASSING = FLAG_PASSING; //
}
}
delay(10);
}
//ヘッドライト処理(ライトモード処理 & ハイビーム処理) *******************************************************************************************************************************
void barLM() {
int VAL_LIGHTMODE = 999;
if (checkupSWTCHES(light_off)) {
VAL_LIGHTMODE = 0; //off
} else if (checkupSWTCHES(light_auto)) {
VAL_LIGHTMODE = 8; //auto
} else if (checkupSWTCHES(light_position)) {
VAL_LIGHTMODE = 1; //position
} else if (checkupSWTCHES(head_on)) {
VAL_LIGHTMODE = 2; //head on
}
boolean FLAG_HIBEAM = checkupSWTCHES(hibeam_on); //FLAG_HIBEAM == true はハイビームON
if (awipermode == 2 || awipermode == 1 || awipermode == 0) { // ■ Dirt Rally 2.0 または ACC または AC のとき-----------------------------------------
if (lightmode == 0) { // ★前回がライトOFF
if (VAL_LIGHTMODE == 8) { // ☆ 今回のツマミ位置:AUTO
printLCD3("No opr","(auto(not lit))"); //
lightmode = 8; // ライトモードのみ切替
}
} else if (lightmode == 8) { // ★前回がライトAUTO(ライト不点灯)
if (VAL_LIGHTMODE == 1) { // ☆ 今回のツマミ位置:POSITION
printLCD3("No opr","(light-posi)"); //
lightmode = 1; // ライトモードのみ切替
} else if (VAL_LIGHTMODE == 0) { // ☆ 今回のツマミ位置:OFF
printLCD3("No opr","(light-off)"); //
lightmode = 0; // ライトモードのみ切替
}
} else if (lightmode == 1) { // ★前回がPOSITION(ライト不点灯)
if (VAL_LIGHTMODE == 2) { // ☆ 今回のツマミ位置:HEAD ON
//operateJOYBUTTON(0 , No_3 , 1 , 100 , 0); // POSITION(ライト不点灯) ⇒ ヘッドライトON (Dirt Rally 2.0はpressの瞬間、ACCはreleaseの瞬間にて)
printLCD3("Button3","light-on"); //
lightmode = 2; // ライトモード切替
} else if (VAL_LIGHTMODE == 8) { // ☆ 今回のツマミ位置:AUTO
printLCD3("No opr","(auto(not lit))"); //
lightmode = 8; // ライトモードのみ切替(ライトは不点灯のまま)
}
} else if (lightmode == 2) { // ★前回がHEAD ON
if (VAL_LIGHTMODE == 1) { // ☆ 今回のツマミ位置:POSITION(ライト不点灯)
//operateJOYBUTTON(0 , No_3 , 1 , 100 , 0); // ヘッドライトON ⇒ ライトOFF (Dirt Rally 2.0はpressの瞬間、ACCはreleaseの瞬間にて)
printLCD3("Button3","light-off"); //
lightmode = 1; // ライトモード切替
}
}
if (gLastHIBEAM != FLAG_HIBEAM && awipermode == 0) { // ★HI/LOレバー位置が前回から変わったとき、(for AC)
if (VAL_LIGHTMODE == 2) { // ☆ 今回のツマミ位置:HEAD ON
//operateJOYBUTTON(0 , No_4 , 1 , 100 , 0); // HIビーム ON ⇔ OFF 切替
lcd.clear(); //
delay(100); //
printLCD3("Button4","beam-flip"); //
gLastHIBEAM = FLAG_HIBEAM; //
}
}
} else if (awipermode == 3) { // ■ ETS2 のとき-------------------------------------------------------------------------
if (lightmode == 0) { // ★ 前回がライトOFF
if (VAL_LIGHTMODE == 8) { // ☆ 今回のツマミ位置:AUTO
printLCD3("No opr","(auto(not lit))"); //
lightmode = 8; // ライトモードのみ切替
}
} else if (lightmode == 8) { // ★ 前回がライトAUTO(ライト不点灯)
if (VAL_LIGHTMODE == 1) { // ☆ 今回のツマミ位置:POSITION
//operateJOYBUTTON(0 , No_3 , 1 , 10 , 0); // AUTO ⇒ ポジション
printLCD3("Button3","position-on"); //
lightmode = 1; // ライトモード切替
} else if (VAL_LIGHTMODE == 0) { // ☆ 今回のツマミ位置:OFF
printLCD3("No opr","(light-off)"); //
lightmode = 0; // ライトモードのみ切替
}
} else if (lightmode == 1) { // ★ 前回がライトPOSITION
if (VAL_LIGHTMODE == 2) { // ☆ 今回のツマミ位置:HEAD ON
//operateJOYBUTTON(0 , No_3 , 1 , 10 , 0); // ポジション ⇒ ヘッドライトON
printLCD3("Button3","light-on"); //
lightmode = 2; // ライトモード切替
} else if (VAL_LIGHTMODE == 8) { // ☆ 今回のツマミ位置:AUTO
//operateJOYBUTTON(0 , No_3 , 2 , 10 , 0); // ポジション ⇒ ヘッドライトON ⇒ ライトOFF
printLCD3("B3:(light-on)","B3:light-off"); //
lightmode = 8; // ライトモード切替
}
} else if (lightmode == 2) { // ★ 前回がHEAD ON
if (VAL_LIGHTMODE == 1) { // ☆ 今回のツマミ位置:POSITION
//operateJOYBUTTON(0 , No_3 , 2 , 10 , 0); // ヘッドライトON ⇒ ライトOFF ⇒ ポジション
printLCD3("B3:(light-off)","B3:light-posi"); //
lightmode = 1; // ライトモード切替
}
}
if (gLastHIBEAM != FLAG_HIBEAM) { // ★HI/LOレバー位置が前回から変わったとき、
if (VAL_LIGHTMODE == 2) { // ☆ 今回のツマミ位置:HEAD ON
//operateJOYBUTTON(0 , No_4 , 1 , 10 , 0); // HIビーム ON ⇔ OFF 切替
lcd.clear(); //
delay(100); //
printLCD3("Button4","beam-flip"); //
gLastHIBEAM = FLAG_HIBEAM; //
}
}
}
delay(10);
}
//レインライト処理 for ACC(押すたびにON ⇔ OFF繰り返し) ****************************************************************************************************************************
void barFOG() {
boolean FLAG_FOG = checkupSWTCHES(fog_on);
if (gLastFOG != FLAG_FOG) {
//operateJOYBUTTON(0 , No_6 , 1 , 100 , 0);
lcd.clear();
delay(100);
printLCD3("Button6","rainlight on/off");
gLastFOG = FLAG_FOG;
}
delay(10);
}
//ハザード処理 for ETS2(押すたびにON ⇔ OFF繰り返し) ******************************************************************************************************************************
void barHAZARD() {
boolean FLAG_HAZARD = checkupSWTCHES(rwiper_int);
if (gLastHAZARD != FLAG_HAZARD) {
//operateJOYBUTTON(0 , No_21 , 1 , 100 , 0);
lcd.clear();
delay(100);
printLCD3("Button21","hazard on/off");
gLastHAZARD = FLAG_HAZARD;
}
delay(10);
}
//ホーン処理 for ETS2 (押している間はON、離すとOFF) ********************************************************************************************************************************
void barHORN() {
boolean FLAG_HORN = false;
if (checkupSWTCHES(rwiperwasher_on)) {
FLAG_HORN = true; // FLAG_HORN == true はホーンON
}
if (gLastHORN != FLAG_HORN) { //ホーンのON/OFFに変化があったとき、
if (FLAG_HORN == true) { // ホーンがONのとき、
//operateJOYBUTTON(1 , No_22 , 1 , 0 , 0); // ホーンON
printLCD3("PRS Button22","horn on"); //
} //
else { // ホーンがOFFのとき、
//operateJOYBUTTON(-1 , No_22 , 1 , 0 , 0); // ホーンOFF
printLCD3("REL Button22","horn off"); //
} //
delay(100); //
gLastHORN = FLAG_HORN; //
}
}
//Fウォッシャー処理(長押しでのボタンアサインモードへの切替処理を含む) ******************************************************************************************************************
void barFWASH() {
boolean FLAG_WPULL = checkupSWTCHES(fwasher_on);
if (gLastWPULL != FLAG_WPULL) { //Fウォッシャーレバー位置に変化があったとき、
if (FLAG_WPULL == true) { // FウォッシャーONのとき(ワイパーレバーを手前に引いているとき)、
if (FLAG_BUTTONASSIGN == false) { // ボタンアサインモード中でないとき、
//operateJOYBUTTON(1 , No_13 , 1 , 0 , 0); // FウォッシャーON
printLCD3("PRS Button13","wsh-on"); //
} //
time_data = millis(); // タイマー計測開始
} //
else { // FウォッシャーOFFのとき(ワイパーレバーを手前に引いていないとき)、
if (FLAG_BUTTONASSIGN == false) { // ボタンアサインモード中でないとき、
//operateJOYBUTTON(-1 , No_13 , 1 , 0 , 0); // FウォッシャーOFF
printLCD3("REL Button13","wsh-off"); //
} //
if (millis() - time_data > 5000) { // もし現在時刻がFウォッシャーON時に記録した時刻から 5秒 を超えて経過していたら
FLAG_BUTTONASSIGN = !FLAG_BUTTONASSIGN; // ボタンアサインモードのフラッグを切り替える
digitalWrite(LED, FLAG_BUTTONASSIGN); // LED のON⇔OFFを切り替える
time_data_2 = millis(); // タイマー2の計測開始
} //
} //
delay(100); //
gLastWPULL = FLAG_WPULL; //
}
if (FLAG_BUTTONASSIGN == true) {
if (millis() - time_data_2 > 5 * 60000) { // もし現在時刻がフラッグ切替時に記録した時刻から5分経過したら
FLAG_BUTTONASSIGN = false; // ボタンアサインモードのフラッグをOFFにする(モード戻し忘れ防止用)
digitalWrite(LED, LOW); // LED をOFFする
}
}
}
//Fワイパー処理 *******************************************************************************************************************************************************************
void barFW() {
int VAL_FWIPERMODE = 999;
if (checkupSWTCHES(fwiper_off)) {
VAL_FWIPERMODE = 0; //w-off
} else if (checkupSWTCHES(fwiper_int)) {
VAL_FWIPERMODE = 1; //w-int
} else if (checkupSWTCHES(fwiper_lo)) {
VAL_FWIPERMODE = 2; //w-lo(mist)
} else if (checkupSWTCHES(fwiper_hi)) {
VAL_FWIPERMODE = 3; //w-hi
}
if (awipermode == 0) { // ■ Assetto Corsa のとき-----------------------------------------------------------------------
if (fwipermode == 0) { // ★前回が w-off のとき、
if (VAL_FWIPERMODE == 1) { // ☆ 今回 w-int のとき、
//operateJOYBUTTON(0 , No_9 , 1 , 50 , 0); // FワイパーOFF ⇒ INT
printLCD3("Button9","wp-int"); //
fwipermode = 1; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 2) { // ☆ 今回 w-lo(実際にはMIST) のとき、
//operateJOYBUTTON(0 , No_9 , 2 , 50 , 0); // FワイパーOFF ⇒ INT ⇒ LO(実際にはMIST)
printLCD3("B9:(wp-int)","B9:wp-lo(mist)"); //
fwipermode = 2; // フロントワイパーモード切替
}
} else if (fwipermode == 1) { // ★前回が w-intのとき、
if (VAL_FWIPERMODE == 2) { // ☆ 今回 w-lo のとき、
//operateJOYBUTTON(0 , No_9 , 1 , 50 , 0); // FワイパーINT ⇒ LO
printLCD3("Button9","wp-lo"); //
fwipermode = 2; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE = 0) { // ☆ 今回 w-off のとき、
//operateJOYBUTTON(0 , No_10 , 1 , 50 , 0); // FワイパーINT ⇒ OFF
printLCD3("Button10","wp-off"); //
fwipermode = 0; // フロントワイパーモード切替
}
} else if (fwipermode == 2) { // ★前回がw-loのとき、(MISTの場合もある)
if (VAL_FWIPERMODE == 3) { // ☆ 今回 w-hi のとき、
//operateJOYBUTTON(0 , No_9 , 2 , 50 , 0); // FワイパーLO(MIST) ⇒ MID ⇒ HI
printLCD3("B9:(wp-mid)","B9:wp-hi"); //
fwipermode = 3; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 1) { // ☆ 今回 w-int のとき、
//operateJOYBUTTON(0 , No_10 , 1 , 50 , 0); // FワイパーLO ⇒ INT
printLCD3("Button10","wp-int"); //
fwipermode = 1; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 0) { // ☆ 今回 w-off のとき(前回MISTで今回off)、
//operateJOYBUTTON(0 , No_10 , 2 , 50 , 0); // FワイパーLO ⇒ INT ⇒ OFF
printLCD3("B10:(wp-int)","B10:wp-off"); //
fwipermode = 0; // フロントワイパーモード切替
}
} else if (fwipermode == 3) { // ★前回がw-hiのとき、
if (VAL_FWIPERMODE == 2) { // ☆ 今回 w-lo のとき、
//operateJOYBUTTON(0 , No_10 , 2 , 50 , 0); // FワイパーHI ⇒ MID ⇒ LO
printLCD3("B10:(wp-mid)","B10:wp-lo"); //
fwipermode = 2; // フロントワイパーモード切替
}
}
delay(50); //
} else if (awipermode == 1) { // ■ ACC のとき---------------------------------------------------------------------------------
if (fwipermode == 0) { // ★前回が、w-off
if (VAL_FWIPERMODE == 1) { // ☆ 今回、w-int
//operateJOYBUTTON(0 , No_9 , 1 , 10 , 0); // FワイパーOFF ⇒ INT
printLCD3("Button9","wp-int"); //
fwipermode = 1; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 2) { // ☆ 今回、w-lo(mist)
//operateJOYBUTTON(0 , No_9 , 2 , 10 , 0); // FワイパーOFF ⇒ INT ⇒ LO(MISTの代わり)
printLCD3("B9:(wp-int)","B9:wp-lo(mist)"); //
fwipermode = 2; // フロントワイパーモード切替
}
} else if (fwipermode == 1) { // ★前回が、w-int
if (VAL_FWIPERMODE == 2) { // ☆ 今回、w-lo
//operateJOYBUTTON(0 , No_9 , 1 , 10 , 0); // FワイパーINT ⇒ LO
printLCD3("Button9","wp-lo"); //
fwipermode = 2; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 0) { // ☆ 今回、w-off
//operateJOYBUTTON(0 , No_9 , 3 , 10 , 0); // FワイパーINT ⇒ LO ⇒ HI ⇒ OFF
printLCD3("B9:(wp-lo)","B9:(wp-hi)"); //
delay(500); //
printLCD3("B9:wp-off",""); //
fwipermode = 0; // フロントワイパーモード切替
}
} else if (fwipermode == 2) { // ★前回が、w-lo
if (VAL_FWIPERMODE == 3) { // ☆ 今回、w-hi
//operateJOYBUTTON(0 , No_9 , 1 , 10 , 0); // FワイパーLO ⇒ HI
printLCD3("Button9","wp-hi"); //
fwipermode = 3; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 1) { // ☆ 今回、w-int
//operateJOYBUTTON(0 , No_9 , 3 , 10 , 0); // FワイパーLO ⇒ HI ⇒ OFF ⇒ INT
printLCD3("B9:(wp-hi)","B9:(wp-off)"); //
delay(500); //
printLCD3("B9:wp-int",""); //
fwipermode = 1; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 0) { // ☆ 今回、w-off、つまり前回はLOではなくMISTだった。
//operateJOYBUTTON(0 , No_9 , 2 , 10 , 0); // FワイパーLO ⇒ HI ⇒ OFF
printLCD3("B9:(wp-hi)","B9:wp-off"); //
fwipermode = 0; // フロントワイパーモード切替
}
} else if (fwipermode == 3) { // ★前回が、w-hi
if (VAL_FWIPERMODE == 2) { // ☆ 今回、w-lo
//operateJOYBUTTON(0 , No_9 , 3 , 10 , 0); // FワイパーHI ⇒ OFF ⇒ INT ⇒ LO
printLCD3("B9:(wp-off)","B9:(wp-int)"); //
delay(500); //
printLCD3("B9:wp-lo",""); //
fwipermode = 2; // フロントワイパーモード切替
}
}
} else if (awipermode == 2) { // ■ Dirt Rally 2.0 のとき(OFFのとき長押しで1回だけ作動、短押しする毎にLOW⇔HIGHになる。連続動作中に長押しするとOFF。)------------
if (fwipermode == 0) { // ★前回が、w-off
if (VAL_FWIPERMODE == 1) { // ☆ 今回、w-int
printLCD3("No opr","(wp-int)"); //
fwipermode = 1; // フロントワイパーモードのみ切替
} else if (VAL_FWIPERMODE == 2) { // ☆ 今回、w-lo(実際にはw-mist)
//operateJOYBUTTON(0 , No_9 , 1 , 500 , 0); // ワイパー停止動中の長押しによりMIST
printLCD3("Button9 long prs","wp-mist"); //
delay(500); //
printLCD3("REL Btn9","wp-off"); //
fwipermode = 0; // フロントワイパーモードそのまま
}
} else if (fwipermode == 1) { // ★前回が、w-int
if (VAL_FWIPERMODE == 2) { // ☆ 今回、w-lo
//operateJOYBUTTON(0 , No_9 , 1 , 10 , 0); // FワイパーINT ⇒ LO
printLCD3("Button9","wp-lo"); //
fwipermode = 2; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 0) { // ☆ 今回、w-off
printLCD3("No opr","(wp-off)"); //
fwipermode = 0; // フロントワイパーモードのみ切替
}
} else if (fwipermode == 2) { // ★前回が、w-lo
if (VAL_FWIPERMODE == 3) { // ☆ 今回、w-hi
//operateJOYBUTTON(0 , No_9 , 1 , 10 , 0); // FワイパーLO ⇒ HI
printLCD3("Button9","wp-hi"); //
fwipermode = 3; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 1) { // ☆ 今回、w-int
printLCD3("No opr","(wp-int)"); //
fwipermode = 1; // フロントワイパーモードのみ切替
}
} else if (fwipermode == 3) { // ★前回が、w-hi
if (VAL_FWIPERMODE == 2) { // ☆ 今回、w-lo
//operateJOYBUTTON(0 , No_9 , 1 , 10 , 0); // FワイパーHI ⇒ LO
printLCD3("Button9","wp-lo"); //
fwipermode = 2; // フロントワイパーモード切替
}
}
if (VAL_FWIPERMODE == 1) { // ★前回が何であれ今回がw-intのとき、
if (millis() - time_w_int > 2000) { // 前回のINT作動から2秒以上経っていたら、
//operateJOYBUTTON(0 , No_9 , 1 , 500 , 0); // ワイパー停止動中の長押しにより1回だけワイパー作動させる
printLCD3("Button9(LP)","wp-int"); //
delay(500); //
printLCD3(" ","wp-int"); //
time_w_int = millis(); // タイムスタンプを更新する
}
}
} else if (awipermode == 3) { // ■ ETS2 のとき-----------------------------------------------------------------------------------
if (fwipermode == 0) { // ★前回が w-off のとき、
if (VAL_FWIPERMODE == 1) { // ☆ 今回 w-int のとき、
//operateJOYBUTTON(0 , No_9 , 1 , 10 , 0); // FワイパーOFF ⇒ INT
printLCD3("Button9","wp-int"); //
fwipermode = 1; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 2) { // ☆ 今回 w-lo(実際にはMIST) のとき、
//operateJOYBUTTON(0 , No_9 , 2 , 10 , 0); // FワイパーOFF ⇒ INT ⇒ LO(実際にはMIST)
printLCD3("B9:(wp-int)","B9:wp-lo(mist)"); //
fwipermode = 2; // フロントワイパーモード切替
}
} else if (fwipermode == 1) { // ★前回が w-intのとき、
if (VAL_FWIPERMODE == 2) { // ☆ 今回 w-lo のとき、
//operateJOYBUTTON(0 , No_9 , 1 , 10 , 0); // FワイパーINT ⇒ LO
printLCD3("Button9","wp-lo"); //
fwipermode = 2; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 0) { // ☆ 今回 w-off のとき、
//operateJOYBUTTON(0 , No_10 , 1 , 10 , 0); // FワイパーINT ⇒ OFF
printLCD3("Button10","wp-off"); //
fwipermode = 0; // フロントワイパーモード切替
}
} else if (fwipermode == 2) { // ★前回がw-loのとき、(MISTの場合もある)
if (VAL_FWIPERMODE == 3) { // ☆ 今回 w-hi のとき、
//operateJOYBUTTON(0 , No_9 , 1 , 10 , 0); // FワイパーLO ⇒ HI
printLCD3("Button9","wp-hi"); //
fwipermode = 3; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 1) { // ☆ 今回 w-int のとき、
//operateJOYBUTTON(0 , No_10 , 1 , 10 , 0); // FワイパーLO ⇒ INT
printLCD3("Button10","wp-int"); //
fwipermode = 1; // フロントワイパーモード切替
} else if (VAL_FWIPERMODE == 0) { // ☆ 今回 w-off のとき(前回MISTで今回off)、
//operateJOYBUTTON(0 , No_10 , 2 , 10 , 0); // FワイパーLO ⇒ INT ⇒ OFF
printLCD3("B10:(wp-int)","B10:wp-off"); //
fwipermode = 0; // フロントワイパーモード切替
}
} else if (fwipermode == 3) { // ★前回がw-hiのとき、
if (VAL_FWIPERMODE == 2) { // ☆ 今回 w-lo のとき、
//operateJOYBUTTON(0 , No_10 , 1 , 10 , 0); // FワイパーHI ⇒ LO
printLCD3("Button10","wp-lo"); //
fwipermode = 2; // フロントワイパーモード切替
}
}
}
delay(10);
}
FP01
FP03
FP05
FP06
FP08
FP09
FP10
FP11
WP04
WP09
WP10
WBLACK
WPURPLE
WBROWN
WRED
WYELLOW
WGREEN
MIST: OFF - ON
W-OFF: OFF - OFF
INT : ON - OFF
LO :OFF - ON
HI : ON - ON
<F-Wiper>
<Geme Selection>
AC : ON - ON - ON
(WP09) - (WP10)
<F-Washer> (WP04) ON
ON for 5 seconds or more
(WBLACK) - (WPURPLE) - (WBROWN)
ACC: ON - OFF - ON
DR2: ON - OFF - OFF
ETS: ON - ON - OFF
OTH: OFF - ON - OFF
<Button Assign Mode> (WP04)
<Other Functions>
(WRED) - (WYELLOW) - (WGREEN)
HORN: ON - OFF - OFF
OFF: OFF - OFF - OFF
HAZARD: OFF - OFF - ON
DESABLE: OFF - ON - OFF
READ: ON - ON - OFF
<Winker> RIGHT: FP10-ON , LEFT: FP11-ON
<Passing> FP09-ON
<F-FOG> FP05-ON
<Hi-Beam> FP03-ON (for AC and ETS2, when head light ON)
<Light Mode>
LM - OFF (FP01~FP11): OFF - OFF - OFF - ON - OFF - OFF - OFF - OFF
LM-AUTO(FP01~FP11): OFF - OFF - OFF - ON - OFF - OFF - OFF - OFF
LM-POSI (FP01,FP08) : OFF(FP01) ---------------- ON(FP08)
LM-HEAD(FP01,FP09): ON(FP01) -------------------------OFF(FP09)
* When switching <F-Wiper> mode between [INT] and [LO],
you must go through [Transient], to simulate the real divice switching.
*Transient(INT->LO) : ON - ON
*Transient(LO->INT) : OFF - OFF