成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

跟著小白一起學鴻蒙--JS應用控制LED(十)

系統 OpenHarmony
Ace(foundation/arkui/ace_engine_lite)是OpenHarmony的輕量級系統所使用的UI框架子系統,為開發者提供JS-UI開發框架。包括.html,.css,.js。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

在《#跟著小白一起學鴻蒙# [九] 寫個簡單的LED驅動》我們熟悉了如何在開源鴻蒙開發驅動應用,并通過hdc工具拷貝至開發板運行。在《#跟著小白一起學鴻蒙#[六]第一個hap應用》的文章里我們學會如何用IDE工具編寫hap應用并他通過IDE工具安裝至開發板運行。我們學會了hap程序的開發,但是hap程序是運行在標準系統的應用,對于輕量和小型系統我們應該如何進行開發呢?接下來我們需要學習下如何開發JS應用。

輕量、小型系統JS應用

Ace(foundation/arkui/ace_engine_lite)是OpenHarmony的輕量級系統所使用的UI框架子系統,為開發者提供JS-UI開發框架。包括.html,.css,.js。開發者可以通過DevEco工具進行開發。其中JS的引擎采用三方庫里的JerryScript(jerryscript是IoT設備上的輕量級JS引擎,支持ECMAScript 5.1標準,適配低內存硬件,最小運行在64KB RAM和小于200KB的flash,提供C API)。關于jerryscript的詳細介紹可以看如下參考鏈接(https://github.com/jerryscript-project/jerryscript )。

#沖刺創作新星# #跟著小白一起學鴻蒙# [十] JS應用控制LED-開源基礎軟件社區

詳細的內容介紹在一下鏈接內可以看到官方的說明:

參考鏈接:https://gitee.com/openharmony/arkui_ace_engine_lite。

此樣例參考小熊派設計,使用小熊派HM_Micro開發板進行驗證。

JS-UI開發流程

graph LR
--> 配置工程 --> 增加LED程序 --> 添加JSAPI接口

創建工程配置工程增加LED程序添加JSAPI接口編譯運行。

建立[Lite]Empty Ability。

#沖刺創作新星# #跟著小白一起學鴻蒙# [十] JS應用控制LED-開源基礎軟件社區

配置工程。

#沖刺創作新星# #跟著小白一起學鴻蒙# [十] JS應用控制LED-開源基礎軟件社區

工程結構說明。

#沖刺創作新星# #跟著小白一起學鴻蒙# [十] JS應用控制LED-開源基礎軟件社區

工程目錄主要在entry里,有以下內容:

  • .preview: 界面預覽目錄。
  • build: 工程編譯目錄。
  • src:包括i18n(國際化翻譯路徑),pages(界面目錄,index.css, index.hml, index.js)。

工程預覽。

#沖刺創作新星# #跟著小白一起學鴻蒙# [十] JS應用控制LED-開源基礎軟件社區

添加按鍵功能控制LED燈。

  • 修改index.hml
<div class="container">
<text class="title">
{{ $t('strings.hello') }} {{ title }}
</text>

<div class="rowcontainer">
<text class="content" if="{{statu == '0'}}">[狀態:{{ $t('strings.ledoff') }}]</text>
<text class="content" if="{{statu == '1'}}">[狀態:{{ $t('strings.ledon') }}]</text>
<text class="content" onclick="ledon">
{{ $t('strings.ledon') }}
</text>
<text class="content" onclick="ledoff">
{{ $t('strings.ledoff') }}
</text>
<text class="content" onclick="ledtoggle">
{{ $t('strings.ledtoggle') }}
</text>
</div>
<text class="content" onclick="exit">
{{ $t('strings.exit') }}
</text>
</div>
  • 修改index.css
.container {
width: 100%;
height: 100%;
flex-direction: column;
justify-content: center;
align-items: center;
}
.title {
width: 200px;
font-size: 30px;
text-align: center;
}
.content{
width: 200px;
font-size: 30px;
text-align: center;
}
.rowcontainer {
width: 100%;
height: 50%;
flex-direction: row;
justify-content: center;
align-items: center;
}
  • 修改index.js
var led = {open:1,close:0,change:2}
import app from '@system.app';
export default {
data: {
title: "",
statu:'0'
},
onInit() {
this.title = this.$t('strings.world');
},
ledon(e) {
let that = this
console.info("ledon")
app.ledcontrol({
code:led.open,
success(res){
that.statu = res.led_status
},
fail(res,code){
console.error("ledon error")
},
complete(){
console.info("ledon complete")
}
})
},
ledoff(e) {
let that = this
console.info("ledoff")
app.ledcontrol({
code:led.close,
success(res){
that.statu = res.led_status
},
fail(res,code){
console.error("ledoff error")
},
complete(){
console.info("ledoff complete")
}
})
},
ledtoggle(e) {
let that = this
console.info("ledtoggle")
app.ledcontrol({
code:led.change,
success(res){
that.statu = res.led_status
},
fail(res,code){
console.error("ledtoggle failed")
},
complete(){
console.info("ledtoggle complete")
}
})
},
exit(e) {
app.terminate()
},
}
  • 預覽

#沖刺創作新星# #跟著小白一起學鴻蒙# [十] JS應用控制LED-開源基礎軟件社區

  • 將代碼編譯成hap包:點擊編輯器最左下角的OhosBuild Varilants,打開編譯模式選擇視圖,編譯模式分debug和release,選擇release模式;
  • 點擊編輯器上方菜單欄的Build->Build Hap(s)/App(s)->Build Hap(s),系統就會開始自動編譯代碼成hap包,等到下方Build Output無編譯錯誤,就表示代碼編譯完成了。

增加JS的API接口。

  • 在app_module.h里增加接口

JSI::SetModuleAPI(exports, "ledcontrol", AppModule::ToggleLed);

  • 在app_module.cpp里增加接口實現
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"
#define LED_WRITE_READ 1
#define LED_SERVICE "hdf_led"
......
static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data)
{
uint32_t value;
HdfSbufReadUint32(data, &value);
HILOG_ERROR(HILOG_MODULE_ACE,"%s: dev event received: %u %u\n", (char *)priv, id, value);

return HDF_SUCCESS;
}
static int GpioWriteRead(struct HdfIoService *serv, int32_t eventData, int32_t *val)
{
int ret = HDF_FAILURE;
struct HdfSBuf *data = HdfSBufObtainDefaultSize();
struct HdfSBuf *reply = HdfSBufObtainDefaultSize();

if (data == NULL || reply == NULL) {
HILOG_ERROR(HILOG_MODULE_ACE,"fail to obtain sbuf data\n");
return ret;
}
if (!HdfSbufWriteUint8(data, (uint8_t)eventData))
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to write sbuf\n");
HdfSBufRecycle(data);
HdfSBufRecycle(reply);
return ret;
}
ret = serv->dispatcher->Dispatch(&serv->object, LED_WRITE_READ, data, reply);
if (ret != HDF_SUCCESS)
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to send service call\n");
HdfSBufRecycle(data);
HdfSBufRecycle(reply);
return ret;
}
if (!HdfSbufReadInt32(reply, val))
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to get service call reply\n");
ret = HDF_ERR_INVALID_OBJECT;
HdfSBufRecycle(data);
HdfSBufRecycle(reply);
return ret;
}
HILOG_ERROR(HILOG_MODULE_ACE,"Get reply is: %d\n", val);

