某人曾經說過:身為程式魔人居然不會在自己手機上寫Code將是一生的污點…

如今,我又意外解除另一項成就:在自己的 GPS 錶上寫程式~

入手 Fenix3 三個月,對它的外型、GPS精準度、穩定性、耗電都無從挑剔,唯一感覺不足的只有跑步App畫面欄位最多只能放四個。我自己跑步時會關心步速(Pace)、步頻、心率、距離、時間,跑LSD時還會想知道現在幾點,跑山路馬拉松時則會關心現在爬多高快到山頂沒,算一算四欄顯然不夠,而我又不喜歡邊跑邊切畫面,Fenix3 的錶面夠大,理論上可以再擠更多資訊。

後來在 Connect IQ Store 找到有人寫出一次塞進七種資料的資料欄位-367RunFields,二話不說馬上下載,果然是我的菜,從此跑長程幾乎就全程用它搞定。

好景不長。某次自動更新後,發現作者註銷舊版另推新版,而邪惡的新版其實只是試用版,使用一段時間後就轉成廣告畫面,提醒要升級完整版需洽詢作者付費。見此情景,身為以寫程式為生,連閒暇都要靠 Coding 放鬆心情的程式魔人,是可忍孰不可忍,立刻查資料,裝工具,學語言,怒寫一套自用。

最後,依我自己的需要,寫成一套八合一資料欄位,納入現在時刻、跑步時間、步頻、平均步速(Pace)、海拔高度、總距離、心率、目前步速(20秒平均值)八種跑步資訊,另外再加上電池電量百分比以及 GPS 訊號狀態(綠色表示訊號正常,紅色表示收不到訊號,無法偵測強弱)。平約步速與高度對我來說是次要資訊,所以共用最中央的顯示位置,每五秒切換一次。

GPS 斷訊時左上角符號跟 GPS 字樣將呈現紅色(本想顯示訊號強弱,但API未提供),電池除了電量百分比外也有長條顯示,電量偏低時會變紅。

猜想可能有其他跑友也會喜歡這種「海陸大拼盤式」的整合資訊錶面,順手把它上架到 Connect IQ Store,有興趣的 Fenix3 跑友可以下載試用,如遇使用問題或出現錯誤可留言回饋給我。

另外,整理 Connect IQ App 開發的相關資源如下:

  1. Connect IQ SDK 入口網站
    http://developer.garmin.com/connect-iq/overview/
  2. 工具安裝指南
    http://developer.garmin.com/connect-iq/programmers-guide/getting-started/
    Eclipse 配合 Connect IQ 套件,編譯後可自動部署到模擬器測試,挺方便的
  3. Monkey C 語言簡介
    http://developer.garmin.com/connect-iq/programmers-guide/monkey-c/
    名字有C,寫起來其實比較像JavaScript,弱型別概念,支援OOP,但實測發現物件化對記憶體的需求遠超過資料欄位程式的16KB記憶體上限,平舖直述全部塞在一個函式裡才是王道。
    但程式碼沒有物件化跟模組化,維護起來會出人命。最後我想出的做法是用C#寫OOP程式實現顯示元素繼承及彈性欄位排版,程式執行結果輸出為 Monkey C 程式碼交給 Eclipse 編譯測試,用 Visual Studio 開發Garmin Connect IQ 程式,我應該是史上第一人吧?哈!
  4. 開發者討論區
    Connect IQ開發比較冷門,網路上能查到的幾乎都集中在Garmin的開發者討論區 ,有問題也可在上面發問。
    https://forums.garmin.com/forumdisplay.php?479-Connect-IQ

Comments

# by Scott

Hello Jeffrey, 我最近也嘗試寫 Monkey, 一塞到 datafield 應用,記憶體就爆了 XD 可以請你多分享一下如何用 Visual Studio 開發Garmin Connect IQ 嗎?很想兼顧 OOP 又省記憶體啊~ 感恩 Scott

# by Jeffrey

