goog.provide('Blockly.Blocks.user');
goog.require('Blockly.Blocks');
goog.require('Blockly.Types');

Blockly.Blocks.user.HUE = 315;

// ================================
// TB6612fng 馬達擴充板
// ================================

	// 初始化積木（下拉：左/右輪對應；勾選：M1/M2 反向）
	Blockly.Blocks['tb6612fng_init'] = {
	  init: function() {
		// 第 1 行：標題
		this.appendDummyInput()
		  .appendField("YwRobot TB6612FNG 馬達擴充板")
		  .appendField("初始化");

		// 第 2 行：左/右輪對應 + 反向勾選
		this.appendDummyInput()
		  .appendField("左輪")
		  .appendField(new Blockly.FieldDropdown([["M1","1"], ["M2","2"]]), "LEFT_MOTOR")
		  .appendField("右輪")
		  .appendField(new Blockly.FieldDropdown([["M2","2"], ["M1","1"]]), "RIGHT_MOTOR")
		  .appendField("  M1 反向")
		  .appendField(new Blockly.FieldCheckbox("FALSE"), "INV_M1")
		  .appendField("  M2 反向")
		  .appendField(new Blockly.FieldCheckbox("FALSE"), "INV_M2");

		this.setInputsInline(false); // 讓兩個 DummyInput 變成兩行
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(45);
		this.setTooltip("設定左右輪對應(M1/M2)與反向(打勾=反向)");
		this.setHelpUrl("");
	  }
	};

	// 雙輪控制積木（左右兩行）
	Blockly.Blocks['tb6612fng_dual_wheel'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("YwRobot TB6612FNG 馬達擴充板");

		// 左輪（同一行，速度欄位靠右）
		this.appendValueInput("L_SPEED")
		  .setAlign(Blockly.ALIGN_RIGHT)
		  .appendField("左輪")
		  .appendField(new Blockly.FieldDropdown([["正轉","0"], ["反轉","1"], ["停止","2"]]), "L_DIR")
		  .appendField(" 速度(0~255)");

		// 右輪（同一行，速度欄位靠右）
		this.appendValueInput("R_SPEED")
		  .setAlign(Blockly.ALIGN_RIGHT)
		  .appendField("右輪")
		  .appendField(new Blockly.FieldDropdown([["正轉","0"], ["反轉","1"], ["停止","2"]]), "R_DIR")
		  .appendField(" 速度(0~255)");

		this.setInputsInline(false); // 左/右兩行
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(45);
		this.setTooltip("同一顆積木同時設定左/右輪方向與速度（速度欄位靠右）");
		this.setHelpUrl("");
	  }
	};


// ================================
// VL5310x 雷射測距感測模組
// ================================

	// VL5310x 雷射測距感測模組 初始化
	Blockly.Blocks['block_init_vl53l0x'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("測距模式")
			.appendField(new Blockly.FieldDropdown([
				["連續測距", "eContinuous"],
				["單次測距", "eSingle"]
			]), "vl53l0x_mode_measurement")
			.appendField("精度")
			.appendField(new Blockly.FieldDropdown([
				["一般", "eLow"],
				["高精度", "eHigh"]
			]), "vl53l0x_mode_accuracy")
			.appendField("VL53L0x 雷射測距感測模組 初始化");
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(90);
	 this.setTooltip("");
	 this.setHelpUrl("");
	  }
	};

	// 讀取 VL5310x 數值(mm)
	Blockly.Blocks['block_vl53l0x'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("VL53L0X 雷射測距值(mm)");
		this.setInputsInline(true);
		this.setOutput(true, null);
		this.setColour(90);
	 this.setTooltip("");
	 this.setHelpUrl("");
	  }
	};


// ================================
// YFROBOT QTR-5RC 循線模組
// ================================
	
	// YFROBOT QTR-5RC 循線模組 初始化