HdfSBufRecycle(data);
HdfSBufRecycle(reply);
return ret;
}
JSIValue AppModule::ToggleLed(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
{
HILOG_ERROR(HILOG_MODULE_ACE, "led button pressed.");
struct HdfIoService *serv = HdfIoServiceBind(LED_SERVICE);
if (serv == NULL)
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to get service2 %s\n", LED_SERVICE);
return JSI::CreateUndefined();
}
if ((args == nullptr) || (argsNum == 0) || (JSI::ValueIsUndefined(args[0]))) {
return JSI::CreateUndefined();
}
JSIValue success = JSI::GetNamedProperty(args[0], CB_SUCCESS);
JSIValue fail = JSI::GetNamedProperty(args[0], CB_FAIL);
JSIValue complete = JSI::GetNamedProperty(args[0], CB_COMPLETE);

int32_t num = (int32_t)JSI::GetNumberProperty(args[0], "code");

int32_t replyData = 0;

if (GpioWriteRead(serv, num, &replyData))
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to send event\n");
JSI::CallFunction(fail, thisVal, nullptr, 0);
JSI::CallFunction(complete, thisVal, nullptr, 0);
JSI::ReleaseValueList(success, fail, complete);
return JSI::CreateUndefined();
}
JSIValue result = JSI::CreateObject();
JSI::SetNumberProperty(result, "led_status", replyData);
JSIValue argv[ARGC_ONE] = {result};
JSI::CallFunction(success, thisVal, argv, ARGC_ONE);
JSI::CallFunction(complete, thisVal, nullptr, 0);
JSI::ReleaseValueList(success, fail, complete, result);

