Use Hongmeng para desenvolver aplicativos de IA (8) Estrutura JS para acessar a camada do kernel

Prefácio

Como mencionado da última vez, a eficiência de desenvolvimento do uso de `C++` para escrever a interface `UI` não é tão alta quanto a de `JS+HTML`, mas o desenvolvimento de dispositivos inevitavelmente requer a operação do hardware por meio do estado do kernel. Aqui devemos primeiro livre-se do problema de `JS A conexão entre a estrutura e o driver de dispositivo. Este capítulo é baseado nas tecnologias de `driver HDF` e `JS+CSS+HTML`. Para conteúdo relacionado, você pode revisar ` Desenvolvendo aplicativos de IA com Hongmeng (5) driver HDF fill light` e ` Desenvolvendo aplicativos de IA com Hongmeng ( 6) UI' `Estes dois artigos.

Princípios da estrutura de desenvolvimento de aplicativos JS

No sexto artigo, vivenciamos JSo processo de utilização da interface de desenvolvimento, aqui está uma análise simples acedo princípio de implementação.

Vejamos primeiro o diagrama da estrutura: aplicativos da Web, como pequenos programas js bundle, são primeiro compilados em pacotes e JS Data bindingo mapeamento de objetos é obtido por meio deles. ObserverUm modelo MVVC minimalista é implementado, usado para dividir os DOMobjetos acima em 4 tipos (renderização, dados, folha de estilo, função).O mecanismo de sequestro de dados é usado para montá-los na função de protótipo do observador, respectivamente, e convertê-los em funções.implementar C++.

Se você olhar o código-fonte, descobrirá que JSa parte é minimalista, o mecanismo JS a utiliza JerryScripte cada tag corresponde a uma C++classe Component. A maioria das funções são realmente C++implementadas, incluindo registro e acionamento de eventos, roteamento de páginas, atualizações de controle, tempos limite, operações de arquivos, saída de linha de comando, etc... O encaixe 100% de todas as APIs me lembra um desenho animado.

C++É muito mais conveniente depois de entrar no domínio. Neste momento ACE, você ainda está no modo de usuário e pode HDFusar o mecanismo de mensagem para acessar o kernel. Nada mais é do que uma operação matryoshka envolvida em outra camada de API.

Módulo integrado

Há uma série @system.xxxde módulos que fornecem recursos de dispositivo para acessar APP, Roteador, Áudio, Sensor, etc. ohos_module_config.hDefine JS框架o relacionamento correspondente entre o alias do módulo e a função de inicialização do módulo. Entre eles app, dfxo routermódulo é obrigatório.

// Config information for built-in JS modules of OHOS platform
const Module OHOS_MODULES[] = {
#ifdef ENABLE_MODULE_REQUIRE_TEST
    {"sample", InitSampleModule},
#endif
    {"app", InitAppModule},
#ifdef FEATURE_MODULE_AUDIO
    {"audio", InitAudioModule},
#endif // FEATURE_MODULE_AUDIO
    {"dfx", InitDfxModule},
    {"router", InitRouterModule},
#ifdef ENABLE_MODULE_CIPHER
    {"cipher", InitCipherModule},
#endif
};

Implementar módulo ace

Após apresentar o conhecimento prévio, você pode encapsular as funções do módulo ace customizado de acordo com a complexidade do negócio. Para simplificar a operação, montamos a operação diretamente appno módulo integrado.

1. Defina arquivos de cabeçalho

Modifique foundation/ace/frameworks/lite/src/core/modules/app_module.h, adicione ToggleLedfunções e inicialize.

