討論區快速選單
知識庫快速選單
政府補助!學嵌入式+物聯網 網路投保旅行平安險 軟實力課程1+1,第二科享5折優惠
[ 回上頁 ] [ 討論區發言規則 ]
如何定時自動啟動錄音功能 ?
更改我的閱讀文章字型大小
作者 : soonbedone(想玩別急)
[ 貼文 18 | 人氣 2284 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/14 下午 09:40:40
小弟有個問題想請教各位大大 !
如何可使我的 SONY CLIE TG-50G 在定時啟動 Power on, 並開始錄音,
最好還能預約關機時刻, 以便節省電力 !

目前我僅能試出此法, 就是令 CPU idle 到該錄音的時刻, 當然這段時間必須把機器
切到 HOLD 狀態儘量省電, 之後再切入錄音程式, 但切換執行後, 便失去主控權, 無法關閉,
只能等待到電池快沒電時, 錄音程式停擺方能停止.

這個方法的缺點是: 這段期間機器是不能用的, 相當不方便 !

我也試過用 Power off 功能, 但程式一旦執行 power off, 即使鬧鈴時間抵達,
鬧鈴程序起動後, 再執行 power on 是失效的, 機器不會 power on,
所切入執行的錄音程式也只會錄到 0 秒的聲音 !

不知各位大大能否建議小弟各種妙招, 謝謝 !!

// Code worrior 9
// 下面這小段是計算從現在起到鬧鈴時間要等多少 ticks (要令 CPU idle 多久的意思)
SetToSleepTime(0); // 把定時啟動選單的鬧鈴時間計算好並存入 newTimer 變數中
now = TimGetSeconds(); // 取得現在時間
AlmSetProcAlarm(my_aap, 0, 0); // 清除本程式之前在系統中的鬧鈴值
SysSetAutoOffTime(0); // 勿關機, keep 在 power on 狀態 !
newTimer = (newTimer - now) * 100; // 1 秒 = 100 ticks
for (i = 90;i > 0;i --) {
for (j = 0;j < 32000;j ++) { // 適用於 200MHz 的 TG-50G (其它機型請自己試)
}
StrPrintF(s1, "\n趁現在, 關閉螢幕 : %d", i); // 就是要你把機器關到 HOLD !
fprtf(s1);
FldDrawField(field_0);
myTreatEvent(); // 呼叫 AppHandleEvent() 等, 按鈕方能作用
}

// 下面這行是主要執行等待的程式, 從機器被 hold 後, 很長的一段時間內 CPU 是不動作的.
SysTaskDelay(newTimer); // 使用者已趁機將機器 hold (待機), 省電 !

// 時間終於到了, CPU 恢復運作, 四秒後將啟動預設之鬧鈴程序 !
setNewAlarm(4); // 四秒後啟動預設之鬧鈴程序
recID = DmFindDatabase(0, "Voice Recorder"); // 先取得錄音程式的 Local ID
err1 = SysUIAppSwitch(0, recID, 0, NULL); // 切換執行錄音程式

// 嗯, 看到 SONY CLIE TG-50G 的紅色錄音燈號亮起, OK !!
 
// 底下這段是令錄音程式的錄音鍵發揮作用
// sorry, 相關資訊不足只好土法煉鋼, 模擬有人去按螢幕的按鈕 !
UInt16 apc, work = 0;

AlmAlarmProcPtr my_aap(UInt16 almProcCmd, SysAlarmTriggeredParamType *paramP)
{ // 因為字數太多, 底下我刪了不少, 大意應仍在
paramP->purgeAlarm = true; // 必須設定成 true, 否則會觸發 display 事件

switch (work) { // work 是全域變數, 其實這樣用有 bug, 好像應改成 volatile UInt16 work;
case 0:
MemSet(&ev, sizeof(ev), 0);
ev.eType = penDownEvent;
ev.penDown = true; // 按下畫面的錄音鍵
ev.tapCount = 1;
ev.screenXY = 150; // TG-50G 的錄音鍵位置約在 XY(150, 150)
EvtAddEventToQueue(&ev);
work = 1; setNewAlarm(2); // 秒數勿太短, 會無效
case 1:
ev.penDown = false; // 按下後須放開按鍵, 否則不會錄音
}
return(NULL);
}
作者 : Kirpheaice(吉爾菲艾斯)討論區板主 人氣指數超過10000點
[ 貼文 149 | 人氣 12109 | 評價 690 | 評價/貼文 4.63 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人soonbedone註記此篇回應為很有道理 2005/3/15 上午 07:52:04
用Alarm,來解決這個問題.
你可以把要錄的時間.寫在AlmSetAlarm堶,
然後等到那個時間到時.它的AlarmTrigger就開始去錄音.
我想.醬子應該可以吧?!因為一般的Alarm只是在時間到時.
去Display一個Form,並把Database挖出來.show一點data而己.
我們就借著alarm的這個trigger.在時間到時.不去畫form或什麼鬼的.
直接去錄音.醬子.試看看吧~^^~

(因為我也沒寫過錄音....^^""")
作者 : soonbedone(想玩別急)
[ 貼文 18 | 人氣 2284 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/15 下午 11:02:02
經過實驗, 在 Alarm 處理程序中切換到 VoiceRecorder 程式會導致嚴重當機 !
因為 Alarm 處理程序算是中斷的簡短處理程式, 因此無法完成太大的工程 (如切換程式)
目前只能採用類似 Windows 的方法, 我想試用訊息指派的動作, 但缺少相關文件,
不知如何運用訊息佇列, 就像模擬畫面按键的方式, 安全的將錄音程式喚起 !

  謝謝版主的指導 !!
作者 : Kirpheaice(吉爾菲艾斯)討論區板主 人氣指數超過10000點
[ 貼文 149 | 人氣 12109 | 評價 690 | 評價/貼文 4.63 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 12:52:11
這....先道個歉.太晚回來看了~><~(最近真的忙到快扛去種了~sorry!!)
我想知道一下.您的main的dispatch是怎麼做的?!怎麼會嚴重當機?!好慘啊~
我也有過類似經驗.大約知道問題在哪.還沒時間去改.所以想知道一下.
您的main堶惆滬荑hile的dispatch是怎麼做的?!我覺得您的關鍵會不會也是這個地方呢?!
sysAppLaunchCmdAlarmTriggered
sysAppLaunchCmdNormalLaunch
(簡單的說.就是以上兩個東東的運用.)

and.不要說指導.我也沒有很專長.只是有點小小經驗.跟大家一起討論.聊聊解決方法而己~
同是天涯苦命人.^^.
作者 : soonbedone(想玩別急)
[ 貼文 18 | 人氣 2284 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 下午 11:23:44
// 底下考慮分別測試處理 sysAppLaunchCmdAlarmTriggered 的程式..
UInt32 PilotMain(...)
{
// 此函式加入此兩個 case 判斷, 在其它地方顯示 dispAlarm 的值...
     case sysAppLaunchCmdAlarmTriggered:
dispAlarm += 100;
break; // 鬧鈴發生作用時, 此部份程式完全不會執行到 !

     case sysAppLaunchCmdDisplayAlarm:
dispAlarm ++;
break; // 鬧鈴發生作用時, 此部份程式完全不會執行到 !
}
---> 照規格看來, 只有此程式是被別的程式搖醒時, 才會傳遞這兩個值進來 !



// -------------
// 因為上列的標準作法完全失敗 (dispAlarm 的值紋風不動 !!)
// 所以試著亂擺到 MainFormHandleEvent() 中看看 ...
static Boolean MainFormHandleEvent(EventType * eventP)
{
// 此函式加入此兩個 case 判斷, 在其它地方顯示 dispAlarm 的值...
     case sysAppLaunchCmdAlarmTriggered:
dispAlarm += 100;
break; // 結果是每點一次選單或放開選單時, dispAlarm 都會加 100.

     case sysAppLaunchCmdDisplayAlarm:
dispAlarm ++;
break; // 結果是每點一次特定按鈕時, dispAlarm 都會加 1.
}
// 在 Metrowerks\CodeWarrior\Palm OS Support\Incs\Core\System\SystemMgr.h 中,
// sysAppLaunchCmdAlarmTriggered 的值是 6, sysAppLaunchCmdDisplayAlarm 的值是 7
// 而 winExitEvent 的值是 6, ctlEnterEvent 的值是 7
---> 所以顯見的, 是事件已被處理後 (winExitEvent), 使 dispAlarm 加 100,
而特定控制項 (ctlEnterEvent) 處理時, 使 dispAlarm 加 1,
所以 sysAppLaunchCmdXXXXX 放這堣]不對 !

... 唉, 我寫程式已堂堂邁入 20 年了, 竟然還闖不出一番天地, 慚愧 !!!
 板主 : 吉爾菲艾斯
 > Palm OS程式設計 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Palm OS程式設計 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Palm OS程式設計
1 吉爾菲艾斯 320 
2 turn 60 
3 Libra 40 
4 joe 20 
5 David 20 
6 H 20 
7 大象 20 
8 FANNY 20 
9 x4jay 20 
Palm OS程式設計
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125