/* Removed from the maintained toolbox: YFROBOT QTR-5RC blocks are legacy-only.
	Blockly.Blocks['block_initqrt_5rc'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("YFROBOT QRT-5RC 循線模組 初始化");
		this.appendDummyInput()
			.appendField("使用腳位")
			.appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "IR1")
			.appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "IR2")
			.appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "IR3")
			.appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "IR4")
			.appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "IR5")
			.appendField("控制腳位")
			.appendField(new Blockly.FieldDropdown(Blockly.Arduino.Boards.selected.digitalPins), "EN");
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(135);
	 this.setTooltip("");
	 this.setHelpUrl("");
	  }
	};

	// QRT-5RC 循線模組 校準
	Blockly.Blocks['block_qrt_calibrate'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("QRT-5RC 循線模組 校準");
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(135);
	 this.setTooltip("");
	 this.setHelpUrl("");
	  }
	};

	// 讀取 QTR-5RC 循線模組 數值並儲存
	Blockly.Blocks['block_qrt_read_save'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("讀取 QTR-5RC 循線模組 數值並儲存");
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(135);
	 this.setTooltip("");
	 this.setHelpUrl("");
	  }
	};

	// QTR-5RC 循線模組 原始數值(0-2500)
	Blockly.Blocks['block_qrt_read'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("QTR-5RC 循線模組 原始數值(0-2500)");
		this.setOutput(true, null);
		this.setColour(135);
	 this.setTooltip("");
	 this.setHelpUrl("");
	  }
	};

	// 讀取 QTR-5RC 循線模組各個感測頭的數值
	Blockly.Blocks['block_qrt_value'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("QTR-5RC 循線模組")
			.appendField(new Blockly.FieldDropdown([["IR1","0"], ["IR2","1"], ["IR3","2"], ["IR4","3"], ["IR5","4"]]), "ir_n_value")
			.appendField("數值");
		this.setOutput(true, null);
		this.setColour(135);
	 this.setTooltip("");
	 this.setHelpUrl("");
	  }
	};
*/


