Skip to content

LinkIt Remote

Tom Lin edited this page May 16, 2020 · 1 revision

LinnkIt Remote

LinkIt Remote 是MediaTek所開發出手機App,透過BLE(藍牙通訊)方式,與 LinkIt 7697 資訊傳送達成搖控功能。其架構分為兩個部份:

  • LinkIt 7697上面所執行Micropython lremoteRemoteElementRemoteCore 三個主要函式庫,讓開發者可以程式化手機上面遙控器程式的介面外觀與處理手機的遙控指令。
  • 在iOS與Android上面的 LinkIt Remote 程式可以搜尋附近有執行 LRemote 函式庫的LinkIt 7697 並且連線遙控。
    請點擊下面的系統手機圖示連結下載手機程式:
    itunes-store-badge play-store-badge
    LRemote

Constructors

LinkIt Remote 採用藍牙為通訊方式,因此在使用上先將藍牙子系統初始完成。可以參考 LinkIt Remote]

from lremote import LRemote
import bluetooth
import RemoteElement
import RemoteCore

LBLE = bluetooth.LBLE()
LBLE.begin()

LBLEAdvertisementData = bluetooth.LBLEAdvertisementData()
LBLEPeriphral = bluetooth.LBLEPeriphral()
LBLEAdvertisementData.configAsConnectableDevice(name="TwoLab UPY", uuid="3F60AB39-1710-4456-930C-7E9C9539917E")

藍牙子系統UUID需要與行動裝置 LinkIt Remote 配合,因此 3F60AB39-1710-4456-930C-7E9C9539917E 為特定值。 當開啟 LinkIt Remote App,程式搜尋週為有運行 LRemote等函式,在介面上可以看到 TwoLab U 或是 TwoLab UPY 的裝置,至於無法剛完整成現的,主要原因是藍牙在廣播訊息長度是有限的。因此可以被縮減後面部份文字。

Methods

LRemote(LBLEAdvertisementData, LBLEPeriphral)

LRemote 函式的功能主要為建立手機程式與 LinkIt 7697 資訊設定,如名稱、加入元件於呈現dashboard的格數分配 與方佝性與dashbaord資料更新事件訊息。

  • LBLEAdvertisementData:bluetooth.LBLEAdvertisementData()的物件。
  • LBLEPeriphral: bluetooth.LBLEPeriphral()的物件
LRemote.setName(string)

設定LRemote名稱

  • string: 字串物件
LRemote.setGrid(gird))

設定 LinkIt Remote 呈現網格Column與Row \

  • gird為Tuple物件
    • truple[0]:為dashboard的Column
    • truple[1]:為dashboard的Row

LRemote.setGrid((3,5))
grid_new

LRemote.setOrientation(orientation)

orientation為手機dashboard呈現在方向分為

  • RemoteCore.RC_PORTRAIT:直立呈現
  • RemoteCore.RC_LANDSCAPE:水平呈現
LRemote.addControl(element)

將RemoteElement的物件加入dashbaord函式,element為 RemoteElement 的物件,並且提供下列

  • RemoteElement.LRemoteLabel :標籤物件
  • RemoteElement.LRemoteButton :按鈕物件
  • RemoteElement.LRemoteCircleButton :圓形按鈕物件
  • RemoteElement.LRemoteSwitch :切換開關物件
  • RemoteElement.LRemoteSlider :滑桿物件
  • RemoteElement.LRemoteJoyStick :遊戲搖桿物件
LRemote.begin()

當所需要RemoteElement物件所設定完成後啟重 LRemote 並向周圍的行動裝置發送廣播。

LRemote.connected()

來檢查是否已經有 LinkIt Remote 程式連接到 LinkIt 7697 裝置。

LRemote.process()

用來檢查且處理由 LinkIt Remote 程式所發出來指令

LRemote.updateUI(update_data, len(update_data))

對於 RemoteElement.LRemoteLabel 文字由 LinkIt 7697LinkIt Remote 程式 要求更改。並之前 LRemoteLabel 執行 updateText(String) 函式

switch = RemoteElement.LRemoteSwitch(setText="Switch", setPos=(0,1) , setSize=(1,1), setColor=RemoteElement.RC_BLUE)
  • setText:為字串元件,可設定RemoteElement呈設讓該標籤文字
  • setPos:設定位置座標定為(0, 1)分為X=0、Y=1 setPos
  • setSize:設定RemoteElement元件大小(1,1)對X, Y各占1格數。
  • setColor:設定RemoteElement元件呈現的顏色可以在分為
    • RemoteElement.RC_ORANGE
    • RemoteElement.RC_YELLOW
    • RemoteElement.RC_BLUE
    • RemoteElement.RC_GREEN
    • RemoteElement.RC_PINK
    • RemoteElement.RC_GREY
switch.isValueChanged()

對於元件可以得知使用是無否有觸發元件。

switch.getValue()

對於元件讀取其變化值。