namespace OHOS {
namespace ACELite {
class AppModule final : public MemoryHeap {
public:
    static JSIValue ToggleLed(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum);

void InitAppModule(JSIValue exports)
{
    JSI::SetModuleAPI(exports, "getInfo", AppModule::GetInfo);
    JSI::SetModuleAPI(exports, "terminate", AppModule::Terminate);
    JSI::SetModuleAPI(exports, "toggleLed", AppModule::ToggleLed);
}
} // namespace ACELite
} // namespace OHOS
#endif // OHOS_ACELITE_APP_MODULE_H

2. Ligue para o driver HDF

Participe foundation/ace/frameworks/lite/src/core/modules/app_module.cpp,

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"

#define LED_WRITE_READ 1
#define LED_SERVICE "led_service"

JSIValue AppModule::ToggleLed(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
{
    HILOG_ERROR(HILOG_MODULE_ACE, "led button pressed.");
    printf("led button pressed\n");

    struct HdfIoService *serv = HdfIoServiceBind(LED_SERVICE, 0);
    if (serv == NULL)
    {
        printf("fail to get service %s\n", LED_SERVICE);
        return JSI::CreateUndefined();
    }

    static struct HdfDevEventlistener listener = {
        .callBack = OnDevEventReceived,c
        .priv = (void *)"Service0"};

    if (HdfDeviceRegisterEventListener(serv, &listener) != HDF_SUCCESS)
    {
        printf("fail to register event listener\n");
        return JSI::CreateUndefined();
    }

    const char *send_cmd = "toggle LED";

    if (SendEvent(serv, send_cmd))
    {
        printf("fail to send event\n");
        return JSI::CreateUndefined();
    }

    if (HdfDeviceUnregisterEventListener(serv, &listener))
    {
        printf("fail to  unregister listener\n");
        return JSI::CreateUndefined();
    }

    HdfIoServiceRecycle(serv);

    return JSI::CreateUndefined();
}

3. Configure o caminho do arquivo de cabeçalho HDF

Reverfoundation/ace/frameworks/lite/src/core/modules/BUILD.gn

include_dirs = [
    "presets",
    "maplejs",
    "//test/lite/testservice/include",
    "//vendor/huawei/watchgt/devkit/hal/include",
	"//foundation/distributedschedule/interfaces/innerkits/samgr_lite/communication/mpc/transport",
    "//foundation/distributedschedule/interfaces/innerkits/samgr_lite/communication/mpc",
    
    "//drivers/hdf/lite/include/host",
    "$HDF_FRAMEWORKS/ability/sbuf/include",        
    "$HDF_FRAMEWORKS/core/shared/include",
    "$HDF_FRAMEWORKS/core/host/include",
    "$HDF_FRAMEWORKS/core/master/include",
    "$HDF_FRAMEWORKS/include/core",
    "$HDF_FRAMEWORKS/include/utils",
    "$HDF_FRAMEWORKS/utils/include",
    "$HDF_FRAMEWORKS/include/osal",
    "$HDF_FRAMEWORKS/adapter/syscall/include",
    "$HDF_FRAMEWORKS/adapter/vnode/include",
]

Reverfoundation/ace/frameworks/lite/BUILD.gn

config("ace_lite_config") {
  include_dirs = [
  ...
  ]
  
  include_dirs += [
    "//drivers/hdf/lite/include/host",
    "$HDF_FRAMEWORKS/ability/sbuf/include",        
    "$HDF_FRAMEWORKS/core/shared/include",
    "$HDF_FRAMEWORKS/core/host/include",
    "$HDF_FRAMEWORKS/core/master/include",
    "$HDF_FRAMEWORKS/include/core",
    "$HDF_FRAMEWORKS/include/utils",
    "$HDF_FRAMEWORKS/utils/include",
    "$HDF_FRAMEWORKS/include/osal",
    "$HDF_FRAMEWORKS/adapter/syscall/include",
    "$HDF_FRAMEWORKS/adapter/vnode/include",
  ]
}
shared_library("ace_lite") {
      
  public_deps = [
    "//base/security/frameworks/crypto_lite/js/builtin:ace_kit_cipher",
    "//foundation/graphic/lite/frameworks/surface:surface",
    "//foundation/multimedia/frameworks/camera_lite:camera",
    "//foundation/multimedia/frameworks/player_lite:player",
    "//foundation/multimedia/interfaces/kits/player_lite/js/builtin:audio_api",
    "//third_party/bounds_checking_function:libsec_shared",
    "//third_party/cJSON:cjson_shared",
    "//third_party/jerryscript/jerry-core:jerry-core_shared",
    "//third_party/jerryscript/jerry-ext:jerry-ext_shared",
    "//third_party/jerryscript/jerry-libm:jerry-libm_shared",
    "//third_party/jerryscript/jerry-port/default:jerry-port-default_shared",
    "//utils/native/lite/js/builtin:ace_utils_kits",
    "//utils/native/lite/timer_task:ace_kit_timer",

    "//drivers/hdf/lite/manager:hdf_core",
    "//drivers/hdf/lite/adapter/osal/posix:hdf_posix_osal",
  ]
}

4. Compilar e gravar

python build.py my_hi3516dv300 -b debug

Quando se trata de HDFdrivers e ACEframeworks, o arquivo de imagem deve ser gravado completamente novamente.

Desenvolver programa de interface

1. Configure a interface do módulo

Anteriormente, appadicionamos funções ao módulo integrado taggleLed, que DevEco Studionão pode ser obtido diretamente para Python, portanto, precisamos apiprimeiro adicionar uma interface.

Modificar \Huawei\Sdk\js\2.0.1.93\api\smartVision\@system.app.d.tsarquivos

export default class App {
  /**
   * Obtains the declared information in the config.json file of an application.
   */
  static getInfo(): IAppInfo;

  /**
   * Destroys the current ability.
   */
  static terminate(): void;
  
  /**
   * 翻转Led
   */
  static toggleLed(): void;
}

2. Gatilho de página

Aqui UI篇usamos um evento deslizante no programa anterior para acionar a operação de inversão do Led.

Reverentry/src/main/js/default/pages/index/index.js

swiperChange (e) {
    this.swiperPage = e.index;
    if(e.index == 0){
        this.iconcheckedColor = '#ffffff';
        this.iconUncheckedColor = '#262626';
    }else{
        this.iconcheckedColor = '#262626';
        this.iconUncheckedColor = '#ffffff';
    }
    // 调用翻转Led函数
    app.toggleLed();
}

O toggleLednome da função deve corresponder ao nome da string definido aceno registro de inicialização do módulo anterior .JSI::SetModuleAPI

3. Empacotar no Hap

Empacote o aplicativo como HaprenomeadoMyUILed.hap

4. Instale no dispositivo

Para o nfsdiretório de mapeamento específico, consulte o capítulo anterior.

mkdir nfs
mount 192.168.1.52:/nfs /nfs nfs
cd nfs
./dev_tools/bin/bm set -s disable
./dev_tools/bin/bm install -p MyUILed.hap

5. Execute o programa

Deslize a interface principal e veja Led灯a opção, o que significa que o programa está sendo executado com sucesso.

Para resumir brevemente todo o processo,

  • Página principal index, import app from '@system.app'módulo de importação;

  • Chamado em um evento app.toggleLed();para iniciar uma operação;

  • Por JS框架embalagem MyUILed.hap(essencialmente um pacote zip);

  • Depois de instalado no dispositivo, ele é descompactado e restaurado em formato JS代码;

  • A estrutura no dispositivo acepassa JSI::SetModuleAPIe JS代码as palavras-chave são "toggleLed"mapeadas para as C++funções correspondentes AppModule::ToggleLed;

  • AppModule::ToggleLedEncontrado na função LED_SERVICE, enviar HDFmensagem

  • Depois que o driver no kernel HDFrecebe a mensagem, ele realmente a executa LED翻转操作.

Neste ponto, podemos ter o melhor dos dois mundos: podemos não apenas construir UIpeças bonitas com eficiência em um pequeno programa, mas também acessar C++com eficiência as funções subjacentes do dispositivo, o que AIabre caminho para um grande número de tarefas subsequentes. cálculos intensivos.

Download

Documentos e informações relevantes para este problema podem ser encontrados na conta pública “Deep Awakening” e responda: “ohos08” em segundo plano para obter o link de download.

Visualização do próximo artigo

DevEco Device Tools 2.0 atualizado recentemente,

Integra muitos comandos hpm e hos,

No próximo artigo, vamos testar primeiro a nova versão da ferramenta de gravação.

Fique atento...

Recomendado no passado

Acho que você gosta

Origin blog.csdn.net/weixin_47479625/article/details/113733673
Recomendado
Clasificación