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; } } }