// ================================
// 八路循線模組
// ================================

	// 八路循線模組 初始化（亞博智能 / 幻爾科技）
	Blockly.Blocks['block_init_eight_line'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("德中 UNO 小車 八路循線模組 初始化(I2C模式)")
			.appendField("模組")
			.appendField(new Blockly.FieldDropdown([
			  ["亞博智能", "YAHBO"],
			  ["幻爾科技", "HINWONDER"]
			]), "MODULE_TYPE");
		this.appendDummyInput()
			.appendField("延遲時間(ms)")
			.appendField(new Blockly.FieldNumber(10, 0, 50, 1), "I2C_DELAY_MS");
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(180);
		this.setTooltip("八路循線模組初始化欄位意義：\n模組：選擇實際使用的八路循線模組；不同品牌會影響 I2C 位址、讀取暫存器、黑白邏輯與位元順序。\n延遲時間(ms)：每次 I2C 寫入讀取暫存器後，到真正讀取資料前等待的時間。預設 10ms；太低可能讀值不穩，太高會讓循線反應變慢。");
		this.setHelpUrl("");
	  }
	};

	// 八路循線模組 讀取並儲存數值
	Blockly.Blocks['block_read_eight_line_value'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("德中 UNO 小車 八路循線模組 讀取並儲存數值");
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(180);
		this.setTooltip("讀取八路循線模組目前狀態，並更新 eight_X1 ~ eight_X8。後續讀取單一感測器、黑線位置字串、黑線顆數都會使用這次讀到的資料。");
		this.setHelpUrl("");
	  }
	};

	// 讀取 八路循線模組 各個感測頭數值
	Blockly.Blocks['block_eight_value'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField("德中 UNO 小車 八路循線模組")
			.appendField(new Blockly.FieldDropdown([
			  ["X1","X1"], ["X2","X2"], ["X3","X3"], ["X4","X4"],
			  ["X5","X5"], ["X6","X6"], ["X7","X7"], ["X8","X8"]
			]), "Value_NAME")
			.appendField("數值");
		this.setOutput(true, null);
		this.setColour(180);
		this.setTooltip("回傳指定感測器的黑線判斷值。系統內部已統一成黑線=1、白底=0。通常 X1 在最左側，X8 在最右側。");
		this.setHelpUrl("");
	  }
	};

	// 八路循線模組 黑線位置(8位字串)
	Blockly.Blocks['block_eight_line_bin8'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 黑線位置(8位字串)");
		this.setOutput(true, "String");
		this.setColour(180);
		this.setTooltip('回傳如 "00011000" 的 8 位字串，順序為 X1→X8。1 表示該感測器在黑線上，0 表示白底。適合用於列舉法或路口判斷。');
		this.setHelpUrl("");
	  }
	};

	// 八路循線模組 黑線顆數
	Blockly.Blocks['block_eight_line_black_count'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 黑線顆數(X1~X8)");
		this.setOutput(true, "Number");
		this.setColour(180);
		this.setTooltip("回傳 0~8：有幾顆感測器偵測到黑線。0 常代表丟線；5 顆以上可能是十字、T 字、終點線或大面積黑色區域。");
		this.setHelpUrl("");
	  }
	};

	// 八路循線模組 指定範圍至少幾顆在黑線/白線上（v31：X1~X8 改為下拉式）
	Blockly.Blocks['block_eight_line_range_count_condition'] = {
	  init: function() {
		var sensorDropdown = [
		  ["X1", "1"], ["X2", "2"], ["X3", "3"], ["X4", "4"],
		  ["X5", "5"], ["X6", "6"], ["X7", "7"], ["X8", "8"]
		];

		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 從")
		  .appendField(new Blockly.FieldDropdown(sensorDropdown), "START")
		  .appendField("到")
		  .appendField(new Blockly.FieldDropdown(sensorDropdown), "END")
		  .appendField("至少")
		  .appendField(new Blockly.FieldTextInput("1"), "MIN_COUNT")
		  .appendField("顆在")
		  .appendField(new Blockly.FieldDropdown([["黑線", "BLACK"], ["白線", "WHITE"]]), "TARGET")
		  .appendField("上？");
		this.setOutput(true, "Boolean");
		this.setColour(180);
		this.setTooltip("判斷指定範圍 X1~X8 中，至少幾顆在黑線或白線上。請先讀取並儲存數值。");
		this.setHelpUrl("");
	  }
	};


	// 八路循線模組 單一感測頭權重值
	Blockly.Blocks['block_eight_line_sensor_weight'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組")
		  .appendField(new Blockly.FieldDropdown([
			["X1","X1"], ["X2","X2"], ["X3","X3"], ["X4","X4"],
			["X5","X5"], ["X6","X6"], ["X7","X7"], ["X8","X8"]
		  ]), "SENSOR_NAME")
		  .appendField("權重值");
		this.setOutput(true, "Number");
		this.setColour(180);
		this.setTooltip("回傳指定感測器目前使用的 PD 權重值。預設為 X1=-7、X2=-5、X3=-3、X4=-1、X5=1、X6=3、X7=5、X8=7；若使用『PD權重設定』積木，會回傳修改後的權重。負值代表線偏左，正值代表線偏右。");
		this.setHelpUrl("");
	  }
	};

	// 八路循線模組 目前權重誤差值
	Blockly.Blocks['block_eight_line_weight_error'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 目前總權重誤差值");
		this.setOutput(true, "Number");
		this.setColour(180);
		this.setTooltip("依目前 eight_X1~eight_X8 的黑線狀態計算加權平均誤差。請先使用『讀取並儲存數值』更新感測器資料。例：00011000→0、00110000→-2、00001100→2。若完全沒有黑線，回傳 999，方便在序列埠除錯時辨識丟線。");
		this.setHelpUrl("");
	  }
	};


	// 八路循線模組 PD權重設定
	Blockly.Blocks['block_line_pd_weight_setting'] = {
	  init: function() {
		// 單列顯示：X1~X8 權重全部放在同一行，方便教學時對照感測器位置。
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 PD權重設定")
		  .appendField("X1")
		  .appendField(new Blockly.FieldTextInput("-7"), "W_X1")
		  .appendField("X2")
		  .appendField(new Blockly.FieldTextInput("-5"), "W_X2")
		  .appendField("X3")
		  .appendField(new Blockly.FieldTextInput("-3"), "W_X3")
		  .appendField("X4")
		  .appendField(new Blockly.FieldTextInput("-1"), "W_X4")
		  .appendField("X5")
		  .appendField(new Blockly.FieldTextInput("1"), "W_X5")
		  .appendField("X6")
		  .appendField(new Blockly.FieldTextInput("3"), "W_X6")
		  .appendField("X7")
		  .appendField(new Blockly.FieldTextInput("5"), "W_X7")
		  .appendField("X8")
		  .appendField(new Blockly.FieldTextInput("7"), "W_X8");

		this.setInputsInline(true);
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(180);
		this.setTooltip("設定 X1~X8 的 PD 權重。預設 -7,-5,-3,-1,1,3,5,7。");
		this.setHelpUrl("");
	  }
	};



	// PD動態速度模式設定（v21）
	Blockly.Blocks['block_line_pd_dynamic_speed_setting'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 PD動態速度設定")
		  .appendField("動態速度")
		  .appendField(new Blockly.FieldDropdown([["啟用", "1"], ["關閉", "0"]]), "DYN_ENABLE");

		this.appendDummyInput()
		  .appendField("直線速度(0~255)")
		  .appendField(new Blockly.FieldTextInput("210"), "FAST_SPEED")
		  .appendField("彎道速度(0~255)")
		  .appendField(new Blockly.FieldTextInput("140"), "SLOW_SPEED");

		this.appendDummyInput()
		  .appendField("中心誤差≤")
		  .appendField(new Blockly.FieldTextInput("1"), "CENTER_ERR")
		  .appendField("彎道誤差≥")
		  .appendField(new Blockly.FieldTextInput("4"), "CURVE_ERR");

		this.setInputsInline(false);
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(180);
		this.setTooltip("設定 PD 動態速度：誤差小加速，誤差大降速。");
		this.setHelpUrl("");
	  }
	};

	// 傳統循線模式 初始化（v13：I2C 延遲統一由八路循線初始化設定）
	Blockly.Blocks['block_line_straight_init_gain'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 傳統循線模式 初始化");

		this.appendValueInput("L_PWM_IN")
		  .setCheck("Number")
		  .appendField("左輪初始速度(0~255)");
		this.appendValueInput("R_PWM_IN")
		  .setCheck("Number")
		  .appendField("右輪初始速度(0~255)");


		this.appendDummyInput()
		  .appendField("GAIN_0")
		  .appendField(new Blockly.FieldNumber(1.00, 0, 1.0, 0.1), "GAIN_0")
		  .appendField("GAIN_1")
		  .appendField(new Blockly.FieldNumber(0.85, 0, 1.0, 0.1), "GAIN_1")
		  .appendField("GAIN_2")
		  .appendField(new Blockly.FieldNumber(0.75, 0, 1.0, 0.1), "GAIN_2");

		this.appendDummyInput()
		  .appendField("GAIN_3")
		  .appendField(new Blockly.FieldNumber(0.65, 0, 1.0, 0.1), "GAIN_3")
		  .appendField("GAIN_4")
		  .appendField(new Blockly.FieldNumber(0.55, 0, 1.0, 0.1), "GAIN_4")
		  .appendField("GAIN_5")
		  .appendField(new Blockly.FieldNumber(0.45, 0, 1.0, 0.1), "GAIN_5");

		this.setInputsInline(false);
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(180);
		this.setTooltip("傳統循線初始化欄位意義：\n左/右輪初始速度：直行時的基礎 PWM。若車子直線偏一側，可微調左右速度補償。\nGAIN_0：中心或不需修正時的倍率。\nGAIN_1~GAIN_5：偏移越大時，被減速馬達使用的倍率；數值越小，轉向越明顯。\nI2C 讀取延遲請統一在『八路循線模組 初始化』設定，避免重複設定。");
		this.setHelpUrl("");
	  }
	};

	// 傳統循線模式 前進
	Blockly.Blocks['block_line_straight_forward_gain'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 傳統循線模式 前進");
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(180);
		this.setTooltip("執行一次傳統列舉法循線：讀取八路循線值、組成 8 位黑線字串，依對應表調整左右輪速度。通常放在 loop 迴圈中反覆執行。");
		this.setHelpUrl("");
	  }
	};

	// PD循線模式 初始化（v15：I2C 延遲統一設定，保留 float/濾波/丟線尋黑線開關）
	Blockly.Blocks['block_line_pd_init'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 PD循線模式 初始化");

		this.appendValueInput("L_BASE")
		  .setCheck("Number")
		  .appendField("左輪初始速度(0~255)");
		this.appendValueInput("R_BASE")
		  .setCheck("Number")
		  .appendField("右輪初始速度(0~255)");


		this.appendDummyInput()
		  .appendField("Kp")
		  .appendField(new Blockly.FieldTextInput("20"), "KP")
		  .appendField("Kd")
		  .appendField(new Blockly.FieldTextInput("8"), "KD");

		this.appendDummyInput()
		  .appendField("濾波強度(0~1)")
		  .appendField(new Blockly.FieldTextInput("0.35"), "FILTER")
		  .appendField("最大修正量")
		  .appendField(new Blockly.FieldTextInput("120"), "MAX_CORRECTION");

		this.appendDummyInput()
		  .appendField("丟線尋黑線")
		  .appendField(new Blockly.FieldDropdown([["啟用", "1"], ["關閉", "0"]]), "LOST_ENABLE")
		  .appendField("搜尋速度(0~255)")
		  .appendField(new Blockly.FieldTextInput("90"), "LOST_SPEED")
		  .appendField("判定次數")
		  .appendField(new Blockly.FieldTextInput("4"), "LOST_LIMIT");

		this.setInputsInline(false);
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(180);
		this.setTooltip("設定 PD 循線參數：左右基礎速度、Kp/Kd、濾波、最大修正量與丟線處理。");
		this.setHelpUrl("");
	  }
	};

	// ================================
	// 重設PD誤差
	// ================================
	Blockly.Blocks['pd_reset_error'] = {
	  init: function() {
		this.appendDummyInput()
			.appendField('德中 UNO 小車 重設PD誤差');
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(180);
		this.setTooltip('將 PD 循線用的 err_new_pd、err_prev_pd、PD_LOST_COUNT 與 PD_BLACK_COUNT 重設為 0。建議放在 PD 循線開始前，避免上一次執行殘留的誤差影響起步。');
		this.setHelpUrl('');
	  }
	};

	// PD循線模式 前進
	Blockly.Blocks['block_line_pd_forward'] = {
	  init: function() {
		this.appendDummyInput()
		  .appendField("德中 UNO 小車 八路循線模組 PD循線模式 前進");
		this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
		this.setColour(180);
		this.setTooltip("執行一次 PD 權重法循線：讀取八路感測器、計算加權誤差、套用濾波與 Kp/Kd 修正，再控制左右馬達。通常放在 loop 迴圈中反覆執行。若偵測到丟線，會依最後誤差方向搜尋黑線。");
		this.setHelpUrl("");
	  }
	};




