自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

跟著小白一起學(xué)鴻蒙--JS應(yīng)用控制LED(十)

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

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

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

在《#跟著小白一起學(xué)鴻蒙# [九] 寫個(gè)簡(jiǎn)單的LED驅(qū)動(dòng)》我們熟悉了如何在開源鴻蒙開發(fā)驅(qū)動(dòng)應(yīng)用,并通過hdc工具拷貝至開發(fā)板運(yùn)行。在《#跟著小白一起學(xué)鴻蒙#[六]第一個(gè)hap應(yīng)用》的文章里我們學(xué)會(huì)如何用IDE工具編寫hap應(yīng)用并他通過IDE工具安裝至開發(fā)板運(yùn)行。我們學(xué)會(huì)了hap程序的開發(fā),但是hap程序是運(yùn)行在標(biāo)準(zhǔn)系統(tǒng)的應(yīng)用,對(duì)于輕量和小型系統(tǒng)我們應(yīng)該如何進(jìn)行開發(fā)呢?接下來我們需要學(xué)習(xí)下如何開發(fā)JS應(yīng)用。

輕量、小型系統(tǒng)JS應(yīng)用

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

#沖刺創(chuàng)作新星# #跟著小白一起學(xué)鴻蒙# [十] JS應(yīng)用控制LED-開源基礎(chǔ)軟件社區(qū)

詳細(xì)的內(nèi)容介紹在一下鏈接內(nèi)可以看到官方的說明:

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

此樣例參考小熊派設(shè)計(jì),使用小熊派HM_Micro開發(fā)板進(jìn)行驗(yàn)證。

JS-UI開發(fā)流程

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

創(chuàng)建工程配置工程增加LED程序添加JSAPI接口編譯運(yùn)行。

建立[Lite]Empty Ability。

#沖刺創(chuàng)作新星# #跟著小白一起學(xué)鴻蒙# [十] JS應(yīng)用控制LED-開源基礎(chǔ)軟件社區(qū)

配置工程。

#沖刺創(chuàng)作新星# #跟著小白一起學(xué)鴻蒙# [十] JS應(yīng)用控制LED-開源基礎(chǔ)軟件社區(qū)

工程結(jié)構(gòu)說明。

#沖刺創(chuàng)作新星# #跟著小白一起學(xué)鴻蒙# [十] JS應(yīng)用控制LED-開源基礎(chǔ)軟件社區(qū)

工程目錄主要在entry里,有以下內(nèi)容:

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

工程預(yù)覽。

#沖刺創(chuàng)作新星# #跟著小白一起學(xué)鴻蒙# [十] JS應(yīng)用控制LED-開源基礎(chǔ)軟件社區(qū)

添加按鍵功能控制LED燈。

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

<div class="rowcontainer">
<text class="content" if="{{statu == '0'}}">[狀態(tài):{{ $t('strings.ledoff') }}]</text>
<text class="content" if="{{statu == '1'}}">[狀態(tài):{{ $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()
},
}
  • 預(yù)覽

#沖刺創(chuàng)作新星# #跟著小白一起學(xué)鴻蒙# [十] JS應(yīng)用控制LED-開源基礎(chǔ)軟件社區(qū)

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

增加JS的API接口。

  • 在app_module.h里增加接口

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

  • 在app_module.cpp里增加接口實(shí)現(xiàn)
#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",

總結(jié)

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

這樣我們就有了自己的driver和配置,后面的章節(jié)我們會(huì)講如何在hap應(yīng)用里調(diào)用驅(qū)動(dòng)接口。

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

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

責(zé)任編輯:jianghua 來源: 51CTO開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2022-10-10 14:47:04

藍(lán)牙應(yīng)用鴻蒙

2022-10-17 14:29:24

鴻蒙應(yīng)用開發(fā)

2022-11-29 16:35:02

Tetris鴻蒙

2022-12-02 14:20:09

Tetris鴻蒙

2022-11-14 17:01:34

游戲開發(fā)畫布功能

2023-03-30 09:32:27

2023-04-04 09:24:11

鴻蒙HiDumper

2023-02-27 16:30:32

鴻蒙開源協(xié)議分析

2022-08-19 19:02:20

開源鴻蒙操作系統(tǒng)

2023-03-30 09:19:54

SELinux安全子系統(tǒng)

2022-12-09 15:34:38

2023-01-03 15:09:10

鴻蒙常用工具

2022-11-24 14:34:41

Hap程序鴻蒙

2022-12-06 15:39:16

鴻蒙主干代碼

2023-03-15 16:19:03

BinderIPC工具

2022-10-09 15:05:50

NAPI框架鴻蒙

2022-09-30 14:08:26

Hap應(yīng)用鴻蒙

2023-04-06 09:18:52

鴻蒙AVPlayerAVRecorder

2023-02-24 16:02:45

WebSocket網(wǎng)絡(luò)通訊協(xié)議

2022-11-28 15:42:39

分布式軟總線鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)