Add files via upload
This commit is contained in:
parent
032e6b8259
commit
d67d1d7da1
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,299 @@
|
|||
|
||||
#if defined(CAMERA_MODEL_WROVER_KIT)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 21
|
||||
#define SIOD_GPIO_NUM 26
|
||||
#define SIOC_GPIO_NUM 27
|
||||
|
||||
#define Y9_GPIO_NUM 35
|
||||
#define Y8_GPIO_NUM 34
|
||||
#define Y7_GPIO_NUM 39
|
||||
#define Y6_GPIO_NUM 36
|
||||
#define Y5_GPIO_NUM 19
|
||||
#define Y4_GPIO_NUM 18
|
||||
#define Y3_GPIO_NUM 5
|
||||
#define Y2_GPIO_NUM 4
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 23
|
||||
#define PCLK_GPIO_NUM 22
|
||||
|
||||
#elif defined(CAMERA_MODEL_ESP_EYE)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 4
|
||||
#define SIOD_GPIO_NUM 18
|
||||
#define SIOC_GPIO_NUM 23
|
||||
|
||||
#define Y9_GPIO_NUM 36
|
||||
#define Y8_GPIO_NUM 37
|
||||
#define Y7_GPIO_NUM 38
|
||||
#define Y6_GPIO_NUM 39
|
||||
#define Y5_GPIO_NUM 35
|
||||
#define Y4_GPIO_NUM 14
|
||||
#define Y3_GPIO_NUM 13
|
||||
#define Y2_GPIO_NUM 34
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
|
||||
#define LED_GPIO_NUM 22
|
||||
|
||||
#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM 15
|
||||
#define XCLK_GPIO_NUM 27
|
||||
#define SIOD_GPIO_NUM 25
|
||||
#define SIOC_GPIO_NUM 23
|
||||
|
||||
#define Y9_GPIO_NUM 19
|
||||
#define Y8_GPIO_NUM 36
|
||||
#define Y7_GPIO_NUM 18
|
||||
#define Y6_GPIO_NUM 39
|
||||
#define Y5_GPIO_NUM 5
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
|
||||
#elif defined(CAMERA_MODEL_M5STACK_V2_PSRAM)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM 15
|
||||
#define XCLK_GPIO_NUM 27
|
||||
#define SIOD_GPIO_NUM 22
|
||||
#define SIOC_GPIO_NUM 23
|
||||
|
||||
#define Y9_GPIO_NUM 19
|
||||
#define Y8_GPIO_NUM 36
|
||||
#define Y7_GPIO_NUM 18
|
||||
#define Y6_GPIO_NUM 39
|
||||
#define Y5_GPIO_NUM 5
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
|
||||
#elif defined(CAMERA_MODEL_M5STACK_WIDE)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM 15
|
||||
#define XCLK_GPIO_NUM 27
|
||||
#define SIOD_GPIO_NUM 22
|
||||
#define SIOC_GPIO_NUM 23
|
||||
|
||||
#define Y9_GPIO_NUM 19
|
||||
#define Y8_GPIO_NUM 36
|
||||
#define Y7_GPIO_NUM 18
|
||||
#define Y6_GPIO_NUM 39
|
||||
#define Y5_GPIO_NUM 5
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
|
||||
#define LED_GPIO_NUM 2
|
||||
|
||||
#elif defined(CAMERA_MODEL_M5STACK_ESP32CAM)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM 15
|
||||
#define XCLK_GPIO_NUM 27
|
||||
#define SIOD_GPIO_NUM 25
|
||||
#define SIOC_GPIO_NUM 23
|
||||
|
||||
#define Y9_GPIO_NUM 19
|
||||
#define Y8_GPIO_NUM 36
|
||||
#define Y7_GPIO_NUM 18
|
||||
#define Y6_GPIO_NUM 39
|
||||
#define Y5_GPIO_NUM 5
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 17
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
|
||||
#elif defined(CAMERA_MODEL_M5STACK_UNITCAM)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM 15
|
||||
#define XCLK_GPIO_NUM 27
|
||||
#define SIOD_GPIO_NUM 25
|
||||
#define SIOC_GPIO_NUM 23
|
||||
|
||||
#define Y9_GPIO_NUM 19
|
||||
#define Y8_GPIO_NUM 36
|
||||
#define Y7_GPIO_NUM 18
|
||||
#define Y6_GPIO_NUM 39
|
||||
#define Y5_GPIO_NUM 5
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
|
||||
#elif defined(CAMERA_MODEL_AI_THINKER)
|
||||
#define PWDN_GPIO_NUM 32
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 0
|
||||
#define SIOD_GPIO_NUM 26
|
||||
#define SIOC_GPIO_NUM 27
|
||||
|
||||
#define Y9_GPIO_NUM 35
|
||||
#define Y8_GPIO_NUM 34
|
||||
#define Y7_GPIO_NUM 39
|
||||
#define Y6_GPIO_NUM 36
|
||||
#define Y5_GPIO_NUM 21
|
||||
#define Y4_GPIO_NUM 19
|
||||
#define Y3_GPIO_NUM 18
|
||||
#define Y2_GPIO_NUM 5
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 23
|
||||
#define PCLK_GPIO_NUM 22
|
||||
|
||||
#define LED_GPIO_NUM 33
|
||||
|
||||
#elif defined(CAMERA_MODEL_TTGO_T_JOURNAL)
|
||||
#define PWDN_GPIO_NUM 0
|
||||
#define RESET_GPIO_NUM 15
|
||||
#define XCLK_GPIO_NUM 27
|
||||
#define SIOD_GPIO_NUM 25
|
||||
#define SIOC_GPIO_NUM 23
|
||||
|
||||
#define Y9_GPIO_NUM 19
|
||||
#define Y8_GPIO_NUM 36
|
||||
#define Y7_GPIO_NUM 18
|
||||
#define Y6_GPIO_NUM 39
|
||||
#define Y5_GPIO_NUM 5
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 17
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
|
||||
#elif defined(CAMERA_MODEL_XIAO_ESP32S3)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 10
|
||||
#define SIOD_GPIO_NUM 40
|
||||
#define SIOC_GPIO_NUM 39
|
||||
|
||||
#define Y9_GPIO_NUM 48
|
||||
#define Y8_GPIO_NUM 11
|
||||
#define Y7_GPIO_NUM 12
|
||||
#define Y6_GPIO_NUM 14
|
||||
#define Y5_GPIO_NUM 16
|
||||
#define Y4_GPIO_NUM 18
|
||||
#define Y3_GPIO_NUM 17
|
||||
#define Y2_GPIO_NUM 15
|
||||
#define VSYNC_GPIO_NUM 38
|
||||
#define HREF_GPIO_NUM 47
|
||||
#define PCLK_GPIO_NUM 13
|
||||
|
||||
#define LED_GPIO_NUM 21
|
||||
|
||||
#elif defined(CAMERA_MODEL_ESP32_CAM_BOARD)
|
||||
// The 18 pin header on the board has Y5 and Y3 swapped
|
||||
#define USE_BOARD_HEADER 0
|
||||
#define PWDN_GPIO_NUM 32
|
||||
#define RESET_GPIO_NUM 33
|
||||
#define XCLK_GPIO_NUM 4
|
||||
#define SIOD_GPIO_NUM 18
|
||||
#define SIOC_GPIO_NUM 23
|
||||
|
||||
#define Y9_GPIO_NUM 36
|
||||
#define Y8_GPIO_NUM 19
|
||||
#define Y7_GPIO_NUM 21
|
||||
#define Y6_GPIO_NUM 39
|
||||
#if USE_BOARD_HEADER
|
||||
#define Y5_GPIO_NUM 13
|
||||
#else
|
||||
#define Y5_GPIO_NUM 35
|
||||
#endif
|
||||
#define Y4_GPIO_NUM 14
|
||||
#if USE_BOARD_HEADER
|
||||
#define Y3_GPIO_NUM 35
|
||||
#else
|
||||
#define Y3_GPIO_NUM 13
|
||||
#endif
|
||||
#define Y2_GPIO_NUM 34
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
|
||||
#elif defined(CAMERA_MODEL_ESP32S3_CAM_LCD)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 40
|
||||
#define SIOD_GPIO_NUM 17
|
||||
#define SIOC_GPIO_NUM 18
|
||||
|
||||
#define Y9_GPIO_NUM 39
|
||||
#define Y8_GPIO_NUM 41
|
||||
#define Y7_GPIO_NUM 42
|
||||
#define Y6_GPIO_NUM 12
|
||||
#define Y5_GPIO_NUM 3
|
||||
#define Y4_GPIO_NUM 14
|
||||
#define Y3_GPIO_NUM 47
|
||||
#define Y2_GPIO_NUM 13
|
||||
#define VSYNC_GPIO_NUM 21
|
||||
#define HREF_GPIO_NUM 38
|
||||
#define PCLK_GPIO_NUM 11
|
||||
|
||||
#elif defined(CAMERA_MODEL_ESP32S2_CAM_BOARD)
|
||||
// The 18 pin header on the board has Y5 and Y3 swapped
|
||||
#define USE_BOARD_HEADER 0
|
||||
#define PWDN_GPIO_NUM 1
|
||||
#define RESET_GPIO_NUM 2
|
||||
#define XCLK_GPIO_NUM 42
|
||||
#define SIOD_GPIO_NUM 41
|
||||
#define SIOC_GPIO_NUM 18
|
||||
|
||||
#define Y9_GPIO_NUM 16
|
||||
#define Y8_GPIO_NUM 39
|
||||
#define Y7_GPIO_NUM 40
|
||||
#define Y6_GPIO_NUM 15
|
||||
#if USE_BOARD_HEADER
|
||||
#define Y5_GPIO_NUM 12
|
||||
#else
|
||||
#define Y5_GPIO_NUM 13
|
||||
#endif
|
||||
#define Y4_GPIO_NUM 5
|
||||
#if USE_BOARD_HEADER
|
||||
#define Y3_GPIO_NUM 13
|
||||
#else
|
||||
#define Y3_GPIO_NUM 12
|
||||
#endif
|
||||
#define Y2_GPIO_NUM 14
|
||||
#define VSYNC_GPIO_NUM 38
|
||||
#define HREF_GPIO_NUM 4
|
||||
#define PCLK_GPIO_NUM 3
|
||||
|
||||
#elif defined(CAMERA_MODEL_ESP32S3_EYE)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 15
|
||||
#define SIOD_GPIO_NUM 4
|
||||
#define SIOC_GPIO_NUM 5
|
||||
|
||||
#define Y2_GPIO_NUM 11
|
||||
#define Y3_GPIO_NUM 9
|
||||
#define Y4_GPIO_NUM 8
|
||||
#define Y5_GPIO_NUM 10
|
||||
#define Y6_GPIO_NUM 12
|
||||
#define Y7_GPIO_NUM 18
|
||||
#define Y8_GPIO_NUM 17
|
||||
#define Y9_GPIO_NUM 16
|
||||
|
||||
#define VSYNC_GPIO_NUM 6
|
||||
#define HREF_GPIO_NUM 7
|
||||
#define PCLK_GPIO_NUM 13
|
||||
|
||||
#else
|
||||
#error "Camera model not selected"
|
||||
#endif
|
|
@ -0,0 +1,327 @@
|
|||
#define CAMERA_MODEL_XIAO_ESP32S3
|
||||
#include <I2S.h>
|
||||
// #include "FS.h"
|
||||
// #include "SD.h"
|
||||
#include <BLE2902.h>
|
||||
#include <BLEDevice.h>
|
||||
#include <BLEUtils.h>
|
||||
#include <BLEScan.h>
|
||||
#include <BLEAdvertisedDevice.h>
|
||||
#include "esp_camera.h"
|
||||
#include "camera_pins.h"
|
||||
#include "mulaw.h"
|
||||
|
||||
//
|
||||
// BLE
|
||||
//
|
||||
|
||||
static BLEUUID serviceUUID("19B10000-E8F2-537E-4F6C-D104768A1214");
|
||||
static BLEUUID audioCharUUID("19B10001-E8F2-537E-4F6C-D104768A1214");
|
||||
static BLEUUID audioCodecUUID("19B10002-E8F2-537E-4F6C-D104768A1214");
|
||||
static BLEUUID photoCharUUID("19B10005-E8F2-537E-4F6C-D104768A1214");
|
||||
|
||||
BLECharacteristic *audio;
|
||||
BLECharacteristic *photo;
|
||||
bool connected = false;
|
||||
|
||||
class ServerHandler: public BLEServerCallbacks
|
||||
{
|
||||
void onConnect(BLEServer *server)
|
||||
{
|
||||
connected = true;
|
||||
Serial.println("Connected");
|
||||
}
|
||||
|
||||
void onDisconnect(BLEServer *server)
|
||||
{
|
||||
connected = false;
|
||||
Serial.println("Disconnected");
|
||||
BLEDevice::startAdvertising();
|
||||
}
|
||||
};
|
||||
|
||||
class MessageHandler: public BLECharacteristicCallbacks
|
||||
{
|
||||
void onWrite(BLECharacteristic* pCharacteristic, esp_ble_gatts_cb_param_t* param)
|
||||
{
|
||||
// Currently unused
|
||||
}
|
||||
};
|
||||
|
||||
void configure_ble() {
|
||||
BLEDevice::init("Bubble ESP");
|
||||
BLEServer *server = BLEDevice::createServer();
|
||||
BLEService *service = server->createService(serviceUUID);
|
||||
|
||||
// Audio service
|
||||
audio = service->createCharacteristic(
|
||||
audioCharUUID,
|
||||
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
|
||||
);
|
||||
BLE2902 *ccc = new BLE2902();
|
||||
ccc->setNotifications(true);
|
||||
audio->addDescriptor(ccc);
|
||||
|
||||
// Photo service
|
||||
photo = service->createCharacteristic(
|
||||
photoCharUUID,
|
||||
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
|
||||
);
|
||||
ccc = new BLE2902();
|
||||
ccc->setNotifications(true);
|
||||
photo->addDescriptor(ccc);
|
||||
|
||||
// Codec service
|
||||
BLECharacteristic *codec = service->createCharacteristic(
|
||||
audioCodecUUID,
|
||||
BLECharacteristic::PROPERTY_READ
|
||||
);
|
||||
uint8_t codecId = 11; // MuLaw 8mhz
|
||||
codec->setValue(&codecId, 1);
|
||||
|
||||
// Service
|
||||
server->setCallbacks(new ServerHandler());
|
||||
service->start();
|
||||
|
||||
BLEAdvertising *advertising = BLEDevice::getAdvertising();
|
||||
advertising->addServiceUUID(service->getUUID());
|
||||
advertising->setScanResponse(true);
|
||||
advertising->setMinPreferred(0x0);
|
||||
advertising->setMinPreferred(0x1F);
|
||||
BLEDevice::startAdvertising();
|
||||
}
|
||||
|
||||
// Save pictures to SD card
|
||||
// void photo_share(const char * fileName) {
|
||||
// // Take a photo
|
||||
// camera_fb_t *fb = esp_camera_fb_get();
|
||||
// if (!fb) {
|
||||
// Serial.println("Failed to get camera frame buffer");
|
||||
// return;
|
||||
// }
|
||||
// // Save photo to file
|
||||
// writeFile(SD, fileName, fb->buf, fb->len);
|
||||
|
||||
// // Release image buffer
|
||||
// esp_camera_fb_return(fb);
|
||||
|
||||
// Serial.println("Photo saved to file");
|
||||
// }
|
||||
|
||||
camera_fb_t *fb;
|
||||
// int images_written = 0;
|
||||
|
||||
// void writeFile(fs::FS &fs, const char * path, uint8_t * data, size_t len){
|
||||
// Serial.printf("Writing file: %s\n", path);
|
||||
|
||||
// File file = fs.open(path, FILE_WRITE);
|
||||
// if(!file){
|
||||
// Serial.println("Failed to open file for writing");
|
||||
// return;
|
||||
// }
|
||||
// if(file.write(data, len) == len){
|
||||
// Serial.println("File written");
|
||||
// } else {
|
||||
// Serial.println("Write failed");
|
||||
// }
|
||||
// file.close();
|
||||
// }
|
||||
|
||||
bool take_photo() {
|
||||
|
||||
// Release buffer
|
||||
if (fb) {
|
||||
Serial.println("Release FB");
|
||||
esp_camera_fb_return(fb);
|
||||
}
|
||||
|
||||
// Take a photo
|
||||
Serial.println("Taking photo...");
|
||||
fb = esp_camera_fb_get();
|
||||
if (!fb) {
|
||||
Serial.println("Failed to get camera frame buffer");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Write to SD
|
||||
// char filename[32];
|
||||
// sprintf(filename, "/image_%d.jpg", images_written);
|
||||
// writeFile(SD, filename, fb->buf, fb->len);
|
||||
// images_written++;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
// Microphone
|
||||
//
|
||||
|
||||
#define VOLUME_GAIN 2
|
||||
|
||||
static size_t recording_buffer_size = 400;
|
||||
static size_t compressed_buffer_size = 400 + 3; /* header */
|
||||
static uint8_t *s_recording_buffer = nullptr;
|
||||
static uint8_t *s_compressed_frame = nullptr;
|
||||
static uint8_t *s_compressed_frame_2 = nullptr;
|
||||
|
||||
void configure_microphone() {
|
||||
|
||||
// start I2S at 16 kHz with 16-bits per sample
|
||||
I2S.setAllPins(-1, 42, 41, -1, -1);
|
||||
if (!I2S.begin(PDM_MONO_MODE, 8000, 16)) {
|
||||
Serial.println("Failed to initialize I2S!");
|
||||
while (1); // do nothing
|
||||
}
|
||||
|
||||
// Allocate buffers
|
||||
s_recording_buffer = (uint8_t *) ps_calloc(recording_buffer_size, sizeof(uint8_t));
|
||||
s_compressed_frame = (uint8_t *) ps_calloc(compressed_buffer_size, sizeof(uint8_t));
|
||||
s_compressed_frame_2 = (uint8_t *) ps_calloc(compressed_buffer_size, sizeof(uint8_t));
|
||||
}
|
||||
|
||||
size_t read_microphone() {
|
||||
size_t bytes_recorded = 0;
|
||||
esp_i2s::i2s_read(esp_i2s::I2S_NUM_0, s_recording_buffer, recording_buffer_size, &bytes_recorded, portMAX_DELAY);
|
||||
return bytes_recorded;
|
||||
}
|
||||
|
||||
//
|
||||
// Camera
|
||||
//
|
||||
|
||||
void configure_camera() {
|
||||
camera_config_t config;
|
||||
config.ledc_channel = LEDC_CHANNEL_0;
|
||||
config.ledc_timer = LEDC_TIMER_0;
|
||||
config.pin_d0 = Y2_GPIO_NUM;
|
||||
config.pin_d1 = Y3_GPIO_NUM;
|
||||
config.pin_d2 = Y4_GPIO_NUM;
|
||||
config.pin_d3 = Y5_GPIO_NUM;
|
||||
config.pin_d4 = Y6_GPIO_NUM;
|
||||
config.pin_d5 = Y7_GPIO_NUM;
|
||||
config.pin_d6 = Y8_GPIO_NUM;
|
||||
config.pin_d7 = Y9_GPIO_NUM;
|
||||
config.pin_xclk = XCLK_GPIO_NUM;
|
||||
config.pin_pclk = PCLK_GPIO_NUM;
|
||||
config.pin_vsync = VSYNC_GPIO_NUM;
|
||||
config.pin_href = HREF_GPIO_NUM;
|
||||
config.pin_sscb_sda = SIOD_GPIO_NUM;
|
||||
config.pin_sscb_scl = SIOC_GPIO_NUM;
|
||||
config.pin_pwdn = PWDN_GPIO_NUM;
|
||||
config.pin_reset = RESET_GPIO_NUM;
|
||||
config.xclk_freq_hz = 20000000;
|
||||
config.frame_size = FRAMESIZE_UXGA;
|
||||
config.pixel_format = PIXFORMAT_JPEG; // for streaming
|
||||
config.fb_count = 1;
|
||||
|
||||
// High quality (psram)
|
||||
// config.jpeg_quality = 10;
|
||||
// config.fb_count = 2;
|
||||
// config.grab_mode = CAMERA_GRAB_LATEST;
|
||||
|
||||
// Low quality (and in local ram)
|
||||
config.jpeg_quality = 10;
|
||||
config.frame_size = FRAMESIZE_SVGA;
|
||||
config.grab_mode = CAMERA_GRAB_LATEST;
|
||||
config.fb_location = CAMERA_FB_IN_PSRAM;
|
||||
// config.fb_location = CAMERA_FB_IN_DRAM;
|
||||
|
||||
// camera init
|
||||
esp_err_t err = esp_camera_init(&config);
|
||||
if (err != ESP_OK) {
|
||||
Serial.printf("Camera init failed with error 0x%x", err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Main
|
||||
//
|
||||
|
||||
// static uint8_t *s_compressed_frame_2 = nullptr;
|
||||
// static size_t compressed_buffer_size = 400 + 3;
|
||||
void setup() {
|
||||
Serial.begin(921600);
|
||||
// SD.begin(21);
|
||||
Serial.println("Setup");
|
||||
Serial.println("Starting BLE...");
|
||||
configure_ble();
|
||||
// s_compressed_frame_2 = (uint8_t *) ps_calloc(compressed_buffer_size, sizeof(uint8_t));
|
||||
Serial.println("Starting Microphone...");
|
||||
configure_microphone();
|
||||
Serial.println("Starting Camera...");
|
||||
configure_camera();
|
||||
Serial.println("OK");
|
||||
}
|
||||
|
||||
uint16_t frame_count = 0;
|
||||
unsigned long lastCaptureTime = 0;
|
||||
size_t sent_photo_bytes = 0;
|
||||
size_t sent_photo_frames = 0;
|
||||
bool need_send_photo = false;
|
||||
|
||||
void loop() {
|
||||
|
||||
// Read from mic
|
||||
size_t bytes_recorded = read_microphone();
|
||||
|
||||
// Push to BLE
|
||||
if (bytes_recorded > 0 && connected) {
|
||||
size_t out_buffer_size = bytes_recorded / 2 + 3;
|
||||
for (size_t i = 0; i < bytes_recorded; i += 2) {
|
||||
int16_t sample = ((s_recording_buffer[i + 1] << 8) | s_recording_buffer[i]) << VOLUME_GAIN;
|
||||
s_compressed_frame[i / 2 + 3] = linear2ulaw(sample);
|
||||
}
|
||||
s_compressed_frame[0] = frame_count & 0xFF;
|
||||
s_compressed_frame[1] = (frame_count >> 8) & 0xFF;
|
||||
s_compressed_frame[2] = 0;
|
||||
audio->setValue(s_compressed_frame, out_buffer_size);
|
||||
audio->notify();
|
||||
frame_count++;
|
||||
}
|
||||
|
||||
// Take a photo
|
||||
unsigned long now = millis();
|
||||
if ((now - lastCaptureTime) >= 5000 && !need_send_photo && connected) {
|
||||
if (take_photo()) {
|
||||
need_send_photo = true;
|
||||
sent_photo_bytes = 0;
|
||||
sent_photo_frames = 0;
|
||||
lastCaptureTime = now;
|
||||
}
|
||||
}
|
||||
|
||||
// Push to BLE
|
||||
if (need_send_photo) {
|
||||
size_t remaining = fb->len - sent_photo_bytes;
|
||||
if (remaining > 0) {
|
||||
// Populate buffer
|
||||
s_compressed_frame_2[0] = sent_photo_frames & 0xFF;
|
||||
s_compressed_frame_2[1] = (sent_photo_frames >> 8) & 0xFF;
|
||||
size_t bytes_to_copy = remaining;
|
||||
if (bytes_to_copy > 200) {
|
||||
bytes_to_copy = 200;
|
||||
}
|
||||
memcpy(&s_compressed_frame_2[2], &fb->buf[sent_photo_bytes], bytes_to_copy);
|
||||
|
||||
// Push to BLE
|
||||
photo->setValue(s_compressed_frame_2, bytes_to_copy + 2);
|
||||
photo->notify();
|
||||
sent_photo_bytes += bytes_to_copy;
|
||||
sent_photo_frames++;
|
||||
} else {
|
||||
|
||||
// End flag
|
||||
s_compressed_frame_2[0] = 0xFF;
|
||||
s_compressed_frame_2[1] = 0xFF;
|
||||
photo->setValue(s_compressed_frame_2, 2);
|
||||
photo->notify();
|
||||
|
||||
Serial.println("Photo sent");
|
||||
need_send_photo = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Delay
|
||||
delay(4);
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
#define BIAS (0x84) /* Bias for linear code. */
|
||||
|
||||
static int search(int val, short* table, int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
if (val <= *table++)
|
||||
return (i);
|
||||
}
|
||||
return (size);
|
||||
}
|
||||
|
||||
static short seg_end[8] = { 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF };
|
||||
|
||||
unsigned char linear2ulaw(int pcm_val) /* 2's complement (16-bit range) */
|
||||
{
|
||||
int mask;
|
||||
int seg;
|
||||
unsigned char uval;
|
||||
|
||||
/* Get the sign and the magnitude of the value. */
|
||||
if (pcm_val < 0) {
|
||||
pcm_val = BIAS - pcm_val;
|
||||
mask = 0x7F;
|
||||
} else {
|
||||
pcm_val += BIAS;
|
||||
mask = 0xFF;
|
||||
}
|
||||
|
||||
/* Convert the scaled magnitude to segment number. */
|
||||
seg = search(pcm_val, seg_end, 8);
|
||||
|
||||
/*
|
||||
* Combine the sign, segment, quantization bits;
|
||||
* and complement the code word.
|
||||
*/
|
||||
if (seg >= 8) /* out of range, return maximum value. */
|
||||
return (0x7F ^ mask);
|
||||
else {
|
||||
uval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0xF);
|
||||
return (uval ^ mask);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue