public ExpanderEventArgs(ExpanderState expst) { this.expst = expst; }
private Task Refresh() { return(Task.Run(() => { ExpanderCommandHandle[] cmdhdls; ExpanderCommand[] expcmds = new ExpanderCommand[5]; expcmds[0] = new ExpanderCommand(ExpanderCommand.READ_EXPANDERS_COMMAND); expcmds[1] = new ExpanderCommand(ExpanderCommand.READ_FAN_SPEED_COMMAND); expcmds[2] = new ExpanderCommand(ExpanderCommand.READ_POWER_MONITOR_COMMAND); expcmds[3] = new ExpanderCommand(ExpanderCommand.READ_TEMPERATURES_COMMAND); expcmds[4] = new ExpanderCommand(ExpanderCommand.READ_UPTIME_COMMAND); lock (expander_connection_lock) cmdhdls = expconn.EnqueueCommands(expcmds); ExpanderState new_state = new ExpanderState(); //fill expander state cmdhdls[0].Handle.WaitOne(); byte[] buffer = new byte[4]; Array.Copy(cmdhdls[0].Command.RxPacket, 1, buffer, 0, 4); bool[] converted = buffer.SelectMany(Utilities.GetBits).ToArray(); //resulting order 0: 1, 0 1: 1, 0 Array.Copy(converted, 8, new_state.Expander0State, 0, 8); Array.Copy(converted, 0, new_state.Expander0State, 8, 8); Array.Copy(converted, 24, new_state.Expander1State, 0, 8); Array.Copy(converted, 16, new_state.Expander1State, 8, 8); //apply hardware configuration lock (hwconfig_lock) for (int index_counter = 0; index_counter < 16; index_counter++) { new_state.Expander0State[index_counter] ^= exphwconfig.Expander0Configuration[index_counter]; new_state.Expander1State[index_counter] ^= exphwconfig.Expander1Configuration[index_counter]; } cmdhdls[1].Handle.WaitOne(); buffer = new byte[2]; Array.Copy(cmdhdls[1].Command.RxPacket, 1, buffer, 0, 2); new_state.FanSpeed = BitConverter.ToUInt16(buffer, 0); cmdhdls[2].Handle.WaitOne(); buffer = new byte[8]; Array.Copy(cmdhdls[2].Command.RxPacket, 1, buffer, 0, 8); new_state.BusVoltage = BitConverter.ToSingle(buffer, 0); new_state.BusPower = BitConverter.ToSingle(buffer, 4); cmdhdls[3].Handle.WaitOne(); buffer = new byte[12]; Array.Copy(cmdhdls[3].Command.RxPacket, 1, buffer, 0, 12); new_state.FanTemperature = BitConverter.ToSingle(buffer, 0); new_state.Board0Temperature = BitConverter.ToSingle(buffer, 4); new_state.Board1Temperature = BitConverter.ToSingle(buffer, 8); cmdhdls[4].Handle.WaitOne(); buffer = new byte[8]; Array.Copy(cmdhdls[4].Command.RxPacket, 1, buffer, 0, 4); new_state.Uptime = BitConverter.ToUInt64(buffer, 0); lock (expander_state_lock) expst = new ExpanderState(new_state); if (freshstateevent != null) { freshstateevent(this, new ExpanderEventArgs(new_state)); } })); }