diff --git a/Assets/.DS_Store b/Assets/.DS_Store
index 5c754dd..8c0781f 100644
Binary files a/Assets/.DS_Store and b/Assets/.DS_Store differ
diff --git a/Assets/ControlPanel.cs b/Assets/ControlPanel.cs
index fc528db..73110d2 100644
--- a/Assets/ControlPanel.cs
+++ b/Assets/ControlPanel.cs
@@ -5,47 +5,40 @@ using UnityEngine.UI;
public class ControlPanel : MonoBehaviour
{
[Header("Core UI (assign in Inspector)")]
- public TMP_InputField inputField;
- public TMP_Dropdown directionDropdown;
- public Button button; // existing Send/Rotate button in hierarchy
+ public TMP_InputField inputField; // was DegreesInputField
+ public TMP_Dropdown directionDropdown; // was DirectionDropdown
+ public Button button; // was RotateButton
- private enum Mode { None, DC, Display, Speaker }
+ private enum Mode { None, DC, Display, Gripper }
private Mode _mode = Mode.None;
private DCMotorModule _dc;
private DisplayModule _display;
- private SpeakerModule _speaker;
+ private GripperModule _gripper;
+ // Keep separate inputs so they don't interfere
private string _savedDCInput = "";
private int _savedDirectionIndex = 0;
private string _savedDisplayInput = "";
+ private string _savedGripperInput = "";
- // Found automatically (no hierarchy edits)
- private TextMeshProUGUI _caption; // child "DegreesCaption"
- private TextMeshProUGUI _buttonText; // child "RotateButton/Text (TMP)"
- private GameObject _directionCaptionGO;
- private GameObject _directionDropdownGO;
-
- // Created in code (Speaker mode only)
- private Button _uploadButton;
- private TextMeshProUGUI _uploadButtonText;
- private Button _playButton;
- private TextMeshProUGUI _playButtonText;
+ // Found automatically (no new UI objects)
+ private TextMeshProUGUI _caption; // DegreesCaption text
+ private TextMeshProUGUI _buttonText; // RotateButton/Text (TMP)
+ private GameObject _directionCaptionGO; // DirectionCaption
+ private GameObject _directionDropdownGO; // DirectionDropdown GameObject
private void Awake()
{
CacheUIFromHierarchy();
- // Create these once; hide unless Speaker mode
- CreateUploadButtonIfNeeded();
- CreatePlayButtonIfNeeded();
-
if (button != null)
{
button.onClick.RemoveAllListeners();
- button.onClick.AddListener(OnMainButtonClicked);
+ button.onClick.AddListener(OnButtonClicked);
}
+ // Cache typed values so switching modules restores what you typed
if (inputField != null)
{
inputField.onValueChanged.AddListener(_ => CacheCurrentInput());
@@ -61,17 +54,37 @@ public class ControlPanel : MonoBehaviour
}
}
+ ///
+ /// Call this whenever a DC or Display module is selected.
+ ///
public void Initialize(ModuleBase module)
{
CacheCurrentInput();
_dc = module as DCMotorModule;
_display = module as DisplayModule;
- _speaker = module as SpeakerModule;
+ _gripper = module as GripperModule;
- if (_dc != null) { SwitchMode(Mode.DC); gameObject.SetActive(true); return; }
- if (_display != null) { SwitchMode(Mode.Display); gameObject.SetActive(true); return; }
- if (_speaker != null) { SwitchMode(Mode.Speaker); gameObject.SetActive(true); return; }
+ if (_dc != null)
+ {
+ SwitchMode(Mode.DC);
+ gameObject.SetActive(true);
+ return;
+ }
+
+ if (_display != null)
+ {
+ SwitchMode(Mode.Display);
+ gameObject.SetActive(true);
+ return;
+ }
+
+ if (_gripper != null)
+ {
+ SwitchMode(Mode.Gripper);
+ gameObject.SetActive(true);
+ return;
+ }
HidePanel();
}
@@ -83,13 +96,12 @@ public class ControlPanel : MonoBehaviour
_mode = Mode.None;
_dc = null;
_display = null;
- _speaker = null;
- SetUploadVisible(false);
- SetPlayVisible(false);
+ _gripper = null;
}
private void CacheUIFromHierarchy()
{
+ // Assumes this script is on the parent that contains these children
var captionT = transform.Find("DegreesCaption");
if (captionT != null) _caption = captionT.GetComponent();
@@ -110,78 +122,47 @@ public class ControlPanel : MonoBehaviour
if (_mode == Mode.DC)
{
- SetCaption("Degrees");
- SetCaptionVisible(true);
- SetMainButtonText("Rotate");
+ if (_caption != null) _caption.text = "Degrees";
+ if (_buttonText != null) _buttonText.text = "Rotate";
SetDirectionVisible(true);
- SetInputVisible(true);
- SetUploadVisible(false);
- SetPlayVisible(false);
if (inputField != null)
- {
- inputField.readOnly = false;
inputField.SetTextWithoutNotify(_savedDCInput);
- }
if (directionDropdown != null)
directionDropdown.SetValueWithoutNotify(_savedDirectionIndex);
}
else if (_mode == Mode.Display)
{
- SetCaption("Text");
- SetCaptionVisible(true);
- SetMainButtonText("Send");
+ if (_caption != null) _caption.text = "Text";
+ if (_buttonText != null) _buttonText.text = "Send";
SetDirectionVisible(false);
- SetInputVisible(true);
- SetUploadVisible(false);
- SetPlayVisible(false);
+
+ // Prefer module's current displayText; fallback to last typed text
+ string toShow = _savedDisplayInput;
+ if (_display != null && !string.IsNullOrEmpty(_display.displayText))
+ toShow = _display.displayText;
if (inputField != null)
- {
- inputField.readOnly = false;
- string toShow = _savedDisplayInput;
- if (_display != null && !string.IsNullOrEmpty(_display.displayText))
- toShow = _display.displayText;
inputField.SetTextWithoutNotify(toShow);
- }
}
- else if (_mode == Mode.Speaker)
+ else if (_mode == Mode.Gripper)
{
- // Speaker UI: no input field (removes the white box behind buttons)
- SetMainButtonText("Send Audio");
- SetCaptionVisible(false);
+ if (_caption != null) _caption.text = "Degrees";
+ if (_buttonText != null) _buttonText.text = "Apply";
SetDirectionVisible(false);
- SetInputVisible(false);
- // Show speaker buttons
- SetUploadVisible(true);
- SetPlayVisible(true);
+ if (inputField != null)
+ inputField.SetTextWithoutNotify(_gripper != null ? _gripper.currentAngle.ToString("F0") : _savedGripperInput);
}
}
- private void SetCaption(string text)
- {
- if (_caption != null) _caption.text = text;
- }
-
- private void SetMainButtonText(string text)
- {
- if (_buttonText != null) _buttonText.text = text;
- }
-
private void SetDirectionVisible(bool visible)
{
if (_directionCaptionGO != null) _directionCaptionGO.SetActive(visible);
if (_directionDropdownGO != null) _directionDropdownGO.SetActive(visible);
}
- private void SetInputVisible(bool visible)
- {
- if (inputField != null && inputField.gameObject.activeSelf != visible)
- inputField.gameObject.SetActive(visible);
- }
-
private void CacheCurrentInput()
{
if (inputField == null) return;
@@ -189,19 +170,28 @@ public class ControlPanel : MonoBehaviour
if (_mode == Mode.DC)
{
_savedDCInput = inputField.text;
- if (directionDropdown != null) _savedDirectionIndex = directionDropdown.value;
+ if (directionDropdown != null)
+ _savedDirectionIndex = directionDropdown.value;
}
else if (_mode == Mode.Display)
{
_savedDisplayInput = inputField.text;
}
+ else if (_mode == Mode.Gripper)
+ {
+ _savedGripperInput = inputField.text;
+ }
}
- private void OnMainButtonClicked()
+ private void OnButtonClicked()
{
if (_mode == Mode.DC)
{
- if (_dc == null) return;
+ if (_dc == null)
+ {
+ Debug.LogWarning("ControlPanel: No DC module selected.");
+ return;
+ }
if (!float.TryParse(inputField.text, out float degrees))
{
@@ -214,206 +204,30 @@ public class ControlPanel : MonoBehaviour
}
else if (_mode == Mode.Display)
{
- if (_display == null) return;
- _display.SetDisplayText(inputField != null ? inputField.text : "");
+ if (_display == null)
+ {
+ Debug.LogWarning("ControlPanel: No Display module selected.");
+ return;
+ }
+
+ string text = inputField != null ? inputField.text : "";
+ _display.SetDisplayText(text); // <- THIS is where Display module gets the text
}
- else if (_mode == Mode.Speaker)
+ else if (_mode == Mode.Gripper)
{
- if (_speaker == null) return;
- _speaker.SendAudioToHardware(); // Send Audio = upload to hardware (your implementation)
+ if (_gripper == null)
+ {
+ Debug.LogWarning("ControlPanel: No Gripper module selected.");
+ return;
+ }
+
+ if (!float.TryParse(inputField.text, out float degrees))
+ {
+ Debug.LogWarning("ControlPanel: Invalid degree input for Gripper.");
+ return;
+ }
+
+ _gripper.SetAngleAndSendControlLibrary(Mathf.Clamp(degrees, 0f, 180f));
}
}
-
- // -------------------------
- // Styling helpers (copy Send button look)
- // -------------------------
-
- private void CopyButtonStyle(Button source, Button target)
- {
- if (source == null || target == null) return;
-
- // Button settings
- target.transition = source.transition;
- target.colors = source.colors;
- target.spriteState = source.spriteState;
- target.navigation = source.navigation;
- target.interactable = source.interactable;
-
- // Image settings
- var srcImg = source.GetComponent();
- var dstImg = target.GetComponent();
- if (srcImg != null && dstImg != null)
- {
- dstImg.sprite = srcImg.sprite;
- dstImg.type = srcImg.type;
- dstImg.pixelsPerUnitMultiplier = srcImg.pixelsPerUnitMultiplier;
- dstImg.material = srcImg.material;
- dstImg.color = srcImg.color;
- dstImg.raycastTarget = srcImg.raycastTarget;
- }
- }
-
- private void CopyTMPStyle(TextMeshProUGUI source, TextMeshProUGUI target)
- {
- if (source == null || target == null) return;
-
- target.font = source.font;
- target.fontSharedMaterial = source.fontSharedMaterial;
- target.fontStyle = source.fontStyle;
- target.fontSize = source.fontSize;
- target.enableAutoSizing = source.enableAutoSizing;
- target.color = source.color;
- target.enableVertexGradient = source.enableVertexGradient;
- target.alignment = source.alignment;
- target.enableWordWrapping = source.enableWordWrapping;
- target.richText = source.richText;
- }
-
- // -------------------------
- // Upload button (code-created)
- // -------------------------
-
- private void CreateUploadButtonIfNeeded()
- {
- if (_uploadButton != null) return;
-
- var go = new GameObject("UploadButton");
- go.transform.SetParent(transform, false);
-
- var img = go.AddComponent();
- img.raycastTarget = true;
-
- _uploadButton = go.AddComponent