發表文章

目前顯示的是 8月, 2009的文章

20090826 Android上使用觸控面板(TouchScreen)模擬KeyEvent (三)

最後就是模擬Key的部份了,其實比讀取還簡單,這都得歸功於Input Subsystem的設計,Service只要呼叫EventReader.SimulateKey(KeyboardFD, code); 這裡的KeyboardFD 就是/dev/input/eventX,而Code則是可以去看 KernelSource/include/linux/input.h 裡面有提到 Backspace = 14, 下面是c的code 1: JNIEXPORT jint JNICALL Java_ITRI_MTube_EventReader_SimulateKey(JNIEnv *env, jclass c, jstring KbdFD, jshort code) 2: { 3: struct input_event event; 4: int fd; 5: const jbyte *FD; 6: FD = (*env)->GetStringUTFChars(env, KbdFD, NULL); 7: if (FD == NULL) { 8: return NULL; /* OutOfMemoryError already thrown */ 9: } 10: 11: if ((fd = open(FD, O_RDWR)) < 0) { 12: (*env)->ReleaseStringUTFChars(env, KbdFD, FD); 13: return -1; 14: } 15: 16: (*env)->ReleaseStringUTFChars(env, KbdFD, FD); 17: event.type = EV_KEY; 18: event.code = code; 19: //keydown 20: event.value = 1; 21: if (write(fd, &event, sizeof(event)) < 0){ 22:

20090826 Android上使用觸控面板(TouchScreen)模擬KeyEvent (二)

  所以我們的Native Code就是從/dev/input裡面讀資料了,這是有標準寫法的,可以去搜尋evtest,這也是一個好物~Driver回報的時候,最後會使用SYNC Flag,而User Level程式在讀的時候也是這樣子,當Android層的Service呼叫c的ReadPointer時,c會進入一個無窮迴圈直到他讀到sync,如果沒資料就會被block住(Good,不佔用cpu),如果讀到Sync之後,Service就再透過jni去讀取c剛剛從driver讀到的x,y,touch。原理就是這麼簡單,下面是Code,MT的部份是為了支援Linux 2.6.30之後的Multitouch功能,目前用不到。 1: #include "ITRI_MTube_EventReader.h" 2: #define SYN_MT_REPORT 2 3:  4: #define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */ 5: #define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */ 6: #define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */ 7: #define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */ 8: #define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */ 9: #define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */ 10: #define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */ 11: #define ABS_MT_TOOL_TYP

20090826 Android上使用觸控面板(TouchScreen)模擬KeyEvent (一)

20090826 Android上使用觸控面板(TouchScreen)模擬KeyEvent 最近我們的機器上已經可以跑Android了,使用TI OMAP3530,這顆SOC不錯,網路上有許多人在幫忙porting Android到BeagleBoard上,所以使用人家的beagledroid git就可以了。但如果要使用expansion pin(ex: gpio、mmc、rs232 的bus)時,常常會發生電壓不夠,而需要另外接voltage/level translation,比較麻煩而已,因為TI不一定會想要賣給你幾顆Level Translation的IC,所以我們就必須用要Sample的方式來取得。我們的觸控面板使用dmc的晶片,分析Android Framework的Source Code之後,發現他是讀標準的input subsystem,所以driver要有註冊到input subsystem才行。我拿到兩種觸控板的Driver都沒有,一個是TSC的,一個就是DMC的。 要改Driver成Android可以使用也不是那麼麻煩,只要在probe裡面呼叫 input_register_device,然後再用set_bit、input_set_abs_params就好,這樣在/dev/input下面就會新增一個File Description了,但其實這個File Description是evdev.c弄出來的,evdev真是一個好物,關於Input Subsystem可以去google搜尋,有很多好的分析文章,而且看完之後大有收獲。當註冊完之後,接下來就是要回報了,什麼時候要回報,當然是我們從硬體拿到資料的時候,所以就是在irq函式裡面囉,於是把byte值轉為對應的座標,再使用input_report_XXX來回報至上層。 在修改這部份的時候,有想過校正的問題,這裡解釋一下校正的用意,一般來說觸控板原本的左上右下各會有一個座標,我拿到的dmc是(0,0)跟(2046,2046),但Android系統是(800,480),所以就需要加減乘除,當然如果觸控面板有瑕疵的話,左上也有可能不是(0,0),可能是負的,所以我們每次拿到一支新手機的時候,都要先做校正的動作。 第一版我是直接寫死在IRQ函式裡面,也就是固定左上右下座標,但這樣如果換了解析度就很麻煩

勇敢的單單

  話說單單可能也遺傳到我過敏的體質了,算了,人生在世,本來就不可能十全十美,有氣喘才知道呼吸的可貴。最近他手上長了不少小紅點,看了幾次診所,都沒治好,而且還有擴散的現象,手->眼睛->背->腳。所以這周末帶去馬偕看了,看完之後醫生也只是說濕疹,然後順便去抽個血看一下過敏值有沒有變高但現在還驗不出來過敏原。到了抽血中心的時候,看到小朋友一直在那邊大哭大叫,單單一直很好奇的過去看,然後又看到護士要送的貼紙,單單好像有興趣,我就跟他說等下抽血會痛一下,那你要跟護士阿姨要幾個貼紙,他就說一個,科科。 然後看到某個小姊姊在抽血的時候很勇敢,我就抱他起來跟他說,姊姊好勇敢喔,都沒有哭,等下你也要讓阿姨抽血喔,他靜靜的想著。 我們前一個是一個大概四五歲的小朋友,排隊的時候,一直在地上跑來跑去玩,結果輪到他的時候,他爸把他拉進去,他就一直說不要,想絡跑,還滿好笑的。我想說等下單單會不會又要強力壓制了,跟以前打預防針的時候一樣。 沒想到輪到單單的時候,他就乖乖的讓我抱著,然後右手伸出去讓護士纏住手臂,另一個護士看單單這麼乖,就不幫忙壓了,雖然他們叫我要抓住單單的左手,可是當護士阿姨插進血管的時候,單單因為痛抖了一下,但左手仍然沒有什麼動作,我也就握住他,那一剎那,我突然眼眶紅了,科科,孩子是父母親的驕傲,護士可能也驚訝的說,這麼小就這麼勇敢,於是就從口袋拿出隱藏的紋身貼紙(原本桌上是一些比較醜的XD,沒想到她也有準備大絕招),雖然單單說只要一張就好,但護士還是給了他兩張。

旋轉的羽球發球

  話說最近已經不知道有甚麼球好練了,於是開始練習左手。昨天突然想到兩年前在跟某校隊打球的時候,他的發球會旋轉,發過來之後羽毛會朝向你,讓你只能低手打,於是決定要練這種發球,今天去練了半小時之後,還是抓不到訣竅,但大概可以確定要打羽毛的地方,因為只要一打到球頭,不管球拍的方向,一定都會直直飛。後來問了某個人說有沒有看過這種發球,他跟我說這種發球是犯規的Orz。 回來使用google找了資料,關鍵字如右:羽球 發球 羽毛 中國 發明 禁止 找到下面這篇: http://www.52yuqiu.com/bbs/dispbbs.asp?BoardID=4&replyID=58880&id=10684&skin=1 羽壇「旋風」飄然逝去 只要是球,基本上就能旋轉,而旋轉球也是許多球類項目中常見的技術。但是,在羽毛球比賽中,就絕對不容許旋轉球的出現,這是為什麼呢?想知道這其中的緣故,我們還是先從一次中國的全運會上說起——   1983年10月,第5屆全國運動會在上海舉行。在上海體育館的羽毛球比賽場上,曾獲得1978年曼谷亞運會女子單打冠軍和1979年第4屆全運會女子單打冠軍的劉霞出戰名不見經傳 的浙江選手。一上場,浙江選手突然發起了旋轉球,她發出的球,飛行路線不是正常的軌跡,而是忽上忽下,忽左忽右,並帶著旋轉直向劉霞場內飄來,一直到球落地還在打轉轉。劉霞看著這不斷旋轉的球不知從何下拍,挑輕了下網,挑重了出界,最後竟以0比15、5比15敗下陣來。   旋轉發球又名飄球,20世紀70年代末由馬來西亞羽毛球運動員西德克三兄弟發明使用,故亦稱「西德克發球」。旋轉發球特點是發球時倒拿羽毛球,用反手動作擊打羽毛部分,使球在飛行過程中不斷旋轉,使球的行蹤飄忽不定,從而給接球隊員造成困難,常使人還未回過神就敗下陣來。因用於比賽取得驚人效果,世界羽壇很快就出現了一股「旋風」。國內外一批名將都被這種旋轉球「轉」得「頭暈目眩」,往往只能得幾分,在第一輪就慘遭淘汰。一時間,真可謂談「旋」色變。   與此同時,國際上也就「旋轉發球」展開爭論。丹麥、英國等國認為這種發球「違反規則」應予取消。1981年5月,國際羽聯和世界羽聯聯合後的首次大會上,丹麥、英國等國再次提出要修改規則禁止這種發球,而馬來西亞、印度尼西亞等國反對。中國當時已掌握這種技術,在國際大賽中運用效果很好,因此