HdfIoServiceRecycle(serv);

return JSI::CreateUndefined();
}
  • 在foundation\ace\ace_engine_lite\ace_lite.gni中添加HDF頭文件路徑
ace_lite_include_dirs += [    
......
"http://drivers/framework/ability/sbuf/include",
"http://drivers/framework/include/core",
"http://drivers/framework/include/utils",
"http://drivers/adapter/uhdf/posix/include",
]
  • 添加編譯依賴
修改foundation\ace\ace_engine_lite\frameworks\BUILD.gn,在public_deps中添加以下代碼
"http://drivers/adapter/uhdf/manager:hdf_core",
修改foundation\ace\ace_engine_lite\test\ace_test_config.gni,在extra_deps中添加以下代碼
"http://drivers/adapter/uhdf/manager:hdf_core",

總結

  1. 基于JS擴展的類Web開發范式的方舟開發框架,采用經典的HML、CSS、JavaScript三段式開發方式。使用HML標簽文件進行布局搭建,使用CSS文件進行樣式描述,使用JavaScript文件進行邏輯處理。UI組件與數據之間通過單向數據綁定的方式建立關聯,當數據發生變化時,UI界面自動觸發更新。此種開發方式,更接近Web前端開發者的使用習慣,快速將已有的Web應用改造成方舟開發框架應用。主要適用于界面較為簡單的中小型應用開發;
  2. 通過appmodule調用framework層接口,然后通過framework接口調用Hdf接口。

這樣我們就有了自己的driver和配置,后面的章節我們會講如何在hap應用里調用驅動接口。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

責任編輯:jianghua 來源: 51CTO開源基礎軟件社區
相關推薦

2022-10-10 14:47:04

藍牙應用鴻蒙

2022-12-02 14:20:09

Tetris鴻蒙

2022-11-29 16:35:02

Tetris鴻蒙

2022-10-17 14:29:24

鴻蒙應用開發

2023-03-30 09:32:27

2022-11-14 17:01:34

游戲開發畫布功能

2023-02-27 16:30:32

鴻蒙開源協議分析

2023-03-30 09:19:54

SELinux安全子系統

2022-08-19 19:02:20

開源鴻蒙操作系統

2023-04-04 09:24:11

鴻蒙HiDumper

2022-12-09 15:34:38

2023-01-03 15:09:10

鴻蒙常用工具

2022-10-09 15:05:50

NAPI框架鴻蒙

2022-11-24 14:34:41

Hap程序鴻蒙

2022-12-06 15:39:16

鴻蒙主干代碼

2023-03-15 16:19:03

BinderIPC工具

2022-09-30 14:08:26

Hap應用鴻蒙

2022-11-03 15:47:04

HTTP通信協議

2022-11-08 15:43:45

開源鴻蒙藍牙協議棧

2022-10-31 15:35:02

Wi-Fi藍牙子系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产91亚洲一区二区三区www | 国产一区在线免费 | 99精品99久久久久久宅男 | 中文字幕国 | 国产一区二区在线播放 | 欧美激情欧美激情在线五月 | 色欧美综合 | 午夜99| 影音先锋中文字幕在线观看 | 特一级毛片 | 久久精品国产一区二区三区不卡 | 中文字幕在线观看视频网站 | 国产高清视频在线观看 | 欧美寡妇偷汉性猛交 | 日韩有码一区 | 91伊人| av黄色免费 | 老牛嫩草一区二区三区av | 99精品欧美一区二区蜜桃免费 | 成年视频在线观看福利资源 | 精精国产xxxx视频在线播放7 | 九九在线视频 | 天天干精品 | 九九热最新地址 | 久久久久成人精品免费播放动漫 | 国家一级黄色片 | 日韩免费一区 | 亚洲欧美综合 | 一本一道久久a久久精品综合蜜臀 | 婷婷99 | 91在线精品秘密一区二区 | 中文字幕一区二区三区四区五区 | 中文字幕av网 | 黄色大片在线播放 | 99亚洲精品视频 | 国产在线精品一区二区 | 日本一道本视频 | 亚洲第1页 | 在线观看第一页 | 欧美电影在线观看网站 | 日韩国产中文字幕 |