inputmanager
|inputreader --> inputdispatcher
|eventhub
|driver
一. 裝置的新增過程
對於/dev/input下的裝置結點,開機時會自動掃瞄一下,
同時也新增了監測,每當裝置結點有變化(usb滑鼠插入)時都會再掃瞄一下.
下面只分析開機掃瞄/dev/input/的過程,監測過程類似.
在./frameworks/base/services/input/eventhub.cpp中
size_t eventhub::getevents(int timeoutmillis, rawevent* buffer, size_t buffersize)
}getevents
--> scandeviceslocked
void eventhub::scandeviceslocked()
}getevents
--> scandeviceslocked
--> scandirlocked
status_t eventhub::scandirlocked(const char *dirname)
closedir(dir);
return 0;
}getevents
--> scandeviceslocked
--> scandirlocked
--> opendevicelocked
status_t eventhub::opendevicelocked(const char *devicepath)
getevents
--> scandeviceslocked
--> scandirlocked
--> opendevicelocked
--> adddevicelocked
void eventhub::adddevicelocked(device* device)
二. 裝置事件的處理
都是在./frameworks/base/services/input/inputreader.cpp中
bool inputreaderthread::threadloop()
threadloop
--> looponce
void inputreader::looponce()
threadloop
--> looponce
--> processeventslocked
processeventslocked(meventbuffer, count)
}2.1 特殊事件的處理
特殊事件包括: adddevice, removedevice, handleconfigurationchanged
threadloop
--> looponce
--> processeventslocked
--> adddevicelocked ;;特殊事件的處理
注意:eventhub中新增的型別為device, 這兒把device轉為了inputdevice
即要篩選出非inputdevice,只將inputdevice新增到device列表中
void inputreader::adddevicelocked(nsecs_t when, int32_t deviceid)
threadloop
--> looponce
--> processeventslocked
--> adddevicelocked ;;特殊事件的處理
--> createdevicelocked ;;對於add事件的處理
inputdevice* inputreader::createdevicelocked(int32_t deviceid,) else if (classes & input_device_class_touch)
return device;
}2.2 資料事件的處理(以觸控螢幕為例)
threadloop
--> looponce
--> processeventslocked
--> processeventsfordevicelocked ;;資料事件的處理
void inputreader::processeventsfordevicelocked(int32_t deviceid, ...)
threadloop
--> looponce
--> processeventslocked
--> inputreader::processeventsfordevicelocked ;;資料事件的處理
--> inputdevice::process
void inputdevice::process(const rawevent* rawevents, size_t count)
} else if (rawevent->type == ev_syn && rawevent->code == syn_dropped) else }}
}if (rawevent->type == ev_syn && rawevent->code == syn_report)
}cookpointerdata();
dispatchhoverexit(when, policyflags);
dispatchtouches(when, policyflags);
dispatchhoverenterandmove(when, policyflags);
}dispatchmotion(...);
}notifymotionargs args(when, getdeviceid(), source, policyflags,
action, flags, metastate, buttonstate, edgeflags,
mviewport.displayid, pointercount, pointerproperties, pointercoords,
xprecision, yprecision, downtime);
getlistener()->notifymotion(&args); //只是將args壓出棧中,在flush中統一處理
}inputdevice* inputreader::createdevicelocked(int32_t deviceid,) else if (classes & input_device_class_touch)
return device;
}其實質就是呼叫其成員變最mmppers.add過程}}
void inputdevice::process(const rawevent* rawevents, size_t count)
}mmultitouchmotionaccumulator.process(rawevent); multitouchmotionaccumulator::process
}mcursorbuttonaccumulator.process(rawevent);//只對ev_key(0x01)處理,即只對( 0001 014a 00000001)起作用,但實際上沒有case,
mcursorscrollaccumulator.process(rawevent);//只對ev_rel(0x02)處理,但touch只有(3 或 1),所以這兒不起作用mtouchbuttonaccumulator.process(rawevent);//只對ev_key(0x01)處理,但touch是即只對( 0001 014a 00000001)起作用
//mbtntouch = rawevent->value;記錄了type=01時的value值
if (rawevent->type == ev_syn && rawevent->code == syn_report)
業務用例和系統用例
拋開前一篇文章談的總體思路,我們今天來談一下需求分析工作實質性的做些什麼。在這裡,我們,將主要關注於分析層面,也即 uml中的用例模型和邏輯模型。在這裡要申明的是邏輯模型並不能完全算需求分析階段的工作,因為它包含了設計模型的概念,但是我又把它歸納了一塊到需求分析階段,原因在於邏輯模型中存在了業務物件...
業務用例和系統用例
業務用例與系統用例具有同樣的特徵,因此編寫和評審用例的方法對兩者都適用。在業務用例中說明的東西,也會在系統用例中說明。這形成了系統用例和使用者用例之間的合作。但這樣帶來了兩個壞訊息。第乙個壞訊息 編寫者和讀者經常把二者弄混,可能把系統行為放入業務用例中,也可能把業務操作歸於系統用例。如果能夠商量著去...
用C 獲取系統時間
用c 獲取系統時間 datetime 數字型 system.datetime currenttime new system.datetime 1.1 取當前年月日時分秒 currenttime system.datetime.now 1.2 取當前年 int 年 currenttime.year 1...