to Scott, DataField為記憶體上限為16K,扣掉程式本身7K起跳,存變數、物件的空間不到9K,幾行稍微複雜的程式碼就可能用掉100-200 bytes,而在Monkey C裡建一個物件幾乎用掉的記憶體都是以百計算的,故我的心得是在Data Field裡的Monkey C物件沒人玩得起,全部展開成平舖直述的程式碼才是王道。 因此我在VS裡建了專案,設計了線條、色塊、欄位等類別,都繼承自訂的ViewElement類別,ViewElement有個GenCode()方法,呼叫它可得到dc.setColor(Gfx.COLOR_BLUE)、dc.drawLine(...)的MonkeyC程式碼,不同的類別產生的程式不同,並且可以在類別中加入屬性記錄位置、字型、顏色等,輸出不同的程式碼內容。用一個List<ViewElement>儲存畫面上所有的元素,接著逐一呼叫所有ViewElement的GenCode()將輸出結果接在一起,就得到貌似Hard Coding寫出的程式碼,但背後可享用OOP的優勢。

# by Scott

感謝你啦! Cool!

# by Bergkamp Kwok

您好,我的是Fenix3英文版,下载安装了您的Runner Window,但是跑步的时候,一直不知道怎么样调用你的这个界面,能否详细说明一下怎么样使用呢?非常感谢。:) 如果方便的话,请回复我邮件bergkamp_gzp@163.com,谢谢。:)

# by Jeffrey

to Bergkamp Kwok,安裝設定方法可參考這篇:http://blog.darkthread.net/post-2015-11-02-how-to-setup-runner-window.aspx

# by Bergkamp Kwok

太棒了,终于设置好了,非常感谢Jeffrey的分享啊!!!大牛棒棒哒!

# by Scott

Hi Jeffrey, 我是上回有在這詢問你如何精簡 datafield memory usage 的 Scott。我是來自 bomdic Inc. (www.gomore.me),提供演算法技術來協助跑者和騎士做即時體力分析和最遠距離預估。很開心在這邊認識喜歡跑步又是程式設計的玩家 :) 目前我們正在尋找 同樣也是跑者/車手 也是程式魔人的夥伴,最好熟悉 AWS, mySQL, Spark, Android, iOS 其中一項以上,不知道是不是可以請你協助介紹? Thanks!

# by Jeffrey

to Scott, 呵,很不巧,我擅長的技術與接觸社群較偏微軟,跟你提的技術領域交集較少(還是你們要考慮換技術[誤] XD),如果有機會遇到再幫忙牽線。

# by Scott

的確還沒有換技術的準備 XD 但還是很感謝你回覆啦:)

# by Kenny

大大: 不情之請,請您升級給Fenix 5X可以用,謝謝!

# by Jeffrey

to Kenny, https://apps.garmin.com/en-US/apps/22e85b78-b84e-4441-aa92-aac336c72429 Have Fun!

# by Kenny

Dear 大大: 非常感謝! 非常感謝您!快樂試用中! Cool!

# by segaa

Dear sir , 網路上查到這篇 想請教一下 我有一隻 garmin 手錶 因為摔到了 所以某一個區塊觸碰失靈 , 剛好導致 [開啟廣播心律] 這各按紐按不到 。 不知道已目前garmin 開放的APK 是否有機會寫成一個小程式直接開啟廣播心率呢 ? 感謝你抽空幫忙確認 :D

# by Jeffrey

to segaa, 依我所知 ConnectIQ SDK (https://developer.garmin.com/downloads/connect-iq/monkey-c/doc/) 以提供錶內資訊及操作 UI 為主,不包含啟用停用手錶功能的 API。

# by Ramstein

親愛的大大,從235開始用runner window,再到935.現在入手了255,可以請大大更新嗎? 用了好多年已經很習慣了 。拜托

# by Jeffrey

to Ramstein,感謝支持愛護,我再找時間重設開發環境更新看看。

Post a comment