diff --git a/ueforth/Makefile b/ueforth/Makefile index 6ecb262..6a3a561 100644 --- a/ueforth/Makefile +++ b/ueforth/Makefile @@ -106,6 +106,7 @@ $(GEN)/windows_boot.h: common/source_to_string.js $(WINDOWS_BOOT) | $(GEN) ARDUINO_BOOT = common/boot.fs arduino/arduino.fs \ posix/posix_highlevel.fs common/filetools.fs \ common/tasks.fs common/streams.fs arduino/arduino_server.fs \ + arduino/esp_camera.fs \ arduino/autoboot.fs $(GEN)/arduino_boot.h: common/source_to_string.js $(ARDUINO_BOOT) | $(GEN) echo "ok" | cat $(ARDUINO_BOOT) - | $< boot >$@ diff --git a/ueforth/arduino/arduino.template.ino b/ueforth/arduino/arduino.template.ino index 84e0933..bfda88a 100644 --- a/ueforth/arduino/arduino.template.ino +++ b/ueforth/arduino/arduino.template.ino @@ -1,5 +1,6 @@ {{opcodes}} +#include "esp_camera.h" #include #include #include @@ -151,15 +152,26 @@ X("Wire.endTransmission", WIRE_END_TRANSMISSION, tos = (cell_t) Wire.endTransmission(tos)) \ X("Wire.requestFrom", WIRE_REQUEST_FROM, tos = (cell_t) Wire.requestFrom(sp[-1], *sp, tos); sp -= 2) \ X("Wire.writeTransmission", WIRE_WRITE_TRANSMISSION, \ - tos = (cell_t) Wire.writeTransmission(sp[-2], (uint8_t *) sp[-1], *sp, tos); sp -=3) \ + tos = (cell_t) Wire.writeTransmission(sp[-2], (uint8_t *) sp[-1], *sp, tos); sp -=3) \ X("Wire.readTransmission", WIRE_READ_TRANSMISSION, \ - tos = (cell_t) Wire.readTransmission(sp[-3], (uint8_t *) sp[-2], sp[-1], *sp, (uint32_t *) tos); sp -=4) \ + tos = (cell_t) Wire.readTransmission(sp[-3], (uint8_t *) sp[-2], sp[-1], *sp, (uint32_t *) tos); sp -=4) \ X("Wire.write", WIRE_WRITE, tos = Wire.write((uint8_t *) *sp, tos); --sp) \ X("Wire.available", WIRE_AVAILABLE, DUP; tos = Wire.available()) \ X("Wire.read", WIRE_READ, DUP; tos = Wire.read()) \ X("Wire.peek", WIRE_PEEK, DUP; tos = Wire.peek()) \ X("Wire.busy", WIRE_BUSY, DUP; tos = Wire.busy()) \ X("Wire.flush", WIRE_FLUSH, Wire.flush()) \ + /* Camera */ \ + X("esp_camera_init", ESP_CAMERA_INIT, \ + tos = esp_camera_init((const camera_config_t *) tos)) \ + X("esp_camera_deinit", ESP_CAMERA_DEINIT, \ + DUP; tos = esp_camera_deinit()) \ + X("esp_camera_fb_get", ESP_CAMERA_FB_GET, \ + DUP; tos = (cell_t) esp_camera_fb_get()) \ + X("esp_camera_db_return", ESP_CAMERA_FB_RETURN, \ + esp_camera_fb_return((camera_fb_t *) tos); DROP) \ + X("esp_camera_sensor_get", ESP_CAMERA_SENSOR_GET, \ + DUP; tos = (cell_t) esp_camera_sensor_get()) \ // TODO: Why doesn't ftruncate exist? // X("RESIZE-FILE", RESIZE_FILE, cell_t fd = tos; DROP; \ diff --git a/ueforth/arduino/esp_camera.fs b/ueforth/arduino/esp_camera.fs new file mode 100644 index 0000000..2e0c776 --- /dev/null +++ b/ueforth/arduino/esp_camera.fs @@ -0,0 +1,30 @@ +( Handling for ESP32-CAM ) + +0 constant PIXFORMAT_RGB565 +1 constant PIXFORMAT_YUV422 +2 constant PIXFORMAT_GRAYSCALE +3 constant PIXFORMAT_JPEG +4 constant PIXFORMAT_RGB888 +5 constant PIXFORMAT_RAW +6 constant PIXFORMAT_RGB444 +7 constant PIXFORMAT_RGB555 + +5 constant FRAMESIZE_QVGA +8 constant FRAMESIZE_VGA + +( See https://github.com/espressif/esp32-camera/blob/master/driver/include/esp_camera.h ) +( Settings for AI_THINKER ) +create camera-config + 32 , ( pin_pwdn ) -1 , ( pin_reset ) 0 , ( pin_xclk ) + 26 , ( pin_sscb_sda ) 27 , ( pin_sscb_scl ) + 35 , 34 , 39 , 36 , 21 , 19 , 18 , 5 , ( pin_d7 - pin_d0 ) + 25 , ( pin_vsync ) 23 , ( pin_href ) 22 , ( pin_pclk ) + 20000000 , ( xclk_freq_hz ) + 0 , ( ledc_timer ) 0 , ( ledc_channel ) + here + PIXFORMAT_RGB565 , ( pixel_format ) + FRAMESIZE_VGA , ( frame_size ) 12 , ( jpeg_quality 0-63 low good ) + here + 1 , ( fb_count ) +constant camera-fb-count +constant camera-format