// ================================
// ICM42688 陀螺儀角度感測器
// v3：改用最保守的欄位型態，避免舊版 Blockly 工具箱只顯示第一顆積木
// ================================

Blockly.Blocks['icm42688_init'] = {
  init: function() {
    this.appendDummyInput()
      .appendField("ICM42688 陀螺儀 初始化")
      .appendField("I2C 位址")
      .appendField(new Blockly.FieldDropdown([["0x68", "0x68"], ["0x69", "0x69"]]), "ADDR");
    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(270);
    this.setTooltip("初始化 ICM42688，設定 I2C 位址、量程與取樣率。AD0 接 GND 使用 0x68，AD0 接 3.3V 使用 0x69。");
    this.setHelpUrl("");
  }
};

Blockly.Blocks['icm42688_calibrate_gyro_z'] = {
  init: function() {
    this.appendDummyInput()
      .appendField("ICM42688 校正陀螺儀 Z 軸")
      .appendField("取樣")
      .appendField(new Blockly.FieldTextInput("300"), "SAMPLES")
      .appendField("次")
      .appendField("間隔")
      .appendField(new Blockly.FieldTextInput("10"), "INTERVAL")
      .appendField("ms");
    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(270);
    this.setTooltip("車子完全靜止時取樣 gyro_z 平均值，作為零點偏移。建議初始化後執行一次。");
    this.setHelpUrl("");
  }
};

