Skip to content

Commit 8bd9e33

Browse files
authored
Emulate reversible digital pin primitives (#265)
1 parent e51383c commit 8bd9e33

File tree

1 file changed

+48
-7
lines changed

1 file changed

+48
-7
lines changed

src/Primitives/emulated.cpp

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -388,23 +388,64 @@ def_prim(http_post, tenToOneU32) {
388388
return true;
389389
}
390390

391+
#define NUM_DIGITAL_PINS 30
392+
static uint32_t PINS[NUM_DIGITAL_PINS] = {};
393+
static uint8_t MODES[NUM_DIGITAL_PINS] = {};
394+
391395
def_prim(chip_pin_mode, twoToNoneU32) {
392-
debug("EMU: chip_pin_mode(%u,%u) \n", arg1.uint32, arg0.uint32);
396+
uint8_t pin = arg1.uint32;
397+
uint8_t val = arg0.uint32;
398+
if (pin < NUM_DIGITAL_PINS) {
399+
MODES[pin] = val;
400+
}
393401
pop_args(2);
394-
return true;
402+
printf("EMU: chip_pin_mode(%u,%u) \n", pin, val);
403+
return pin < NUM_DIGITAL_PINS;
395404
}
396405

397406
def_prim(chip_digital_write, twoToNoneU32) {
398-
printf("EMU: chip_digital_write(%u,%u) \n", arg1.uint32, arg0.uint32);
407+
uint8_t pin = arg1.uint32;
408+
uint8_t val = arg0.uint32;
409+
printf("EMU: chip_digital_write(%u,%u) \n", pin, val);
410+
bool writable = pin < NUM_DIGITAL_PINS && MODES[pin] == 0x02;
411+
if (writable) {
412+
PINS[pin] = val;
413+
}
399414
pop_args(2);
400-
return true;
415+
return writable;
416+
}
417+
418+
def_prim_reverse(chip_digital_write) {
419+
for (IOStateElement state : external_state) {
420+
if (!state.output) {
421+
continue;
422+
}
423+
424+
if (state.key[0] == 'p') {
425+
invoke_primitive(m, "chip_digital_write", stoi(state.key.substr(1)),
426+
(uint32_t)state.value);
427+
}
428+
}
429+
}
430+
431+
def_prim_serialize(chip_digital_write) {
432+
for (int pin = 0; pin < NUM_DIGITAL_PINS; pin++) {
433+
auto *state = new IOStateElement();
434+
state->key = "p" + std::to_string(pin);
435+
state->output = MODES[pin] == 0x01;
436+
state->value = PINS[pin];
437+
external_state.push_back(state);
438+
}
401439
}
402440

403441
def_prim(chip_digital_read, oneToOneU32) {
404-
// uint8_t pin = arg0.uint32; // never used in emulator
442+
uint8_t pin = arg0.uint32;
405443
pop_args(1);
406-
pushUInt32(1); // HIGH
407-
return true;
444+
if (pin < NUM_DIGITAL_PINS) {
445+
pushUInt32(PINS[pin]);
446+
return true;
447+
}
448+
return false;
408449
}
409450

410451
def_prim(chip_analog_read, oneToOneI32) {

0 commit comments

Comments
 (0)