*/
class LedCommandWidget : Gtk.HBox {
+ private const double CYCLE_TIME_MS = 1000.0 / 32768.0;
+
LedCommand command;
public LedCommandWidget (LedCommand _command) {
text = "Set PWM";
break;
case CommandType.RESET_MUX:
- text = "Reset mux";
+ text = "Reset Mux";
+ break;
+ case CommandType.GO_TO_START:
+ text = "Go To Start";
break;
- case CommandType.REPEAT:
- text = "Repeat";
+ case CommandType.BRANCH:
+ text = "Branch";
break;
- case CommandType.STOP:
- text = "Stop";
+ case CommandType.END:
+ text = "End";
+ break;
+ case CommandType.TRIGGER:
+ text = "Trigger";
break;
}
case CommandType.RAMP_WAIT:
var selector = new Hildon.TouchSelector.text ();
for (int i = 1; i <= 31; i++)
- selector.append_text ("%.2f ms".printf (i * 0.49));
+ selector.append_text ("%.2f ms".printf (i * (16 * CYCLE_TIME_MS)));
for (int i = 1; i <= 31; i++)
- selector.append_text ("%.1f ms".printf (i * 15.6));
+ selector.append_text ("%.1f ms".printf (i * (512 * CYCLE_TIME_MS)));
var picker = new Hildon.PickerButton (Hildon.SizeType.FINGER_HEIGHT,
Hildon.ButtonArrangement.VERTICAL);
picker.set_title ("Step time");
picker.set_selector (selector);
int j;
- if (command.step_time <= 31*0.49)
- j = (int) ((command.step_time + 0.001) / 0.49) - 1;
+ if (command.step_time <= 31*(16 * CYCLE_TIME_MS))
+ j = (int) ((command.step_time + 0.001) / (16 * CYCLE_TIME_MS)) - 1;
else
- j = (int) ((command.step_time + 0.01) / 15.6) + 30;
+ j = (int) ((command.step_time + 0.01) / (512 * CYCLE_TIME_MS)) + 30;
picker.set_active (j);
picker.value_changed.connect ((s) => {
double step_time;
int i = s.get_active ();
if (i < 31)
- step_time = (i + 1) * 0.49;
+ step_time = (i + 1) * (16 * CYCLE_TIME_MS);
else
- step_time = (i - 30) * 15.6;
+ step_time = (i - 30) * (512 * CYCLE_TIME_MS);
command.ramp_wait (step_time, command.steps);
});
pack_start (picker, true, true, 0);
});
pack_start (picker, true, true, 0);
break;
+ case CommandType.END:
+ var check = new Hildon.CheckButton (Hildon.SizeType.FINGER_HEIGHT);
+ check.set_label ("Reset");
+ check.set_active (command.steps == -255);
+ check.toggled.connect ((s) => {
+ command.steps = s.get_active () ? -255 : 0;
+ command.changed ();
+ });
+ pack_start (check, true, true, 0);
+ label = new Gtk.Label ("");
+ pack_start (label, true, true, 0);
+ break;
case CommandType.UNKNOWN:
case CommandType.RESET_MUX:
- case CommandType.REPEAT:
- case CommandType.STOP:
+ case CommandType.GO_TO_START:
+ case CommandType.BRANCH:
+ case CommandType.TRIGGER:
label = new Gtk.Label ("");
pack_start (label, true, true, 0);
label = new Gtk.Label ("");
}
class LedCommandRX51 : LedCommand {
+ private const double CYCLE_TIME_MS = 1000.0 / 32768.0;
+
public uint16 code;
public LedCommandRX51 () {
public LedCommandRX51.with_code (uint16 _code) {
code = _code;
+ duration = 16 * CYCLE_TIME_MS;
if ((code & 0x8000) == 0) {
if (code == 0x0000) {
- type = CommandType.REPEAT;
+ type = CommandType.GO_TO_START;
} else if ((code & 0x3e00) != 0) {
type = CommandType.RAMP_WAIT;
steps = code & 0xff;
step_time = code >> 9;
if ((code & 0x4000) == 0)
- step_time = (code >> 9) * 0.49;
+ step_time = (code >> 9) * 16 * CYCLE_TIME_MS;
else {
- step_time = ((code & 0x3e00) >> 9) * 15.6;
+ step_time = ((code & 0x3e00) >> 9) * 512 * CYCLE_TIME_MS;
}
duration = step_time * (steps + 1);
if ((code & 0x100) != 0)
level = code & 0xff;
}
} else {
- if (code == 0x9d80)
+ if (code == 0x9d80) {
type = CommandType.RESET_MUX;
- if (code == 0xc000)
- type = CommandType.STOP;
- //if (code == 0xe0??)
- // type = CommandType.TRIGGER_WAIT;
+ } else if ((code & ~0x1f8f) == 0xa000) {
+ type = CommandType.BRANCH;
+ // 0x1f80: (loop count - 1) << 7
+ // 0x000f: step number
+ } else if ((code & ~0x1800) == 0xc000) {
+ type = CommandType.END;
+ // 0x1000: interrupt
+ if ((code & 0x0800) != 0) // Reset
+ steps = -255;
+ } else if ((code & ~ 0x13f0) == 0xe000) {
+ type = CommandType.TRIGGER;
+ // 0x1000: wait ext
+ // 0x0380: wait B G R
+ // 0x0040: set ext
+ // ??: set B G R
+ }
}
}
base.set_pwm (_level);
}
- public override void ramp_wait (double _step_time, int _steps) requires (_step_time >= 0.49) {
+ public override void ramp_wait (double _step_time, int _steps) requires (_step_time >= (16 * CYCLE_TIME_MS)) {
int step_time;
- if (_step_time <= 31*0.49) {
- step_time = (int) ((_step_time + 0.001) / 0.49);
+ if (_step_time <= 31 * (16 * CYCLE_TIME_MS)) {
+ step_time = (int) ((_step_time + 0.001) / (16 * CYCLE_TIME_MS));
code = (uint16) step_time << 9;
- _step_time = step_time * 0.49;
- } else if (_step_time <= 31*15.6) {
- step_time = (int) ((_step_time + 0.01) / 15.6);
+ _step_time = step_time * (16 * CYCLE_TIME_MS);
+ } else if (_step_time <= 31*(512 * CYCLE_TIME_MS)) {
+ step_time = (int) ((_step_time + 0.01) / (512 * CYCLE_TIME_MS));
code = 0x4000 | (step_time << 9);
- _step_time = step_time * 15.6;
+ _step_time = step_time * (512 * CYCLE_TIME_MS);
} else {
return;
}
ctx.set_line_width (1.0);
CommandType type = CommandType.UNKNOWN;
+ int steps = 0;
foreach (LedCommandRX51 command in pattern.engine1) {
- if (command.type == CommandType.STOP ||
- command.type == CommandType.REPEAT) {
+ if (command.type == CommandType.END ||
+ command.type == CommandType.GO_TO_START) {
type = command.type;
+ steps = command.steps;
break;
}
}
- if (type == CommandType.STOP) {
+ if (type == CommandType.END) {
ctx.new_path ();
ctx.move_to (x, y);
- ctx.line_to (width - 0.5, y);
+ if (steps == -255) {
+ ctx.line_to (x, height - 0.5);
+ ctx.line_to (width - 0.5, height - 0.5);
+ } else {
+ ctx.line_to (width - 0.5, y);
+ }
ctx.stroke ();
}
- if (type == CommandType.REPEAT && pattern.duration > 0.0) {
+ if (type == CommandType.GO_TO_START && pattern.duration >= 3 * 0.49) {
ctx.new_path ();
for (double offset = pattern.duration; (offset * pps/1000.0) <= width; offset += pattern.duration) {
ctx.stroke ();
}
- if (type == CommandType.REPEAT && pattern.duration == 0.0) {
+ if (type == CommandType.GO_TO_START && pattern.duration < 3 * 0.49) {
ctx.new_path ();
RESET_MUX,
SET_PWM,
RAMP_WAIT,
- REPEAT,
- STOP
+ GO_TO_START,
+ BRANCH,
+ END,
+ TRIGGER
}
class LedCommand : Object {