Blockly.Blocks['icm42688_reset_angle_z'] = {
  init: function() {
    this.appendDummyInput()
      .appendField("ICM42688 重設 Z 軸角度為 0");
    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(270);
    this.setTooltip("將目前累積的 Z 軸角度歸零。每次開始轉彎前建議先使用此積木。");
    this.setHelpUrl("");
  }
};


Blockly.Blocks['icm42688_update_angle_z'] = {
  init: function() {
    this.appendDummyInput()
      .appendField("ICM42688 更新 Z 軸角度");
    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(270);
    this.setTooltip("讀取目前 Z 軸角速度並累積成 Z 軸角度。若只是使用『取得 Z 軸角度』或『角度是否達到』積木，內部已會自動更新；此積木主要供進階除錯或自訂流程使用。");
    this.setHelpUrl("");
  }
};

Blockly.Blocks['icm42688_get_angle_z'] = {
  init: function() {
    this.appendDummyInput()
      .appendField("ICM42688 取得 Z 軸角度");
    this.setOutput(true, "Number");
    this.setColour(270);
    this.setTooltip("回傳目前累積的 Z 軸角度，單位為度。可用於序列埠顯示或進階判斷。");
    this.setHelpUrl("");
  }
};

Blockly.Blocks['icm42688_angle_z_reached'] = {
  init: function() {
    this.appendDummyInput()
      .appendField("ICM42688 Z 軸角度是否達到")
      .appendField(new Blockly.FieldTextInput("90"), "TARGET")
      .appendField("度")
      .appendField("容許誤差")
      .appendField(new Blockly.FieldTextInput("3"), "TOLERANCE")
      .appendField("度");
    this.setInputsInline(true);
    this.setOutput(true, "Boolean");
    this.setColour(270);
    this.setTooltip("自動更新 Z 軸角度後判斷是否達到指定角度。使用絕對值判斷，因此左轉/右轉都可用；馬達方向由原本馬達積木決定。");
    this.setHelpUrl("");
  }
};

