@@ -388,23 +388,64 @@ def_prim(http_post, tenToOneU32) {
388
388
return true ;
389
389
}
390
390
391
+ #define NUM_DIGITAL_PINS 30
392
+ static uint32_t PINS[NUM_DIGITAL_PINS] = {};
393
+ static uint8_t MODES[NUM_DIGITAL_PINS] = {};
394
+
391
395
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
+ }
393
401
pop_args (2 );
394
- return true ;
402
+ printf (" EMU: chip_pin_mode(%u,%u) \n " , pin, val);
403
+ return pin < NUM_DIGITAL_PINS;
395
404
}
396
405
397
406
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
+ }
399
414
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
+ }
401
439
}
402
440
403
441
def_prim (chip_digital_read, oneToOneU32) {
404
- // uint8_t pin = arg0.uint32; // never used in emulator
442
+ uint8_t pin = arg0.uint32 ;
405
443
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 ;
408
449
}
409
450
410
451
def_prim (chip_analog_read, oneToOneI32) {
0 commit comments