#include "DS.hpp" float DS_Module::midpoint() { return (voltage0 * 0.5f + voltage1 * 0.5f); } json_t *DS_Module::toJson() { json_t *rootJ = json_object(); json_object_set_new(rootJ, "voltage0", json_real(voltage0)); json_object_set_new(rootJ, "voltage1", json_real(voltage1)); return rootJ; } void DS_Module::fromJson(json_t *rootJ) { json_t *j0 = json_object_get(rootJ, "voltage0"); if (j0) voltage0 = json_number_value(j0); json_t *j1 = json_object_get(rootJ, "voltage1"); if (j1) voltage1 = json_number_value(j1); } void DS_Module::onReset() { voltage0 = 0.0f; voltage1 = 5.0f; } float DS_Module::output(int state) { return state?voltage1:voltage0; } void DS_Module::appendContextMenu(Menu *menu) { menu->addChild(MenuEntry::create()); DS_MenuItem *m = MenuItem::create("Range 0V - 1V"); m->module = this; m->vl = 0.0f; m->vh = 1.0f; menu->addChild(m); m = MenuItem::create("Range 0V - 5V"); m->module = this; m->vl = 0.0f; m->vh = 5.0f; menu->addChild(m); m = MenuItem::create("Range 0V - 10V"); m->module = this; m->vl = 0.0f; m->vh = 10.0f; menu->addChild(m); m = MenuItem::create("Range -5V - 5V"); m->module = this; m->vl = -5.0f; m->vh = 5.0f; menu->addChild(m); m = MenuItem::create("Range -10V - 10V"); m->module = this; m->vl = -10.0f; m->vh = 10.0f; menu->addChild(m); } void DS_MenuItem::onAction(EventAction &e) { module->voltage0 = vl; module->voltage1 = vh; } void DS_MenuItem::step() { rightText = CHECKMARK((module->voltage0 == vl) && (module->voltage1 == vh)); } float DS_Schmitt::high(float v0, float v1) { return (v0 * 0.4f + v1 * 0.6f); } float DS_Schmitt::low(float v0, float v1) { return (v0 * 0.6f + v1 * 0.4f); } void DS_Schmitt::reset() { _state = 0; } void DS_Schmitt::set() { _state = 1; } void DS_Schmitt::set(int state) { _state = state; } int DS_Schmitt::state(float vl, float vh, float v) { if (_state) { if (v < vl) _state = 0; } else { if (v > vh) _state = 1; } return _state; } int DS_Schmitt::state(DS_Module *module, float v) { return state(low(module->voltage0, module->voltage1), high(module->voltage0, module->voltage1), v); } int DS_Schmitt::edge(float vl, float vh, float v) { int old = _state; return (state(vl, vh, v) != old); } int DS_Schmitt::edge(DS_Module *module, float v) { int old = _state; return (state(module, v) != old); } int DS_Schmitt::edge(float vl, float vh, float v, int falling) { return falling?fedge(vl, vh, v):redge(vl, vh, v); } int DS_Schmitt::edge(DS_Module *module, float v, int falling) { return falling?fedge(module, v):redge(module, v); } int DS_Schmitt::redge(float vl, float vh, float v) { int old = _state; return (state(vl, vh, v) && !old); } int DS_Schmitt::redge(DS_Module *module, float v) { int old = _state; return (state(module, v) && !old); } int DS_Schmitt::fedge(float vl, float vh, float v) { int old = _state; return (!state(vl, vh, v) && old); } int DS_Schmitt::fedge(DS_Module *module, float v) { int old = _state; return (!state(module, v) && old); }