Rev 167 | Rev 171 | 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 jsdata data { get; set; }
public 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.buttons >> 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.buttons >> pin0) & 0x01;
UInt64 nrm1 = (UInt64)(data.buttons >> 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 Potentiometer : Control {
public int channel { get; set; }
public Boolean invert { get; set; }
public Potentiometer(Command command, int channel) : base(command) {
this.channel = channel;
}
public override void Tick() {
UInt16 tmpval = 0;
bool changed = data.axis[channel].getPosition(ref tmpval);
this.value = tmpval;
if (changed) {
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 are
mask |= (UInt64)1 << i;
for (int i = 0; i < pins.Length; i++) {
chg |= (UInt64)(data.prev >> (pins[i] - i)); // Narrow down to the previsouly selected bit
norm |= (UInt64)(data.buttons >> (pins[i] - i)); // Narrow down to the currently selected bit
if ((UInt64)((data.buttons >> pins[i]) & 0x01) == 1) { // Decode the value we need to use
value = (UInt64)i;
}
}
norm &= mask; // Remove any bits from above
chg &= mask;
if (norm == 0) // Can sometimes be in the inbetween selector switch, ignore
return;
if (norm != chg) { // Send the update if needed
foreach (Command cmd in this.commands) {
cmd.data = this.data;
if (cmd.Send(this.value) == 0)
Console.Write(cmd.ToString());
}
}
}
}
}