Blame |
Last modification |
View Log
| RSS feed
#ifndef __DEVPROPPARSER_H__
#define __DEVPROPPARSER_H__
#include <inttypes.h>
#include <avr/pgmspace.h>
#include <../ptp/ptpconst.h>
#include <../ptp/ptp.h>
// Device properties
const char msgUndefined [] PROGMEM = "Undefined";
const char msgBatteryLevel [] PROGMEM = "BatteryLevel";
const char msgFunctionalMode [] PROGMEM = "FunctionalMode";
const char msgImageSize [] PROGMEM = "ImageSize";
const char msgCompressionSetting [] PROGMEM = "CompressionSetting";
const char msgWhiteBalance [] PROGMEM = "WhiteBalance";
const char msgRGBGain [] PROGMEM = "RGBGain";
const char msgFNumber [] PROGMEM = "FNumber";
const char msgFocalLength [] PROGMEM = "FocalLength";
const char msgFocusDistance [] PROGMEM = "FocusDistance";
const char msgFocusMode [] PROGMEM = "FocusMode";
const char msgExposureMeteringMode [] PROGMEM = "ExposureMeteringMode";
const char msgFlashMode [] PROGMEM = "FlashMode";
const char msgExposureTime [] PROGMEM = "ExposureTime";
const char msgExposureProgramMode [] PROGMEM = "ExposureProgramMode";
const char msgExposureIndex [] PROGMEM = "ExposureIndex";
const char msgExposureBiasCompensation [] PROGMEM = "ExposureBiasCompensation";
const char msgDateTime [] PROGMEM = "DateTime";
const char msgCaptureDelay [] PROGMEM = "CaptureDelay";
const char msgStillCaptureMode [] PROGMEM = "StillCaptureMode";
const char msgContrast [] PROGMEM = "Contrast";
const char msgSharpness [] PROGMEM = "Sharpness";
const char msgDigitalZoom [] PROGMEM = "DigitalZoom";
const char msgEffectMode [] PROGMEM = "EffectMode";
const char msgBurstNumber [] PROGMEM = "BurstNumber";
const char msgBurstInterval [] PROGMEM = "BurstInterval";
const char msgTimelapseNumber [] PROGMEM = "TimelapseNumber";
const char msgTimelapseInterval [] PROGMEM = "TimelapseInterval";
const char msgFocusMeteringMode [] PROGMEM = "FocusMeteringMode";
const char msgUploadURL [] PROGMEM = "UploadURL";
const char msgArtist [] PROGMEM = "Artist";
const char msgCopyrightInfo [] PROGMEM = "CopyrightInfo";
// Data Types
const char msgUNDEF [] PROGMEM = "UNDEF";
const char msgINT8 [] PROGMEM = "INT8";
const char msgUINT8 [] PROGMEM = "UINT8";
const char msgINT16 [] PROGMEM = "INT16";
const char msgUINT16 [] PROGMEM = "UINT16";
const char msgINT32 [] PROGMEM = "INT32";
const char msgUINT32 [] PROGMEM = "UINT32";
const char msgINT64 [] PROGMEM = "INT64";
const char msgUINT64 [] PROGMEM = "UINT64";
const char msgINT128 [] PROGMEM = "INT128";
const char msgUINT128 [] PROGMEM = "UINT128";
const char msgAINT8 [] PROGMEM = "AINT8";
const char msgAUINT8 [] PROGMEM = "AUINT8";
const char msgAINT16 [] PROGMEM = "AINT16";
const char msgAUINT16 [] PROGMEM = "AUINT16";
const char msgAINT32 [] PROGMEM = "AINT32";
const char msgAUINT32 [] PROGMEM = "AUINT32";
const char msgAINT64 [] PROGMEM = "AINT64";
const char msgAUINT64 [] PROGMEM = "AUINT64";
const char msgAINT128 [] PROGMEM = "AINT128";
const char msgAUINT128 [] PROGMEM = "AUINT128";
const char msgSTR [] PROGMEM = "STR";
class DevPropParser : public PTPReadParser
{
static const char* dtNames1[];
static const char* dtNames2[];
static const char* prNames[];
uint8_t nStage;
uint8_t enStage;
uint16_t dataType;
uint8_t formFlag;
uint8_t bytesSize;
MultiValueBuffer theBuffer;
uint8_t varBuffer[16];
uint16_t enLen;
uint16_t enLenCntdn;
MultiByteValueParser valParser;
void PrintDevProp (uint8_t **pp, uint16_t *pcntdn);
void PrintDataType (uint8_t **pp, uint16_t *pcntdn);
void PrintGetSet (uint8_t **pp, uint16_t *pcntdn);
bool PrintValue (uint8_t **pp, uint16_t *pcntdn);
bool PrintEnum (uint8_t **pp, uint16_t *pcntdn);
bool ParseEnum (uint8_t **pp, uint16_t *pcntdn);
bool ParseEnumSingle (uint8_t **pp, uint16_t *pcntdn);
bool ParseEnumArray (uint8_t **pp, uint16_t *pcntdn);
static void PrintChar(const MultiValueBuffer * const p, uint32_t count, const void *me)
{
if (((unsigned char*)p->pValue)[0])
Serial.print(((unsigned char*)p->pValue)[0]);
};
static void PrintByte(const MultiValueBuffer * const p, uint32_t count, const void *me)
{
if (count)
Notify(PSTR(","));
PrintHex<uint8_t>(((uint8_t*)p->pValue)[0]);
};
static void PrintTwoBytes(const MultiValueBuffer * const p, uint32_t count, const void *me)
{
if (count)
Notify(PSTR(","));
PrintHex<uint16_t>(((uint16_t*)p->pValue)[0]);
};
static void PrintFourBytes(const MultiValueBuffer * const p, uint32_t count, const void *me)
{
if (count)
Notify(PSTR(","));
PrintHex<uint32_t>(((uint32_t*)p->pValue)[0]);
};
static void PrintEightBytes(const MultiValueBuffer * const p, uint32_t count, const void *me)
{
if (count)
Notify(PSTR(","));
for (uint8_t i=p->valueSize; i; i--)
PrintHex<uint8_t>(((uint8_t*)p->pValue)[i-1]);
};
static void PrintEnumValue(const MultiValueBuffer * const p, uint32_t count, const void *me)
{
if (count)
Serial.print(", ");
switch (((MultiValueBuffer*)p)->valueSize)
{
case 1:
PrintHex<uint8_t>(*((uint8_t*)p->pValue));
break;
case 2:
PrintHex<uint16_t>(*((uint16_t*)p->pValue));
break;
case 4:
PrintHex<uint32_t>(*((uint32_t*)p->pValue));
break;
default:
for (uint8_t i=p->valueSize; i; i--)
PrintHex<uint8_t>(((uint8_t*)p->pValue)[i-1]);
}
count++;
};
PTPListParser enumParser;
uint8_t GetDataSize();
public:
DevPropParser() :
nStage(0),
enStage(0),
dataType(0),
formFlag(0),
bytesSize(0),
enLen(0),
enLenCntdn(0)
{
theBuffer.pValue = varBuffer;
}
virtual void Parse(const uint16_t len, const uint8_t * const pbuf, const uint32_t &offset);
};
#endif // __DEVPROPPARSER_H__