OLD | NEW |
(Empty) | |
| 1 #ifndef __CHDK_PTP_H |
| 2 #define __CHDK_PTP_H |
| 3 |
| 4 // CHDK PTP protocol interface (can also be used in client PTP programs) |
| 5 |
| 6 // Note: used in modules and platform independent code. |
| 7 // Do not add platform dependent stuff in here (#ifdef/#endif compile options or
camera dependent values) |
| 8 |
| 9 #define PTP_CHDK_VERSION_MAJOR 2 // increase only with backwards incompatible c
hanges (and reset minor) |
| 10 #define PTP_CHDK_VERSION_MINOR 6 // increase with extensions of functionality |
| 11 // minor > 1000 for development versions |
| 12 |
| 13 /* |
| 14 protocol version history |
| 15 0.1 - initial proposal from mweerden, + luar |
| 16 0.2 - Added ScriptStatus and ScriptSupport, based on work by ultimA |
| 17 1.0 - removed old script result code (luar), replace with message system |
| 18 2.0 - return PTP_CHDK_TYPE_TABLE for tables instead of TYPE_STRING, allow return
of empty strings |
| 19 2.1 - experimental live view, not formally released |
| 20 2.2 - live view (work in progress) |
| 21 2.3 - live view - released in 1.1 |
| 22 2.4 - live view protocol 2.1 |
| 23 2.5 - remote capture |
| 24 2.6 - script execution flags |
| 25 */ |
| 26 |
| 27 #define PTP_OC_CHDK 0x9999 |
| 28 |
| 29 // N.B.: unused parameters should be set to 0 |
| 30 //enum ptp_chdk_command { |
| 31 enum PTP_CHDK_Command { |
| 32 PTP_CHDK_Version = 0, // return param1 is major version number |
| 33 // return param2 is minor version number |
| 34 PTP_CHDK_GetMemory, // param2 is base address (not NULL; circumvent by t
aking 0xFFFFFFFF and size+1) |
| 35 // param3 is size (in bytes) |
| 36 // return data is memory block |
| 37 PTP_CHDK_SetMemory, // param2 is address |
| 38 // param3 is size (in bytes) |
| 39 // data is new memory block |
| 40 PTP_CHDK_CallFunction, // data is array of function pointer and 32 bit int
arguments (max: 10 args prior to protocol 2.5) |
| 41 // return param1 is return value |
| 42 PTP_CHDK_TempData, // data is data to be stored for later |
| 43 // param2 is for the TD flags below |
| 44 PTP_CHDK_UploadFile, // data is 4-byte length of filename, followed by fi
lename and contents |
| 45 PTP_CHDK_DownloadFile, // preceded by PTP_CHDK_TempData with filename |
| 46 // return data are file contents |
| 47 PTP_CHDK_ExecuteScript, // data is script to be executed |
| 48 // param2 is language of script |
| 49 // in proto 2.6 and later, language is the lower by
te, rest is used for PTP_CHDK_SCRIPT_FL* flags |
| 50 // return param1 is script id, like a process id |
| 51 // return param2 is status from ptp_chdk_script_erro
r_type |
| 52 PTP_CHDK_ScriptStatus, // Script execution status |
| 53 // return param1 bits |
| 54 // PTP_CHDK_SCRIPT_STATUS_RUN is set if a script run
ning, cleared if not |
| 55 // PTP_CHDK_SCRIPT_STATUS_MSG is set if script messa
ges from script waiting to be read |
| 56 // all other bits and params are reserved for future
use |
| 57 PTP_CHDK_ScriptSupport, // Which scripting interfaces are supported in this
build |
| 58 // param1 CHDK_PTP_SUPPORT_LUA is set if lua is supp
orted, cleared if not |
| 59 // all other bits and params are reserved for future
use |
| 60 PTP_CHDK_ReadScriptMsg, // read next message from camera script system |
| 61 // return param1 is chdk_ptp_s_msg_type |
| 62 // return param2 is message subtype: |
| 63 // for script return and users this is ptp_chdk_sc
ript_data_type |
| 64 // for error ptp_chdk_script_error_type |
| 65 // return param3 is script id of script that generat
ed the message |
| 66 // return param4 is length of the message data. |
| 67 // return data is message. |
| 68 // A minimum of 1 bytes of zeros is returned if the
message has no data (empty string or type NONE) |
| 69 PTP_CHDK_WriteScriptMsg, // write a message for scripts running on camera |
| 70 // input param2 is target script id, 0=don't care. M
essages for a non-running script will be discarded |
| 71 // data length is handled by ptp data phase |
| 72 // input messages do not have type or subtype, they
are always a string destined for the script (similar to USER/string) |
| 73 // output param1 is ptp_chdk_script_msg_status |
| 74 PTP_CHDK_GetDisplayData, // Return camera display data |
| 75 // This is defined as separate sub protocol in live_
view.h |
| 76 // Changes to the sub-protocol will always be consid
ered a minor change to the main protocol |
| 77 // param2 bitmask of data |
| 78 // output param1 = total size of data |
| 79 // return data is protocol information, frame buffe
r descriptions and selected display data |
| 80 // Currently a data phase is always returned. Futur
e versions may define other behavior |
| 81 // for values in currently unused parameters. |
| 82 // Direct image capture over USB. |
| 83 // Use lua get_usb_capture_support for available data types, lua init_usb_capt
ure for setup |
| 84 PTP_CHDK_RemoteCaptureIsReady, // Check if data is available |
| 85 // return param1 is status |
| 86 // 0 = not ready |
| 87 // 0x10000000 = remote capture not initialized |
| 88 // otherwise bitmask of PTP_CHDK_CAPTURE_* dat
atypes |
| 89 // return param2 is image number |
| 90 PTP_CHDK_RemoteCaptureGetData // retrieve data |
| 91 // param2 is bit indicating data type to get |
| 92 // return param1 is length |
| 93 // return param2 more chunks available? |
| 94 // 0 = no more chunks of selected format |
| 95 // return param3 seek required to pos (-1 = no
seek) |
| 96 }; |
| 97 |
| 98 // data types as used by ReadScriptMessage |
| 99 enum ptp_chdk_script_data_type { |
| 100 PTP_CHDK_TYPE_UNSUPPORTED = 0, // type name will be returned in data |
| 101 PTP_CHDK_TYPE_NIL, |
| 102 PTP_CHDK_TYPE_BOOLEAN, |
| 103 PTP_CHDK_TYPE_INTEGER, |
| 104 PTP_CHDK_TYPE_STRING, // Empty strings are returned with length=0 |
| 105 PTP_CHDK_TYPE_TABLE, // tables are converted to a string by usb_msg_table_to_
string, |
| 106 // this function can be overridden in lua to change the
format |
| 107 // the string may be empty for an empty table |
| 108 }; |
| 109 |
| 110 // TempData flags |
| 111 #define PTP_CHDK_TD_DOWNLOAD 0x1 // download data instead of upload |
| 112 #define PTP_CHDK_TD_CLEAR 0x2 // clear the stored data; with DOWNLOAD this |
| 113 // means first download, then clear and |
| 114 // without DOWNLOAD this means no uploading, |
| 115 // just clear |
| 116 |
| 117 // Script Languages - for execution only lua is supported for now |
| 118 #define PTP_CHDK_SL_LUA 0 |
| 119 #define PTP_CHDK_SL_UBASIC 1 |
| 120 #define PTP_CHDK_SL_MASK 0xFF |
| 121 |
| 122 /* standard message chdkptp sends */ |
| 123 #define PTP_CHDK_LUA_SERIALIZE "\n\ |
| 124 serialize_r = function(v,opts,r,seen,depth)\n\ |
| 125 local vt = type(v)\n\ |
| 126 if vt == 'nil' or vt == 'boolean' or vt == 'number' then\n\ |
| 127 table.insert(r,tostring(v))\n\ |
| 128 return\n\ |
| 129 end\n\ |
| 130 if vt == 'string' then\n\ |
| 131 table.insert(r,string.format('%q',v))\n\ |
| 132 return\n\ |
| 133 end\n\ |
| 134 if vt == 'table' then\n\ |
| 135 if not depth then\n\ |
| 136 depth = 1\n\ |
| 137 end\n\ |
| 138 if depth >= opts.maxdepth then\n\ |
| 139 error('serialize: max depth')\n\ |
| 140 end\n\ |
| 141 if not seen then\n\ |
| 142 seen={}\n\ |
| 143 elseif seen[v] then\n\ |
| 144 if opts.err_cycle then\n\ |
| 145 error('serialize: cycle')\n\ |
| 146 else\n\ |
| 147 table.insert(r,'\"cycle:'..tostring(v)..'\"')\n\ |
| 148 return\n\ |
| 149 end\n\ |
| 150 end\n\ |
| 151 seen[v] = true;\n\ |
| 152 table.insert(r,'{')\n\ |
| 153 for k,v1 in pairs(v) do\n\ |
| 154 if opts.pretty then\n\ |
| 155 table.insert(r,'\\n'..string.rep(' ',depth))\n\ |
| 156 end\n\ |
| 157 if type(k) == 'string' and string.match(k,'^[_%a][%a%d_]
*$') then\n\ |
| 158 table.insert(r,k)\n\ |
| 159 else\n\ |
| 160 table.insert(r,'[')\n\ |
| 161 serialize_r(k,opts,r,seen,depth+1)\n\ |
| 162 table.insert(r,']')\n\ |
| 163 end\n\ |
| 164 table.insert(r,'=')\n\ |
| 165 serialize_r(v1,opts,r,seen,depth+1)\n\ |
| 166 table.insert(r,',')\n\ |
| 167 end\n\ |
| 168 if opts.pretty then\n\ |
| 169 table.insert(r,'\\n'..string.rep(' ',depth-1))\n\ |
| 170 end\n\ |
| 171 table.insert(r,'}')\n\ |
| 172 return\n\ |
| 173 end\n\ |
| 174 if opts.err_type then\n\ |
| 175 error('serialize: unsupported type ' .. vt, 2)\n\ |
| 176 else\n\ |
| 177 table.insert(r,'\"'..tostring(v)..'\"')\n\ |
| 178 end\n\ |
| 179 end\n\ |
| 180 serialize_defaults = {\n\ |
| 181 maxdepth=10,\n\ |
| 182 err_type=true,\n\ |
| 183 err_cycle=true,\n\ |
| 184 pretty=false,\n\ |
| 185 }\n\ |
| 186 function serialize(v,opts)\n\ |
| 187 if opts then\n\ |
| 188 for k,v in pairs(serialize_defaults) do\n\ |
| 189 if not opts[k] then\n\ |
| 190 opts[k]=v\n\ |
| 191 end\n\ |
| 192 end\n\ |
| 193 else\n\ |
| 194 opts=serialize_defaults\n\ |
| 195 end\n\ |
| 196 local r={}\n\ |
| 197 serialize_r(v,opts,r)\n\ |
| 198 return table.concat(r)\n\ |
| 199 end\n\ |
| 200 \n\ |
| 201 usb_msg_table_to_string=serialize\n" |
| 202 |
| 203 |
| 204 // bit flags for script start |
| 205 #define PTP_CHDK_SCRIPT_FL_NOKILL 0x100 // if script is running return
error instead of killing |
| 206 #define PTP_CHDK_SCRIPT_FL_FLUSH_CAM_MSGS 0x200 // discard existing cam->host
messages before starting |
| 207 #define PTP_CHDK_SCRIPT_FL_FLUSH_HOST_MSGS 0x400 // discard existing host->cam
messages before starting |
| 208 |
| 209 // bit flags for script status |
| 210 #define PTP_CHDK_SCRIPT_STATUS_RUN 0x1 // script running |
| 211 #define PTP_CHDK_SCRIPT_STATUS_MSG 0x2 // messages waiting |
| 212 // bit flags for scripting support |
| 213 #define PTP_CHDK_SCRIPT_SUPPORT_LUA 0x1 |
| 214 |
| 215 |
| 216 // bit flags for remote capture |
| 217 // used to select and also to indicate available data in PTP_CHDK_RemoteCaptureI
sReady |
| 218 /* |
| 219 Full jpeg file. Note supported on all cameras, use Lua get_usb_capture_support t
o check |
| 220 */ |
| 221 #define PTP_CHDK_CAPTURE_JPG 0x1 |
| 222 |
| 223 /* |
| 224 Raw framebuffer data, in camera native format. |
| 225 A subset of rows may be requested in init_usb_capture. |
| 226 */ |
| 227 #define PTP_CHDK_CAPTURE_RAW 0x2 |
| 228 |
| 229 /* |
| 230 DNG header. |
| 231 The header will be DNG version 1.3 |
| 232 Does not include image data, clients wanting to create a DNG file should also re
quest RAW |
| 233 Raw data for all known cameras will be packed, little endian. Client is responsi
ble for |
| 234 reversing the byte order if creating a DNG. |
| 235 Can requested without RAW to get sensor dimensions, exif values etc. |
| 236 |
| 237 ifd 0 specifies a 128x96 RGB thumbnail, 4 byte aligned following the header |
| 238 client is responsible for generating thumbnail data. |
| 239 |
| 240 ifd 0 subifd 0 specifies the main image |
| 241 The image dimensions always contain the full sensor dimensions, if a sub-image w
as requested |
| 242 with init_usb_capture, the client is responsible for padding the data to the ful
l image or |
| 243 adjusting dimensions. |
| 244 |
| 245 Bad pixels will not be patched, but DNG opcodes will specify how to patch them |
| 246 */ |
| 247 #define PTP_CHDK_CAPTURE_DNGHDR 0x4 |
| 248 |
| 249 // status from PTP_CHDK_RemoteCaptureIsReady if capture not enabled |
| 250 #define PTP_CHDK_CAPTURE_NOTSET 0x10000000 |
| 251 |
| 252 // message types |
| 253 enum ptp_chdk_script_msg_type { |
| 254 PTP_CHDK_S_MSGTYPE_NONE = 0, // no messages waiting |
| 255 PTP_CHDK_S_MSGTYPE_ERR, // error message |
| 256 PTP_CHDK_S_MSGTYPE_RET, // script return value |
| 257 PTP_CHDK_S_MSGTYPE_USER, // message queued by script |
| 258 // TODO chdk console data ? |
| 259 }; |
| 260 |
| 261 // error subtypes for PTP_CHDK_S_MSGTYPE_ERR and script startup status |
| 262 enum ptp_chdk_script_error_type { |
| 263 PTP_CHDK_S_ERRTYPE_NONE = 0, |
| 264 PTP_CHDK_S_ERRTYPE_COMPILE, |
| 265 PTP_CHDK_S_ERRTYPE_RUN, |
| 266 // the following are for ExecuteScript status only, not message types |
| 267 PTP_CHDK_S_ERR_SCRIPTRUNNING = 0x1000, // script already running with NOKILL |
| 268 }; |
| 269 |
| 270 // message status |
| 271 enum ptp_chdk_script_msg_status { |
| 272 PTP_CHDK_S_MSGSTATUS_OK = 0, // queued ok |
| 273 PTP_CHDK_S_MSGSTATUS_NOTRUN, // no script is running |
| 274 PTP_CHDK_S_MSGSTATUS_QFULL, // queue is full |
| 275 PTP_CHDK_S_MSGSTATUS_BADID, // specified ID is not running |
| 276 }; |
| 277 |
| 278 #endif // __CHDK_PTP_H |
OLD | NEW |