Slieder = RemoteElement.LRemoteSlider(setText="Value Slider(-100 ~ 1024)", setPos=(0,4) , setSize=(4,1), setColor=RemoteElement.RC_YELLOW)
Slieder.setValueRange(min = -100, max = 1024, initial = 0)

對其 RemoteElement.LRemoteSlider 需要額外其範圍值用 setValueRange 設定其最小值,最大值 與初始值。

Exmaple

import gc
gc.collect()
from lremote import LRemote
import bluetooth
import RemoteElement
import RemoteCore
import utime

LBLE = bluetooth.LBLE()
LBLE.begin()
LBLE.get_device_address()

LBLEAdvertisementData = bluetooth.LBLEAdvertisementData()
LBLEPeriphral = bluetooth.LBLEPeriphral()
m_LRemote = LRemote(LBLEAdvertisementData, LBLEPeriphral)

LBLEAdvertisementData.configAsConnectableDevice(name="TwoLab UPY", uuid="3F60AB39-1710-4456-930C-7E9C9539917E")
m_LRemote.setName("TwoLab UPY")
m_LRemote.setGrid((4,5))
m_LRemote.setOrientation(RemoteCore.RC_PORTRAIT)

labelJS = RemoteElement.LRemoteLabel(setText = "(0, 0)", setPos = (0, 0), setSize=(1, 1), setColor=RemoteElement.RC_GREY)
m_LRemote.addControl(labelJS)

labelPB = RemoteElement.LRemoteLabel(setText = "B:0", setPos = (1, 0), setSize=(1, 1), setColor=RemoteElement.RC_GREY)
m_LRemote.addControl(labelPB)

labelSB = RemoteElement.LRemoteLabel(setText = "S:0", setPos = (2, 0), setSize=(1, 1), setColor=RemoteElement.RC_GREY)
m_LRemote.addControl(labelSB)

labelSl = RemoteElement.LRemoteLabel(setText = "Sl:0", setPos = (3, 0), setSize=(1, 1), setColor=RemoteElement.RC_GREY)
m_LRemote.addControl(labelSl)

Slieder = RemoteElement.LRemoteSlider(setText="Value Slider(-100 ~ 1024)", setPos=(0,4) , setSize=(4,1), setColor=RemoteElement.RC_YELLOW)
Slieder.setValueRange(min = -100, max = 1024, initial = 0)
m_LRemote.addControl(Slieder)


button = RemoteElement.LRemoteButton(setText="Push Button", setPos=(0,1) , setSize=(2,1), setColor=RemoteElement.RC_PINK)
m_LRemote.addControl(button)

switch = RemoteElement.LRemoteSwitch(setText="Switch", setPos=(2,1) , setSize=(2,1), setColor=RemoteElement.RC_BLUE)
m_LRemote.addControl(switch)

stick = RemoteElement.LRemoteJoyStick(setPos=(0, 2), setSize=(2, 2), setColor=RemoteElement.RC_ORANGE)
m_LRemote.addControl(stick)

cicrcleButton = RemoteElement.LRemoteCircleButton(setText="Cicrcle", setPos=(2,2) , setSize=(2,2), setColor=RemoteElement.RC_GREEN)
m_LRemote.addControl(cicrcleButton)

gc.collect()
m_LRemote.begin()

gc.collect()
LBLEPeriphral.begin(LBLE)
LBLEPeriphral.advertise(LBLEAdvertisementData)


while True:
    if not m_LRemote.connected():
        utime.sleep_ms(1000)
        print("waiting for connection")
    else:
        utime.sleep_ms(200)
        m_LRemote.process()
    if stick.isValueChanged():
        stickData = stick.getValue()
        display = "(" + str(stickData[0])+ " , "+ str(stickData[1]) + ")"
        update_data = labelJS.updateText(display)
        del stickData
        if not update_data is None:
            m_LRemote.updateUI(update_data, len(update_data))
            del update_data
            gc.collect()

    if button.isValueChanged() or cicrcleButton.isValueChanged():
        buttonData = button.getValue()
        cicrcleButtonData = cicrcleButton.getValue()
        if buttonData or cicrcleButtonData:
            display = "B:1"
        else:
            display = "B:0"
        update_data = labelPB.updateText(display)
        del buttonData
        del cicrcleButtonData
        if not update_data is None:
            m_LRemote.updateUI(update_data, len(update_data))
            del update_data
            gc.collect()

    if switch.isValueChanged():
        switchData = switch.getValue()
        display = "S:" + str(switchData)
        update_data = labelSB.updateText(display)
        del switchData
        if not update_data is None:
            m_LRemote.updateUI(update_data, len(update_data))
            del update_data
            gc.collect()

    if Slieder.isValueChanged():
        SliederData = Slieder.getValue()
        display = "Sl:" + str(SliederData)
        update_data = labelSl.updateText(display)
        del SliederData
        if not update_data is None:
            m_LRemote.updateUI(update_data, len(update_data))
            del update_data

    gc.collect()

Clone this wiki locally