2023-06-28 16:41:54 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* Camera Remote Menu
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Camera Settings
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*
|
|
|
|
**/
|
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
#include <SoftwareSerial.h>
|
2023-06-28 16:41:54 +00:00
|
|
|
#include "McopySerial.h"
|
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
#define SHUTTTER_BTN 5
|
|
|
|
#define RED_LED 6
|
|
|
|
#define GREEN_LED 7
|
|
|
|
#define SOFTWARE_RX 10
|
|
|
|
#define SOFTWARE_TX 11
|
2023-06-28 16:41:54 +00:00
|
|
|
|
|
|
|
McopySerial mc;
|
2023-07-05 02:46:37 +00:00
|
|
|
SoftwareSerial SoftSerial(SOFTWARE_RX, SOFTWARE_TX);
|
2023-06-28 16:41:54 +00:00
|
|
|
|
|
|
|
volatile boolean connected = false;
|
|
|
|
volatile boolean bleInit = false;
|
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
volatile boolean blinkState = false;
|
|
|
|
volatile long blinkLast = 0;
|
|
|
|
|
2023-06-28 16:41:54 +00:00
|
|
|
volatile long now;
|
|
|
|
volatile long last = -1;
|
2023-07-05 18:46:43 +00:00
|
|
|
volatile long cameraFrame = 3000;
|
2023-06-28 16:41:54 +00:00
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
volatile long start;
|
|
|
|
volatile long end;
|
|
|
|
|
2023-06-28 16:41:54 +00:00
|
|
|
volatile char cmdChar = 'z';
|
2023-06-28 19:06:11 +00:00
|
|
|
volatile char sChar = 'z';
|
2023-06-28 16:41:54 +00:00
|
|
|
|
2023-07-05 02:46:37 +00:00
|
|
|
volatile bool connectedOnce = false;
|
2023-07-05 18:46:43 +00:00
|
|
|
volatile String exposureString;
|
|
|
|
volatile long exposureTarget = 3000;
|
2023-07-05 02:46:37 +00:00
|
|
|
|
2023-06-28 16:41:54 +00:00
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
void setup () {
|
2023-06-28 16:41:54 +00:00
|
|
|
pins();
|
|
|
|
mc.begin(mc.CAMERA_IDENTIFIER);
|
2023-07-05 02:46:37 +00:00
|
|
|
SoftSerial.begin(9600);
|
2023-06-28 16:41:54 +00:00
|
|
|
|
|
|
|
digitalWrite(RED_LED, HIGH);
|
|
|
|
digitalWrite(GREEN_LED, HIGH);
|
|
|
|
|
|
|
|
delay(42);
|
|
|
|
|
|
|
|
digitalWrite(RED_LED, LOW);
|
|
|
|
digitalWrite(GREEN_LED, LOW);
|
2023-06-28 19:06:11 +00:00
|
|
|
blinkLast = millis();
|
2023-06-28 16:41:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void pins () {
|
|
|
|
pinMode(SHUTTTER_BTN, INPUT_PULLUP);
|
|
|
|
pinMode(RED_LED, OUTPUT);
|
|
|
|
pinMode(GREEN_LED, OUTPUT);
|
|
|
|
|
|
|
|
digitalWrite(RED_LED, LOW);
|
|
|
|
digitalWrite(GREEN_LED, LOW);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
void loop () {
|
2023-06-28 16:41:54 +00:00
|
|
|
now = millis();
|
|
|
|
cmdChar = mc.loop();
|
|
|
|
|
2023-07-05 02:46:37 +00:00
|
|
|
if (SoftSerial.available() > 0) {
|
|
|
|
sChar = SoftSerial.read();
|
2023-06-28 19:06:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
s_cmd(sChar);
|
2023-06-28 16:41:54 +00:00
|
|
|
cmd(cmdChar);
|
|
|
|
|
|
|
|
// Shutter
|
|
|
|
if (digitalRead(SHUTTTER_BTN) == LOW && connected){
|
|
|
|
camera();
|
|
|
|
}
|
|
|
|
|
2023-07-05 02:46:37 +00:00
|
|
|
if (!connected && mc.connected && mc.identified && !connectedOnce) {
|
2023-06-28 16:41:54 +00:00
|
|
|
mc.log("Connecting BLE...");
|
2023-07-05 02:46:37 +00:00
|
|
|
SoftSerial.print('C');
|
|
|
|
connectedOnce = true;
|
2023-06-28 16:41:54 +00:00
|
|
|
}
|
2023-06-28 19:06:11 +00:00
|
|
|
|
|
|
|
blink();
|
2023-06-28 16:41:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void cmd (char val) {
|
|
|
|
if (val == mc.CAMERA && connected) {
|
|
|
|
camera();
|
|
|
|
} else if (val == mc.CAMERA_FORWARD) {
|
|
|
|
camera_direction(true);
|
|
|
|
} else if (val == mc.CAMERA_BACKWARD) {
|
|
|
|
camera_direction(false);
|
2023-07-05 18:46:43 +00:00
|
|
|
} else if (val == mc.CAMERA_EXPOSURE) {
|
|
|
|
exposure();
|
2023-06-28 16:41:54 +00:00
|
|
|
} else if (val == mc.STATE) {
|
|
|
|
state();
|
|
|
|
}
|
2023-07-05 02:46:37 +00:00
|
|
|
cmdChar = 'z';
|
2023-06-28 16:41:54 +00:00
|
|
|
}
|
|
|
|
|
2023-07-05 18:46:43 +00:00
|
|
|
void exposure () {
|
|
|
|
exposureString = mc.getString();
|
|
|
|
parseExposureString();
|
|
|
|
cameraFrame = exposureTarget;
|
|
|
|
mc.confirm(mc.CAMERA_EXPOSURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void parseExposureString () {
|
|
|
|
exposureTarget = exposureString.toInt();
|
|
|
|
}
|
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
void s_cmd (char val) {
|
2023-07-05 02:46:37 +00:00
|
|
|
if (val == 'C') {
|
2023-06-28 19:06:11 +00:00
|
|
|
connected = true;
|
2023-07-05 02:46:37 +00:00
|
|
|
digitalWrite(RED_LED, HIGH);
|
|
|
|
digitalWrite(GREEN_LED, LOW);
|
2023-06-28 19:06:11 +00:00
|
|
|
} else if (val == 'd') {
|
|
|
|
connected = false;
|
2023-07-05 02:46:37 +00:00
|
|
|
digitalWrite(RED_LED, LOW);
|
|
|
|
digitalWrite(GREEN_LED, LOW);
|
2023-06-28 19:06:11 +00:00
|
|
|
} else if (val == 'c') {
|
|
|
|
camera_end();
|
|
|
|
}
|
|
|
|
sChar = 'z';
|
|
|
|
}
|
2023-06-28 16:41:54 +00:00
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
void camera () {
|
|
|
|
start = now;
|
2023-06-28 16:41:54 +00:00
|
|
|
digitalWrite(GREEN_LED, HIGH);
|
2023-07-05 02:46:37 +00:00
|
|
|
digitalWrite(RED_LED, LOW);
|
2023-06-28 16:41:54 +00:00
|
|
|
mc.log("Shutter pressed");
|
2023-07-05 02:46:37 +00:00
|
|
|
SoftSerial.print('c');
|
2023-06-28 19:06:11 +00:00
|
|
|
}
|
2023-06-28 16:41:54 +00:00
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
void camera_end () {
|
2023-06-28 16:41:54 +00:00
|
|
|
end = millis();
|
|
|
|
delay(cameraFrame - (end - start));
|
2023-07-05 02:46:37 +00:00
|
|
|
digitalWrite(GREEN_LED, LOW);
|
|
|
|
digitalWrite(RED_LED, HIGH);
|
2023-06-28 16:41:54 +00:00
|
|
|
last = millis();
|
|
|
|
mc.confirm(mc.CAMERA);
|
2023-06-28 19:06:11 +00:00
|
|
|
mc.log("camera()");
|
2023-06-28 16:41:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//null route direction
|
|
|
|
void camera_direction (boolean state) {
|
|
|
|
if (state) {
|
|
|
|
mc.confirm(mc.CAMERA_FORWARD);
|
|
|
|
mc.log("camera_direction(true)");
|
|
|
|
} else {
|
|
|
|
mc.confirm(mc.CAMERA_BACKWARD);
|
|
|
|
mc.log("camera_direction(false)");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-28 19:06:11 +00:00
|
|
|
void blink () {
|
|
|
|
if (!connected) {
|
|
|
|
if (now >= blinkLast + 200) {
|
|
|
|
if (blinkState) {
|
|
|
|
digitalWrite(RED_LED, HIGH);
|
|
|
|
} else {
|
|
|
|
digitalWrite(RED_LED, LOW);
|
|
|
|
}
|
|
|
|
blinkState = !blinkState;
|
|
|
|
blinkLast = now;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-28 16:41:54 +00:00
|
|
|
void state () {
|
|
|
|
String stateString = String(mc.STATE);
|
|
|
|
stateString += String(mc.CAMERA_EXPOSURE);
|
|
|
|
stateString += String(cameraFrame);
|
|
|
|
stateString += String(mc.STATE);
|
|
|
|
mc.print(stateString);
|
|
|
|
}
|