Blame | Last modification | View Log | RSS feed
/* Canon Powershot control terminal */
#include <SPI.h>
#include <Max3421e.h>
#include <Usb.h>
#include <simpletimer.h>
#include <ptp.h>
#include <canonps.h>
#include <qep_port.h>
#include <valuelist.h>
#include <psvaluetitles.h>
#include "ptpdpparser.h"
#include "ptpobjinfoparser.h"
#include "pseventparser.h"
#include "psconsole.h"
#define DEV_ADDR 1
// Canon PowerShot S3 IS
#define DATA_IN_EP 1
#define DATA_OUT_EP 2
#define INTERRUPT_EP 3
#define CONFIG_NUM 1
class CamStateHandlers : public PSStateHandlers
{
enum CamStates { stInitial, stDisconnected, stConnected };
CamStates stateConnected;
public:
CamStateHandlers() : stateConnected(stInitial)
{
};
virtual void OnDeviceDisconnectedState(PTP *ptp);
virtual void OnDeviceInitializedState(PTP *ptp);
};
CamStateHandlers CamStates;
SimpleTimer ControlTimer, PTPPollTimer;
CanonPS Ps(DEV_ADDR, DATA_IN_EP, DATA_OUT_EP, INTERRUPT_EP, CONFIG_NUM, &CamStates);
QEvent evtTick, evtAbort;
PSConsole psConsole;
void CamStateHandlers::OnDeviceDisconnectedState(PTP *ptp)
{
if (stateConnected == stConnected || stateConnected == stInitial)
{
stateConnected = stDisconnected;
PTPPollTimer.Disable();
Notify(PSTR("Camera disconnected.\r\n"));
if (stateConnected == stConnected)
psConsole.dispatch(&evtTick);
}
}
void CamStateHandlers::OnDeviceInitializedState(PTP *ptp)
{
if (stateConnected == stDisconnected || stateConnected == stInitial)
{
stateConnected = stConnected;
PTPPollTimer.Enable();
psConsole.dispatch(&evtTick);
}
int8_t index = psConsole.MenuSelect();
if (index >= 0)
{
MenuSelectEvt menu_sel_evt;
menu_sel_evt.sig = MENU_SELECT_SIG;
menu_sel_evt.item_index = index;
psConsole.dispatch(&menu_sel_evt); // dispatch the event
}
}
void OnPTPPollTimer()
{
PSEventParser prs;
Ps.EventCheck(&prs);
if (uint32_t handle = prs.GetObjHandle())
{
PTPObjInfoParser inf;
Ps.GetObjectInfo(handle, &inf);
}
}
void setup()
{
pinMode(6, OUTPUT); //OSD CS
digitalWrite(6, HIGH); //Disablibg OSD CS
Serial.begin(115200);
Ps.Setup();
delay( 200 );
PTPPollTimer.Set(OnPTPPollTimer, 300);
evtTick.sig = TICK_SIG;
// evtAbort.sig = ABORT_SIG;
psConsole.init();
Serial.println("Start");
}
void loop()
{
Ps.Task();
PTPPollTimer.Run();
}