// 8bit value (poke address value) Item *poke(List *expression) { uint16_t addr = eval_as_uint16(second(expression)); if (third(expression)) { *((uint8_t *)(addr)) = eval_as_uint8(third(expression)); } return peek(expression); }
// (set_pin <pinid> <value>) Item *lio_setpin(List *expression) { const uint8_t pinid = eval_as_uint8(second(expression)); for (List *values = rest(rest(expression)); values; values = rest(values)) { set_pin_value(pinid, eval_as_uint16(first(values))); } return 0; }
// (pin_mode <pinid> IN|HIGH|OUT|PWM|ADC [value]) Item *lio_pinmode(List *expression) { const uint8_t pinid = eval_as_uint8(second(expression)); pin_mode(pinid, eval_as_string(third(expression))); Item *value = fourth(expression); if (value) { set_pin_value(pinid, eval_as_uint16(value)); } return 0; }
Item *port(List *expression) { uint16_t value = eval_as_uint16(second(expression)); uint8_t i=0; for (List *remaining = rest(rest(expression)); remaining; remaining = rest(remaining)) { set_pin_value(eval_as_uint8(first(remaining)), value & (1<<i)); i++; } return 0; }
Item *fmt(List *expression) { char *fmt = (char *)eval_as_string(second(expression)); uint16_t fmt_size = strlen(fmt)+1; uint16_t value = eval_as_uint16(third(expression)); // move the format to the back of our fixed string buffer char *moved_fmt = str_buf+STRBUFSIZE-fmt_size; strcpy(moved_fmt, fmt); // and write the formatted string to the buffer snprintf(str_buf, STRBUFSIZE-fmt_size, moved_fmt, value); return string_retval(); }
// (set_pin <pinid> <value>) Item *lio_setpin(List *expression) { const uint8_t pinid = eval_as_uint8(second(expression)); set_pin_value(pinid, eval_as_uint16(third(expression))); return 0; }
// 8bit value (peek address) Item *peek(List *expression) { uint16_t addr = eval_as_uint16(second(expression)); return uint8_retval(*((uint8_t *)(addr))); }
Item *every(List *expression) { scheduler_add(eval_as_uint16(second(expression)),store_expression(rest(rest(expression)))); return 0; }