PictBridge 05 - PictBridge Library Overview
-
Upload
chih-hansteven-lin -
Category
Devices & Hardware
-
view
97 -
download
1
Transcript of PictBridge 05 - PictBridge Library Overview
PictBridge Library Overview
Bear Lin
2009/04/28
OutlineSystem Overview Flow of program running in Picture BridgeTASKfnPictProcessQueueDSC to Printer event dispatchingPrinter to DSC events dispatchingfnFilterRecvDataData Encapsulation, decap and routinesPrinter Detection and initialzationPrinting Process
Picture Bridge Library
PrinterAP Layer
Events: PICT_XXXUser Request
Events : Printer Status
Request
Response
Event
System Overview
Communicate with PTP protocol
fnPictInit()
fnAppProcessInfoEvent()
fnPictProcess()
User RequestIn Event form
Event from Printer
Flow of program running in Picture Bridge
DpsAPP
Dps
PTP
g_eAPP_DPSActionType : DPS_ConfigurePrintService, DPS_GetCapability, DPS_StartJob, DPS_AbortJob, DPS_ContinueJob,
Func = fnDPSOperation(), fnDPSDiscovery()
fnPTPSendEventBlock(), fnPTPSendDataBlock(), fnPTPSendResponseBlock()
Request from DSC in event form
Flow of program running in Picture Bridge(cont.)
Notify from Printer in event form
g_ePRN_DPSActionType: DPS_NotifyJobStatus, DPS_NotifyDeviceStatus
Func = fnDpsPrinterReq()
fnPTPCheckCommandBlock(), fnDPSGetContainerInfo(), fnDPSGetMainObjectInfo(),
struct _Task{
FuncPointer pFunc;unsigned char ucTaskStatus;unsigned char ucTaskStep;unsigned char ucRestoreStep; // added for resend and ptp cancelstruct _Task *pCallerTask;struct _Task *pCalledTask;
};
Double Link List
TASK
Task A Task B Task C
pCallerTask
pCalledTask
Func A Func B Func C
Step 1
:
Step N
Step 1
:
Step M
Step 1
:
Step I
DPSAPP DPS PTP
Scheduled by Pictprocess
RUN
BLOCKor Job done, set func to NULL
TASK(cont.)
fnProcessEvent()
fnUSBPeriodRoutine()
fnFilterRecvData()
if ( g_stUpPtp.pFunc != NULL && g_stUpPtp.ucTaskStatus == RUN )( *g_stUpPtp.pFunc ) ( &g_stUpPtp );
Get and process event from DSC main system
Check incoming packet from USB, do data receive
if ( g_stDownPtp.pFunc != NULL && g_stDownPtp.ucTaskStatus == RUN )( *g_stDownPtp.pFunc ) ( &g_stDownPtp );
if ( g_stUpDps.pFunc != NULL && g_stUpDps.ucTaskStatus == RUN )( *g_stUpDps.pFunc ) ( &g_stUpDps );
if ( g_stUpDpsApp.pFunc != NULL && g_stUpDpsApp.ucTaskStatus == RUN )( *g_stUpDpsApp.pFunc ) ( &g_stUpDpsApp );
if ( g_stDownDps.pFunc != NULL && g_stDownDps.ucTaskStatus == RUN )( *g_stDownDps.pFunc ) ( &g_stDownDps );
if ( g_stDownDpsApp.pFunc != NULL && g_stDownDpsApp.ucTaskStatus == RUN )g_stDownDpsApp.pFunc ( &g_stDownDpsApp );
Check Printer event, getFileInfo, getFile, getPartialFile
Process DPS,PTP,DpsApp Upward, downward tasks.
Process Abort, Continue Task
fnPictProcess()
if ( ( g_stFileDps.pFunc != NULL ) && ( g_stFileDps.ucTaskStatus == RUN ) )( *g_stFileDps.pFunc ) ( &g_stFileDps );
Queue
Queues : Queue(DSC to Printer), InfoQueue(Printer to DSC).
typedef struct _Event
{
unsigned char ucCode;
unsigned char aDataBuffer[MAX_EVENT_BUF_LEN];//89
unsigned int uiDataLength;
} Event;
typedef struct _InfoEvent
{
unsigned char ucCode;
unsigned char aDataBuffer[MAX_INFO_EVENT_BUF_LEN];//20
unsigned int uiDataLength;
} InfoEvent;
uiDataLength
ucCode
aDataBuffer[89]
Event:
uiDataLength
ucCode
aDataBuffer[20]
InfoEvent:
Queue(cont.)
typedef struct _Queue
{
Event aEventQueue[MAX_QUEUE_LEN];//3
unsigned char ucReadPointer;
unsigned char ucReadLock;
unsigned char ucWritePointer;
unsigned char ucWriteLock;
unsigned char ucDataLength;
unsigned char ucUrgeFlag;
} Queue;
RP, WP, RL, WL, DL ,UF
Queue:
fnBeforePutEvent()
fnAfterPutEvent()
fnBeforeGetEvent()
fnAfterGetEvent()
Queue(cont.)
extern Queue g_stInputQueue;
extern InfoQueue g_stOutputQueue;
typedef struct _InfoQueue
{
InfoEvent aEventQueue[MAX_INFO_QUEUE_LEN];//4
unsigned char ucReadPointer;
unsigned char ucReadLock;
unsigned char ucWritePointer;
unsigned char ucWriteLock;
unsigned char ucDataLength;
} InfoQueue;
RP, WP, RL, WL, DL
InfoQueue:
fnBeforePutInfoEvent()
fnAfterPutInfoEvent()
fnBeforeGetInfoEvent()
fnBeforeGetInfoEvent()
Put event in queue:(1) fnBeforePutInfoEvent : 1.Check queue WrLock/Full? 2.Set WrLock. 3.Get WrPtr.(2) FW put event and data in queue with this WrPtr.(3) fnAfterPutInfoEvent : 1.Check queue WrLock. 2.Update WrPtr/DataLen. 3.Check WrPtr boundary. 4.Set WrLock False.
Queue(cont.)
Retrieve event in queue:(1) fnBeforeGetInfoEvent : 1.Check queue RdLock/Empty? 2.Set RdLock. 3.Get RdPtr(2) FW process event and data in queue with this RdPtr.(3) fnAfterGetInfoEvent : 1.Check queue RdLock. 2.Update RdPtr/DataLen. 3.Check RdPtr boundary. 4.Set RdLock False.
Event processing:fnAppProcessInfoEvent(): Decode Printer to DSC events and dispatch.fnProcessEvent() : Decode DSC to Printer events and dispatch.
RdPtr
WrPtr
fnProcessEvent()
PICT_PRINT
PICT_DPOF
PICT_CONFIGPICT_CAPAPICT_ABORT
PICT_CONTINUE
fnEventAbort()
fnEventGetCapability()
fnEventConfig()
fnExtParseDPOF()fnEventPrintImage()fnEventContinue()
DSC to Printer event dispatching
PICT_PRINT_HUGEJOB_STARTPICT_PRINT_HUGEJOB_CONTENT
fnEventBeforeHugePrint()
PICT_PRINT_HUGEJOB_END
fnEventBeforeHugePrintLast()
fnAppProcessInfoEvent()
ucCode
MSG_DETECT
MSG_OPERATIONFAIL
MSG_DEVICESTATUSMSG_PRINTSERVICE
……..
g_stMsgDevStatus.ucJobEndReason
g_stMsgDevStatus.ucErrorStatus
g_stMsgDevStatus.ucErrorReasonMinor
Actions and Message displaying
Events from printer
Printer to DSC events dispatching
g_stMsgDevStatus.ucErrorReason
fnFilterRecvData() Request, Response and event From printer.
Check PTP command
DPS_GetFileInfo DPS_GetFile DPS_GetPartialFile
DPS special optimized actions
fnDpsPrinterReq()
SendObjectInfo
Get XML scripts
XML deciphers :fnDpsGetEventContent()…
Parameters
fnAppNotifyXXXStatus()
Application layer
if ( ulObjectHandle > MIN_IMAGE_FILE_ID )
DPS_GetThumb
fnDpsGetFileInfo() fnDpsGetFile()
GetObjectInfo, GetObject, GetPartialObject, GetThumb
Make sure this is Printer to DSC action
fnFilterRecvData()
Events for fnAppProcessInfoEvent()
GetPartialObject
fnDpsGetFileInfo()GetObjectInfo fnGetFileInfo()
Printer
PTP DPS UI :Implement at Appilication layer
Response
Response
fnDpsGetPartialFile() fnReadFile()
Many times
File TypeFile SIZEFile ID
ulOffset : offset From start of file
uiSize : size dataucBuffer : Buffer
Offset and Data Size for each request
Event : End Normal Job End
fnFilterRecvData(): Dispatching printer request
fnFilterRecvData()(cont.)
Event PICT_XXXand parameters
XML script{ parameters}
PTP command + {XML}
USB Header +PTP command
Applications
DPS
PTP
USB
fnDPSConfigPrintServiceFormat()
fnDPSGetCapabilityFormat()
fnDPSGetJobStatusFormat()
fnDPSGetDevStatusFormat()…………………….
fnPTPFormatDataBlock()
fnPTPFormatResponseBlock()
fnPTPFormatObjectInfo()
fnPTPFormatDeviceInfo()…………………..
fnDPSGetOperateContent()
fnDPSGetEventContent()
fnDPSGetParamVal()
fnDPSGetContainerInfo(): g_stContainerInfo
fnMiscDwordRead()
First 12 byte header
EncapsulationDecapsulation
Data Encapsulation, decap and routines
fnPictInit() : Assign DPS fnAppInitPrint() Task
PictProcess()
No printer found
fnDPSDiscovery()
Detected
DPS_ConfigurePrintService
fnAppGetCapa()
Application layer Detected Event
Printer Detection and initialzation
UI: select Picture + parameters
Issue :PICT_PRINT Put Event
In queue
fnProcessEvent()
Get Event and dispatch
fnEventPrintImage()
g_eAPP_DPSActionType : DPS_StartJob
fnDPSOperation()
PTP command, data, Reponse sequence
USB
fnAppPrint()
Printing Process