// ================================
// TCS34725 顏色感測模組
// ================================

Blockly.Blocks['tcs34725_init'] = {
  init: function() {
    this.appendDummyInput()
      .appendField("TCS34725 初始化")
      .appendField("積分時間")
      .appendField(new Blockly.FieldDropdown([
        ["50ms",  "TCS34725_INTEGRATIONTIME_50MS"],   // 預設 50ms
        ["2.4ms", "TCS34725_INTEGRATIONTIME_2_4MS"],
        ["24ms",  "TCS34725_INTEGRATIONTIME_24MS"],
        ["101ms", "TCS34725_INTEGRATIONTIME_101MS"],
        ["154ms", "TCS34725_INTEGRATIONTIME_154MS"],
        ["700ms", "TCS34725_INTEGRATIONTIME_700MS"]
      ]), "IT")
      .appendField("增益")
      .appendField(new Blockly.FieldDropdown([
        ["4X",  "TCS34725_GAIN_4X"],                  // 預設 4X
        ["1X",  "TCS34725_GAIN_1X"],
        ["16X", "TCS34725_GAIN_16X"],
        ["60X", "TCS34725_GAIN_60X"]
      ]), "GAIN");

    this.appendDummyInput()
      .appendField("序列埠鮑率")
      .appendField(new Blockly.FieldDropdown([
        ["9600", "9600"],       // 預設 9600：放第一個想要的話可把它移到最前面
        ["14400", "14400"],
        ["19200", "19200"],
        ["38400", "38400"],
        ["57600", "57600"],
        ["115200", "115200"]
      ]), "BAUD");

    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(225);
    this.setTooltip("只做初始化：Serial.begin + 建立 tcs 物件 + 呼叫 tcs.begin()");
  }
};


