Rev 164 | Rev 167 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace nitdcscore {public abstract class Control {public UInt64 value { get; set; }public Control(Command command) {commands.Add(command);}public List<Command> commands = new List<Command>();public Utils.InputPair data { get; set; } // The data from the panelpublic Boolean updated { get; set; }public abstract void Tick();}public class Switch2Pos : Control {public int pin { get; set; }public Boolean invert { get; set; }public Switch2Pos(Command command, int pin, Boolean invert = false) : base(command) {this.invert = invert;this.pin = pin;}public override void Tick() {UInt64 chg = (UInt64)(data.prev >> pin) & 0x01;UInt64 norm = (UInt64)(data.curr >> pin) & 0x01;this.value = 0;if ((UInt64)(norm) == 1) {value = (UInt64)(invert ? 0 : 1);} else {value = (UInt64)(invert ? 1 : 0);}if (this.commands != null && norm != chg) {foreach (Command cmd in this.commands) {cmd.data = this.data;if (cmd.Send(this.value) == 0)Console.Write(cmd.ToString());}}}}public class Switch3Pos : Control {public int pin0 { get; set; }public int pin1 { get; set; }public Boolean invert { get; set; }public Switch3Pos(Command command, int pin0, int pin1, Boolean invert = false) : base(command) {this.pin0 = pin0;this.pin1 = pin1;this.invert = invert;}public override void Tick() {UInt64 chg0 = (UInt64)(data.prev >> pin0) & 0x01;UInt64 chg1 = (UInt64)(data.prev >> pin1) & 0x01;UInt64 nrm0 = (UInt64)(data.curr >> pin0) & 0x01;UInt64 nrm1 = (UInt64)(data.curr >> pin1) & 0x01;this.value = 1;if ((UInt64)nrm0 == 1)this.value = (UInt64)(invert ? 2 : 0);else if ((uint)nrm1 == 1)this.value = (UInt64)(invert ? 0 : 2);if (this.commands != null && ((nrm0 != chg0) || (nrm1 != chg1))) {foreach (Command cmd in this.commands) {cmd.data = this.data;if (cmd.Send(this.value) == 0)Console.Write(cmd.ToString());}}}}public class Selector : Control {int[] pins;public Selector(Command command, int[] pins) : base(command) {this.pins = pins;this.value = 0;}public override void Tick() {// This is a rather complicated way to check what the previous select// was, and was the current selection is. Not really needed, but hoping it// might come in handy for something else down the line.UInt64 chg = 0;UInt64 norm = 0;UInt64 mask = 0;for (int i = 0; i < pins.Length; i++) // Create a mask of how many selection points there aremask |= (UInt64)1 << i;for (int i = 0; i < pins.Length; i++) {chg |= (UInt64)(data.prev >> (pins[i] - i)); // Narrow down to the previsouly selected bitnorm |= (UInt64)(data.curr >> (pins[i] - i)); // Narrow down to the currently selected bitif ((UInt64)((data.curr >> pins[i]) & 0x01) == 1) { // Decode the value we need to usevalue = (UInt64)i;}}norm &= mask; // Remove any bits from abovechg &= mask;if (norm == 0) // Can sometimes be in the inbetween selector switch, ignorereturn;if (norm != chg) { // Send the update if neededforeach (Command cmd in this.commands) {cmd.data = this.data;if (cmd.Send(this.value) == 0)Console.Write(cmd.ToString());}}}}}