internal void writeUsb(ClovershellCommand cmd, byte arg, byte[] data = null, int l = -1) { if (!online) { throw new ClovershellException("NES Mini is offline"); } var len = (l >= 0) ? l : ((data != null) ? data.Length : 0); var buff = new byte[len + 4]; buff[0] = (byte)cmd; buff[1] = arg; buff[2] = (byte)(len & 0xFF); buff[3] = (byte)((len >> 8) & 0xFF); if (data != null) { Array.Copy(data, 0, buff, 4, len); } int tLen = 0; int pos = 0; len += 4; int repeats = 0; while (pos < len) { var res = epWriter.Write(buff, pos, len, 1000, out tLen); pos += tLen; len -= tLen; if (res != ErrorCode.Ok) { if (repeats >= 3) { break; } repeats++; Thread.Sleep(100); } } if (len > 0) { throw new ClovershellException("write error"); } }
internal void writeUsb(ClovershellCommand cmd, byte arg, byte[] data = null, int pos = 0, int l = -1) { if (!IsOnline) throw new ClovershellException("NES Mini is offline"); if (epWriter == null) return; lock (epWriter) { var len = (l >= 0) ? l : ((data != null) ? (data.Length - pos) : 0); #if VERY_DEBUG Debug.WriteLine(string.Format("->[CLV] cmd={0}, arg={1:X2}, len={2}, data={3}", cmd, arg, len, data != null ? BitConverter.ToString(data, pos, len) : "")); #endif var buff = new byte[len + 4]; buff[0] = (byte)cmd; buff[1] = arg; buff[2] = (byte)(len & 0xFF); buff[3] = (byte)((len >> 8) & 0xFF); if (data != null) Array.Copy(data, pos, buff, 4, len); int tLen = 0; pos = 0; len += 4; int repeats = 0; while (pos < len) { var res = epWriter.Write(buff, pos, len, 1000, out tLen); #if VERY_DEBUG Debug.WriteLine("->[CLV] " + BitConverter.ToString(buff, pos, len)); #endif pos += tLen; len -= tLen; if (res != ErrorCode.Ok) { if (repeats >= 10) break; repeats++; Thread.Sleep(100); } } if (len > 0) throw new ClovershellException("write error"); } }
void proceedPacket(ClovershellCommand cmd, byte arg, byte[] data, int pos, int len) { if (len < 0) len = data.Length; #if VERY_DEBUG Debug.WriteLine(string.Format("<-[CLV] cmd={0}, arg={1:X2}, len={2}, data={3}", cmd, arg, len, BitConverter.ToString(data, pos, len))); #endif lastAliveTime = DateTime.Now; switch (cmd) { case ClovershellCommand.CMD_PONG: lastPingResponse = new byte[len]; Array.Copy(data, pos, lastPingResponse, 0, len); break; case ClovershellCommand.CMD_SHELL_NEW_RESP: acceptShellConnection(arg); break; case ClovershellCommand.CMD_SHELL_OUT: shellOut(arg, data, pos, len); break; case ClovershellCommand.CMD_SHELL_CLOSED: shellClosed(arg); break; case ClovershellCommand.CMD_EXEC_NEW_RESP: newExecConnection(arg, Encoding.UTF8.GetString(data, pos, len)); break; case ClovershellCommand.CMD_EXEC_STDOUT: execOut(arg, data, pos, len); break; case ClovershellCommand.CMD_EXEC_STDERR: execErr(arg, data, pos, len); break; case ClovershellCommand.CMD_EXEC_RESULT: execResult(arg, data, pos, len); break; case ClovershellCommand.CMD_EXEC_STDIN_FLOW_STAT: execStdinStat(arg, data, pos, len); break; } }