// ------------------------------------------------------------
// 2) 量測並輸出特徵（CSV）
// label,rAvg,gAvg,bAvg,cAvg,R1k,G1k,B1k
// ------------------------------------------------------------
Blockly.Blocks['tcs34725_measure_print_features'] = {
  init: function() {
    this.appendDummyInput()
      .appendField("量測並輸出特徵(數值以逗號隔開)")
      .appendField("標籤label")
      .appendField(new Blockly.FieldTextInput("目標物名稱"), "LABEL");

    // ✅ 改成內嵌數字欄位（預設直接顯示）
	this.appendDummyInput()
	  .appendField("取樣次數")
	  .appendField(new Blockly.FieldNumber(10, 0, 100, 1), "N")
	  .appendField("取樣間隔時間(ms)")
	  .appendField(new Blockly.FieldNumber(20, 0, 1000, 1), "DT");

    this.appendDummyInput()
      .appendField("序列埠等待按下 y 鍵才開始收集特徵集")
      .appendField(new Blockly.FieldDropdown([["是", "1"], ["否", "0"]]), "WAIT_Y");

    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(225);
    this.setTooltip("輸出：label,rAvg,gAvg,bAvg,cAvg,R1k,G1k,B1k（固定開補光）");
  }
};



// ------------------------------------------------------------
// 3) 設定某一類目標物中心點（最多 10 類）
// ------------------------------------------------------------
Blockly.Blocks['centroid_set_target'] = {
  init: function() {
    this.appendDummyInput()
      .appendField("設定目標物中心點")
      .appendField("類別ID")
      .appendField(new Blockly.FieldDropdown([
        ["1","1"],["2","2"],["3","3"],["4","4"],["5","5"],
        ["6","6"],["7","7"],["8","8"],["9","9"],["10","10"]
      ]), "ID");

    this.appendValueInput("R1K").setCheck("Number").appendField("R1k");
    this.appendValueInput("G1K").setCheck("Number").appendField("G1k");
    this.appendValueInput("B1K").setCheck("Number").appendField("B1k");

    this.appendDummyInput()
      .appendField("是否輸出已設定中心點到序列埠")
      .appendField(new Blockly.FieldDropdown([["是", "1"], ["否", "0"]]), "PRINT_SET");

    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(225);
    this.setTooltip("把你在電腦端算出的中心點(1k比例)填進來；可重複堆疊多個類別");
  }
};

// ------------------------------------------------------------
// 4) 設定距離門檻（平方距離）
// bestD > dist_th → 回傳 0（不確定）
// ------------------------------------------------------------
Blockly.Blocks['centroid_set_dist_threshold'] = {
  init: function() {
    this.appendDummyInput().appendField("設定距離門檻(平方距離)");
    this.appendValueInput("TH").setCheck("Number").appendField("dist_th");

    this.appendDummyInput()
      .appendField("是否輸出目前門檻到序列埠")
      .appendField(new Blockly.FieldDropdown([["是", "1"], ["否", "0"]]), "PRINT_TH");

    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(225);
    this.setTooltip("距離=(dR^2+dG^2+dB^2)。太遠視為不確定(0)");
  }
};

