#include <inttypes.h>
#include <avr/pgmspace.h>
#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <address.h>
#include <message.h>
#include <ptp.h>
#include <canoneos.h>
#define encoder0PinA 2
#define encoder0PinB 3
#define encoder1PinA 4
#define encoder1PinB 5
#define encoder2PinA A0
#define encoder2PinB A1
#define encoder3PinA A2
#define encoder3PinB A3
#define sw0Pin 6
volatile int encoder0Pos = 0;
volatile int encoder1Pos = 0;
volatile int encoder2Pos = 0;
volatile int encoder3Pos = 0;
volatile int sw0Pos = 0;
#ifndef EOS_DPC_EVFRecordStatus
#define EOS_DPC_EVFRecordStatus 0xD1B8
#endif
int encoder0PinALast = LOW;
int encoder1PinALast = LOW;
int encoder2PinALast = LOW;
int encoder3PinALast = LOW;
int n = LOW;
volatile int iso_mode = 0;
volatile int aperture_mode = 0;
volatile int shutter_mode = 0;
volatile char recording_mode = 0;
void doEncoder() {
if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
encoder0Pos++;
} else {
encoder0Pos--;
}
// Serial.println (encoder0Pos, DEC);
}
void initEncoder() {
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor
pinMode(encoder1PinA, INPUT);
digitalWrite(encoder1PinA, HIGH); // turn on pullup resistor
pinMode(encoder1PinB, INPUT);
digitalWrite(encoder1PinB, HIGH); // turn on pullup resistor
pinMode(encoder2PinA, INPUT);
digitalWrite(encoder2PinA, HIGH); // turn on pullup resistor
pinMode(encoder2PinB, INPUT);
digitalWrite(encoder2PinB, HIGH); // turn on pullup resistor
pinMode(encoder3PinA, INPUT);
digitalWrite(encoder3PinA, HIGH); // turn on pullup resistor
pinMode(encoder3PinB, INPUT);
digitalWrite(encoder3PinB, HIGH); // turn on pullup resistor
pinMode(sw0Pin, INPUT);
digitalWrite(sw0Pin, HIGH); // turn on pullup resistor
encoder0PinALast = digitalRead(encoder0PinA);
encoder1PinALast = digitalRead(encoder1PinA);
encoder2PinALast = digitalRead(encoder2PinA);
encoder3PinALast = digitalRead(encoder3PinA);
}
void readEncoder() {
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;
} else {
encoder0Pos++;
}
// Serial.print (encoder0Pos);
// Serial.println ("/0 ");
}
encoder0PinALast = n;
n = digitalRead(encoder1PinA);
if ((encoder1PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder1PinB) == LOW) {
encoder1Pos--;
} else {
encoder1Pos++;
}
Serial.print (encoder1Pos);
Serial.println ("/1 ");
}
encoder1PinALast = n;
n = digitalRead(encoder2PinA);
if ((encoder2PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder2PinB) == LOW) {
encoder2Pos--;
} else {
encoder2Pos++;
}
Serial.print (encoder2Pos);
Serial.println ("/2 ");
}
encoder2PinALast = n;
n = digitalRead(encoder3PinA);
if ((encoder3PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder3PinB) == LOW) {
encoder3Pos--;
} else {
encoder3Pos++;
}
Serial.print (encoder3Pos);
Serial.println ("/3 ");
}
encoder3PinALast = n;
if (digitalRead(sw0Pin) == LOW) {
Serial.println ("SW");
sw0Pos = 1;
}
}
class CamStateHandlers : public EOSStateHandlers
{
enum CamStates { stInitial, stDisconnected, stConnected };
CamStates stateConnected;
public:
CamStateHandlers() : stateConnected(stInitial) {};
virtual void OnDeviceDisconnectedState(PTP *ptp);
virtual void OnDeviceInitializedState(PTP *ptp);
};
CamStateHandlers CamStates;
USB Usb;
USBHub Hub1(&Usb);
CanonEOS Eos(&Usb, &CamStates);
void setup() {
Serial.begin( 115200 );
Serial.println("Start");
initEncoder();
if (Usb.Init() == -1)
Serial.println("OSC did not start.");
delay(1000);
TCNT2 = 50;
TCCR2A = 0;
TCCR2B = (1<<CS22) | (1<<CS20);
TIMSK2 |= (1<<TOIE2);
sei();
}
ISR(TIMER2_OVF_vect) {
readEncoder();
}
void loop() {
Usb.Task();
}
void CamStateHandlers::OnDeviceDisconnectedState(PTP *ptp) {
if (stateConnected == stConnected || stateConnected == stInitial) {
stateConnected = stDisconnected;
Notify(PSTR("Camera disconnected.\r\n"));
}
}
void CamStateHandlers::OnDeviceInitializedState(PTP *ptp) {
if (stateConnected == stDisconnected || stateConnected == stInitial) {
stateConnected = stConnected;
encoder0Pos = 0;
encoder1Pos = 0;
encoder2Pos = 0;
encoder3Pos = 0;
}
if (stateConnected == stConnected) {
if (sw0Pos > 0) {
if (recording_mode == 0) {
Eos.SetProperty(EOS_DPC_EVFRecordStatus, 4);
delay(100);
sw0Pos = 0;
recording_mode = 1;
} else {
Eos.SetProperty(EOS_DPC_EVFRecordStatus, 0);
delay(100);
sw0Pos = 0;
recording_mode = 0;
}
}
if (encoder0Pos > 0) {
((CanonEOS*)ptp)->MoveFocus(3);
} else if (encoder0Pos < 0) {
((CanonEOS*)ptp)->MoveFocus(0x8003);
}
encoder0Pos = 0;
}
}