From 6bb1c855b66343dd083849f261712e91d801d1a1 Mon Sep 17 00:00:00 2001 From: Persephone Bubblegum-Holiday Date: Sun, 20 Apr 2025 00:04:59 -0700 Subject: [PATCH] mitzi player and incomplete client firmware --- MitziPlayer/INIFile.cs | 28 +++++ MitziPlayer/MitziPlayer.csproj | 14 +++ MitziPlayer/Program.cs | 72 ++++++++++++ PC2SSTPlayer/INIFile.cs | 2 +- PC2SSTPlayer/Program.cs | 2 +- ...kConnection2-Firmware-Servo-HelenMitzi.ino | 103 ++++++++++++++++++ mitzifier/Program.cs | 2 +- .../{rshw2sst.csproj => mitzifier.csproj} | 0 8 files changed, 220 insertions(+), 3 deletions(-) create mode 100644 MitziPlayer/INIFile.cs create mode 100644 MitziPlayer/MitziPlayer.csproj create mode 100644 MitziPlayer/Program.cs create mode 100644 PinkConnection2-Firmware-Servo-HelenMitzi/PinkConnection2-Firmware-Servo-HelenMitzi.ino rename mitzifier/{rshw2sst.csproj => mitzifier.csproj} (100%) diff --git a/MitziPlayer/INIFile.cs b/MitziPlayer/INIFile.cs new file mode 100644 index 0000000..b80671f --- /dev/null +++ b/MitziPlayer/INIFile.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace MitziPlayer +{ + public class INIFile + { + public Dictionary Data { get; set; } + + public INIFile(Dictionary data) + { + Data = data; + } + + public static INIFile Load(string inPath) + { + Dictionary outData = new Dictionary(); + string[] rawFile = File.ReadAllLines(inPath); + foreach (string line in rawFile) + { + if (line.StartsWith(";") || line.Trim() == "") continue; + outData.Add(line.Split("=")[0].Trim(), line.Split("=")[1].Trim()); + } + return new INIFile(outData); + } + } +} diff --git a/MitziPlayer/MitziPlayer.csproj b/MitziPlayer/MitziPlayer.csproj new file mode 100644 index 0000000..0438bed --- /dev/null +++ b/MitziPlayer/MitziPlayer.csproj @@ -0,0 +1,14 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + diff --git a/MitziPlayer/Program.cs b/MitziPlayer/Program.cs new file mode 100644 index 0000000..315881c --- /dev/null +++ b/MitziPlayer/Program.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.IO.Ports; + +using System.Timers; + +namespace MitziPlayer +{ + public class Program + { + static INIFile Config; + static string PathPrefix="/"; + static int[] Signals; + static SerialPort port = null; + static System.Timers.Timer FrameTimer; + static long index = 0; + static int frameSkip = 6; + + static void Main(string[] args) + { + Config = INIFile.Load(args[0]); + PathPrefix = Path.GetFullPath(args[0]).Replace("manifest.ini", ""); + Signals = LoadSignals(File.ReadAllLines(PathPrefix+Config.Data["data"])); + //port = new SerialPort(args[1], 9600, Parity.None, 8, StopBits.One); + //port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); + //port.Open(); + FrameTimer = new System.Timers.Timer((1000d/double.Parse(Config.Data["frames-per-second"]))*frameSkip); + FrameTimer.Elapsed += PlaySignal; + FrameTimer.AutoReset = true; + + PlayAudio(); + FrameTimer.Start(); + Console.ReadLine(); + //port.Close(); + } + + private static void port_DataReceived(object sender, SerialDataReceivedEventArgs e) + { + Console.Write(port.ReadExisting()); + } + + static int[] LoadSignals(string[] inData) + { + List tmpOut = new List(); + foreach (string frame in inData) tmpOut.Add(int.Parse(frame, NumberStyles.HexNumber)); + return tmpOut.ToArray(); + } + + static void PlayAudio() + { + Process.Start("mpv", PathPrefix+Config.Data["audio"]); + } + + static void PlaySignal(Object sender, ElapsedEventArgs e) + { + if (index >= Signals.Length) + { + FrameTimer.Stop(); + Console.WriteLine("Complete!"); + return; + } + int b = Signals[index]; + + char[] bytesOut = { (char)(64 | ((b & 8) | (b & 4) | (b & 2) | (b & 1))), (char)(64 | (((b & 128) | (b & 64) | (b & 32) | (b & 16)) >> 4)), (char)(64 | (((b & 2048) | (b & 1024) | (b & 512) | (b & 256)) >> 8)), (char)(64 | (((b & 32768) | (b & 16384) | (b & 8192) | (b & 4096)) >> 12)), (char)(64 | (((b & 262144) | (b & 131072) | (b & 65536)) >> 16)) }; + port.Write(new string(bytesOut)); + index+=frameSkip; + } + } +} diff --git a/PC2SSTPlayer/INIFile.cs b/PC2SSTPlayer/INIFile.cs index 41cf682..5bd61e2 100644 --- a/PC2SSTPlayer/INIFile.cs +++ b/PC2SSTPlayer/INIFile.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace SSTServoPlayer +namespace PC2SSTPlayer { public class INIFile { diff --git a/PC2SSTPlayer/Program.cs b/PC2SSTPlayer/Program.cs index 4c3bd99..d123bee 100644 --- a/PC2SSTPlayer/Program.cs +++ b/PC2SSTPlayer/Program.cs @@ -5,7 +5,7 @@ using System.IO.Ports; using System.Text; using System.Timers; -namespace SSTServoPlayer +namespace PC2SSTPlayer { public class Program { diff --git a/PinkConnection2-Firmware-Servo-HelenMitzi/PinkConnection2-Firmware-Servo-HelenMitzi.ino b/PinkConnection2-Firmware-Servo-HelenMitzi/PinkConnection2-Firmware-Servo-HelenMitzi.ino new file mode 100644 index 0000000..0d5fdf9 --- /dev/null +++ b/PinkConnection2-Firmware-Servo-HelenMitzi/PinkConnection2-Firmware-Servo-HelenMitzi.ino @@ -0,0 +1,103 @@ +// PINKCONNECTION2 Client Program for Helen Henny/Mitzi Mozzarella Servo + +#include +#include + +Servo servoChannel[19]; +byte onDegrees[19] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // these are incomplete, i need to tune them when i get the servos in +byte offDegrees[19] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +int byte1 = 0; +int byte2 = 0; +int byte3 = 0; +int byte4 = 0; +int byte5 = 0; + +void setup() { + servoChannel[0].attach(2); + servoChannel[1].attach(3); + servoChannel[2].attach(4); + servoChannel[3].attach(5); + servoChannel[4].attach(6); + servoChannel[5].attach(7); + servoChannel[6].attach(8); + servoChannel[7].attach(9); + for (int i = 0; i < 19; i++) servoChannel[i].write(offDegrees[i]); + Serial.begin(9600); +} + +void loop() { + if (Serial.available() > 4) { + byte1 = Serial.read(); + byte2 = Serial.read(); + byte3 = Serial.read(); + byte4 = Serial.read(); + byte5 = Serial.read(); + + if ((byte1 & 64) && (byte2 & 64)) + if (byte1 & 1) { + servoChannel[0].write(onDegrees[0]); + digitalWrite(A0, 1); + } else { + servoChannel[0].write(offDegrees[0]); + digitalWrite(A0, 0); + } + + if (byte1 & 2) { + servoChannel[1].write(onDegrees[1]); + digitalWrite(A1, 1); + } else { + servoChannel[1].write(offDegrees[1]); + digitalWrite(A1, 0); + } + + if (byte1 & 4) { + servoChannel[2].write(onDegrees[2]); + digitalWrite(A2, 1); + } else { + servoChannel[2].write(offDegrees[2]); + digitalWrite(A2, 0); + } + + if (byte1 & 8) { + servoChannel[2].write(onDegrees[3]); + digitalWrite(A3, 1); + } else { + //servoChannel[2].write(offDegrees[3]); dont + digitalWrite(A3, 0); + } + + if (byte2 & 1) { + servoChannel[4].write(onDegrees[4]); + digitalWrite(A4, 1); + } else { + servoChannel[4].write(offDegrees[4]); + digitalWrite(A4, 0); + } + + if (byte2 & 2) { + servoChannel[4].write(onDegrees[5]); + digitalWrite(A5, 1); + } else { + //servoChannel[4].write(offDegrees[5]); dont + digitalWrite(A5, 0); + } + + if (byte2 & 4) { + servoChannel[6].write(onDegrees[6]); + digitalWrite(10, 1); + } else { + servoChannel[6].write(offDegrees[6]); + digitalWrite(10, 0); + } + + if (byte2 & 8) { + servoChannel[7].write(onDegrees[7]); + digitalWrite(11, 1); + } else { + servoChannel[7].write(offDegrees[7]); + digitalWrite(11, 0); + } + + } +} diff --git a/mitzifier/Program.cs b/mitzifier/Program.cs index 8ac87cd..0cf2141 100644 --- a/mitzifier/Program.cs +++ b/mitzifier/Program.cs @@ -2,7 +2,7 @@ using System.Collections; using System.IO; -namespace rshw2sst +namespace mitzifier { public class Program { diff --git a/mitzifier/rshw2sst.csproj b/mitzifier/mitzifier.csproj similarity index 100% rename from mitzifier/rshw2sst.csproj rename to mitzifier/mitzifier.csproj