// ------------------------------------------------------------
// 5) 量測並辨識（最近中心點，回傳代碼 0..10）
// ------------------------------------------------------------
Blockly.Blocks['centroid_classify_measure_code'] = {
  init: function() {
    this.appendDummyInput().appendField("量測並辨識(最近中心點，回傳代碼)");

    this.appendValueInput("N").setCheck("Number").appendField("取樣次數");
    this.appendValueInput("DT").setCheck("Number").appendField("間隔(ms)");

    this.appendDummyInput()
      .appendField("序列埠等待 y 才開始")
      .appendField(new Blockly.FieldDropdown([["是", "1"], ["否", "0"]]), "WAIT_Y");

    this.appendDummyInput()
      .appendField("是否輸出特徵到序列埠")
      .appendField(new Blockly.FieldDropdown([["是", "1"], ["否", "0"]]), "PRINT_FEAT");

    this.appendDummyInput()
      .appendField("是否輸出辨識代碼到序列埠")
      .appendField(new Blockly.FieldDropdown([["是", "1"], ["否", "0"]]), "PRINT_CODE");

    this.setOutput(true, "Number");
    this.setColour(225);
    this.setTooltip("回傳 0=不確定；1..10=對應類別ID（固定開補光）");
  }
};

/* Removed from the maintained toolbox; use the normal expression blocks.
Blockly.Blocks['paren_expr'] = {
  init: function() {
    this.appendValueInput("EXPR")
        .setCheck(null)
        .appendField("(");

    this.appendDummyInput()
        .appendField(")");

    this.setInputsInline(true);
    this.setOutput(true, null);
    this.setColour(180);
    this.setTooltip("把輸入的表達式用 ( ) 包起來，強制運算優先序。");
    this.setHelpUrl("");
  }
};
*/

Blockly.Blocks['servo270_attach'] = {
    init: function () {
        this.appendDummyInput()
            .appendField("設定 270度伺服馬達腳位")
            .appendField(new Blockly.FieldVariable("servo270"), "SERVO_NAME")
            .appendField(", 腳位")
            .appendField(new Blockly.FieldDropdown(
                Blockly.Arduino.Boards.selected.digitalPins), 'SERVO_PIN');
        this.setPreviousStatement(true, null);
        this.setNextStatement(true, null);
        this.setColour(Blockly.Blocks.Motors.HUE);
        this.setTooltip("將 270 度舵機附加到指定腳位");
        this.setHelpUrl("https://www.arduino.cc/en/Reference/ServoAttach");
    },
    updateFields: function () {
        Blockly.Arduino.Boards.refreshBlockFieldDropdown(this, 'SERVO_PIN', 'digitalPins');
    }
};

Blockly.Blocks['servo270_read'] = {
    init: function () {
        this.appendDummyInput()
            .appendField("讀取 270度伺服馬達角度")
            .appendField(new Blockly.FieldVariable('servo270'), 'SERVO_NAME');
        this.setOutput(true, null);
        this.setColour(Blockly.Blocks.Motors.HUE);
        this.setTooltip("讀取 270 度舵機目前的邏輯角度值");
        this.setHelpUrl("https://arduino.cc/en/Reference/ServoRead");
    }
};

Blockly.Blocks['servo270_write'] = {
    init: function () {
        this.appendValueInput('SERVO_ANGLE')
            .setCheck(Blockly.Types.NUMBER.checkList)
            .appendField("270度伺服馬達")
            .appendField(new Blockly.FieldVariable('servo270'), 'SERVO_NAME')
            .appendField("轉到");
        this.appendDummyInput()
            .appendField("度 (0~270)");
        this.setPreviousStatement(true, null);
        this.setNextStatement(true, null);
        this.setInputsInline(true);
        this.setColour(Blockly.Blocks.Motors.HUE);
        this.setTooltip("設定 270度伺服馬達角度，輸入範圍 0~270");
        this.setHelpUrl("https://arduino.cc/en/Reference/ServoWrite");
    }
};

Blockly.Blocks['servo270_detach'] = {
    init: function () {
        this.appendDummyInput()
            .appendField(new Blockly.FieldVariable("servo270"), "SERVO_NAME")
            .appendField("停止控制 270度伺服馬達");
        this.setPreviousStatement(true, null);
        this.setNextStatement(true, null);
        this.setColour(Blockly.Blocks.Motors.HUE);
        this.setTooltip("解除 270 度舵機控制");
        this.setHelpUrl("https://www.arduino.cc/en/Reference/ServoDetach");
    }
};
