public void Start(string deviceFile) { //Mono.Unix.UnixSymbolicLinkInfo i = new Mono.Unix.UnixSymbolicLinkInfo( deviceFile ); //Console.WriteLine(i.ContentsPath); // ../js0 //Console.WriteLine(i.FullName); // fullpath //Console.WriteLine(i.Name); // filename //var path = "/dev/input/by-id/" + i.ContentsPath; var path = deviceFile; if (!File.Exists(path)) { throw new FileNotFoundException(path); } SemaphoreSlim run = new SemaphoreSlim(1); new Thread(() => { if (fs != null) { fs.Close(); } // Read loop. fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); log.Info("opened " + path); var buff = new js_event() { raw = new byte[8] }; Joystick j = new Joystick(); var started = false; while (true) { try { // Read 8 bytes from file and analyze. var read = fs.Read(buff.raw, 0, 8); if (read != 8) { continue; } //Console.WriteLine(buff.ToJSON()); j.DetectChange(buff); /* * // Prints Axis values * foreach (byte key in j.Axis.Keys) * { * Console.WriteLine(string.Format("Axis{0}: {1}", key, j.Axis[key])); * } * * // Prints Buttons values * foreach (byte key in j.Button.Keys) * { * Console.WriteLine(string.Format("Button{0}: {1}", key, j.Button[key])); * } */ state = new LinuxJoystickState( j.Axis.ToDictionary(a => a.Key, a => (ushort)((int)a.Value + (65535 / 2))), j.Button.ToDictionary(a => a.Key, a => a.Value)); if (started == false) { log.Info("Joystick Task Started"); run.Release(); } started = true; } catch (Exception ex) { log.Error(ex); break; } } log.Info("Joystick Task Ended"); }).Start(); // wait for the task to start if (!run.Wait(1000)) { log.Error("Failed to Start joystick task"); throw new Exception("Fail to start joystick task"); } Thread.Sleep(200); }