From 3c34b2343100838c3c6bf6a100dfb1f324d2dc01 Mon Sep 17 00:00:00 2001 From: lijie <1713699517@qq.com> Date: Thu, 23 Feb 2023 17:17:38 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 35 +++++++++++++++++++++++++++++ LICENSE | 21 ++++++++++++++++++ README.md | 9 ++++++++ c_src/HJpsNif/eHJps.c | 37 +++++++++++++++++++++++++++++++ c_src/HJpsNif/eHJpsAtom.h | 21 ++++++++++++++++++ c_src/HJpsNif/rebar.config | 8 +++++++ c_src/eNpc | Bin 0 -> 25947 bytes c_src/eNpc.cmd | 4 ++++ include/eHJps.hrl | 5 +++++ priv/eHJps.so | Bin 0 -> 20752 bytes rebar.config | 15 +++++++++++++ src/eHJps.app.src | 10 +++++++++ src/eHJps.erl | 44 +++++++++++++++++++++++++++++++++++++ src/user_default.erl | 4 ++++ 14 files changed, 213 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 c_src/HJpsNif/eHJps.c create mode 100644 c_src/HJpsNif/eHJpsAtom.h create mode 100644 c_src/HJpsNif/rebar.config create mode 100644 c_src/eNpc create mode 100644 c_src/eNpc.cmd create mode 100644 include/eHJps.hrl create mode 100644 priv/eHJps.so create mode 100644 rebar.config create mode 100644 src/eHJps.app.src create mode 100644 src/eHJps.erl create mode 100644 src/user_default.erl diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..798fb06 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +.eunit +*.o +*.beam +*.plt +erl_crash.dump +.concrete/DEV_MODE + +# rebar 2.x +.rebar +rel/example_project +ebin/* +deps + +# rebar 3 +.rebar3 +_build/ +_checkouts/ +rebar.lock + +# idea +.idea +*.iml +cmake-build* +CMakeLists.txt + +# nif compile temp file +*.pdb +*.d +compile_commands.json + +# vs +.vs +x64 +*.vcx* +*.sln \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..228cf38 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 AICells + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4a76aca --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +eHJps +===== + +An OTP Lib of hexagon jps implementation. + +设计模型 + nif 层采用单线程更新地图数据多线程寻路的模型 + erlang层相关请求采用队列模型 更新地图线程和寻路线程 分别从两个不同的任务队列获取新的请求并处理 + diff --git a/c_src/HJpsNif/eHJps.c b/c_src/HJpsNif/eHJps.c new file mode 100644 index 0000000..86ee3b5 --- /dev/null +++ b/c_src/HJpsNif/eHJps.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include + +#include "eHJpsAtom.h" + +typedef struct Node_r { + bool IsBarrier; // 是否障碍 +} Node; + +int nifLoad(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) { + enif_fprintf(stdout, "IMY*************nifload00000\n"); + NIF_ATOMS(NIF_ATOM_INIT) + + enif_fprintf(stdout, "IMY*************nifload00001\n"); + *priv_data = NULL; + + return 0; +} + +int nifUpgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info) { + *priv_data = *old_priv_data; + enif_fprintf(stdout, "IMY*************nifUpgrade %p %T\n", old_priv_data, load_info); + return 0; +} + +void nifUnload(ErlNifEnv* env, void* priv_data) { + enif_fprintf(stdout, "IMY*************nifUnload0000 \n"); + return; +} + +static ErlNifFunc nifFuns[] = { +}; + +ERL_NIF_INIT(eQuic, nifFuns, nifLoad, NULL, nifUpgrade, nifUnload) \ No newline at end of file diff --git a/c_src/HJpsNif/eHJpsAtom.h b/c_src/HJpsNif/eHJpsAtom.h new file mode 100644 index 0000000..86dea56 --- /dev/null +++ b/c_src/HJpsNif/eHJpsAtom.h @@ -0,0 +1,21 @@ +#ifndef __QUIC_ATOM_H_ +#define __QUIC_ATOM_H_ + +#include + +#define NIF_ATOM_DECL(a) ERL_NIF_TERM atom_ ## a; +#define NIF_ATOM_INIT(a) atom_ ## a = enif_make_atom(env, #a); + +#define NIF_ATOMS(A) \ + /* atom of common */ \ + A(ok) \ + A(quic) \ + A(error) \ + A(true) \ + A(false) \ + A(undefined) \ + A(freed) + +NIF_ATOMS(NIF_ATOM_DECL) + +#endif diff --git a/c_src/HJpsNif/rebar.config b/c_src/HJpsNif/rebar.config new file mode 100644 index 0000000..343df98 --- /dev/null +++ b/c_src/HJpsNif/rebar.config @@ -0,0 +1,8 @@ +{port_specs, [ + {"../../priv/eHJps.so", ["eHJps.c"]} +]}. + +{port_env, []}. + + + diff --git a/c_src/eNpc b/c_src/eNpc new file mode 100644 index 0000000000000000000000000000000000000000..419399f2de9c6b8090df1bb590ebc9a7c9329fd3 GIT binary patch literal 25947 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 literal 0 HcmV?d00001 diff --git a/c_src/eNpc.cmd b/c_src/eNpc.cmd new file mode 100644 index 0000000..6c7a1ca --- /dev/null +++ b/c_src/eNpc.cmd @@ -0,0 +1,4 @@ +@echo off +setlocal +set rebarscript=%~f0 +escript.exe "%rebarscript:.cmd=%" %* diff --git a/include/eHJps.hrl b/include/eHJps.hrl new file mode 100644 index 0000000..10d19ad --- /dev/null +++ b/include/eHJps.hrl @@ -0,0 +1,5 @@ +-ifndef(eHJps_H). +-define(eHJps_H, true). + + +-endif. \ No newline at end of file diff --git a/priv/eHJps.so b/priv/eHJps.so new file mode 100644 index 0000000000000000000000000000000000000000..6b7545e67d4a084f0e049d86057693d6eb8bcaff GIT binary patch literal 20752 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 literal 0 HcmV?d00001 diff --git a/rebar.config b/rebar.config new file mode 100644 index 0000000..900a6a4 --- /dev/null +++ b/rebar.config @@ -0,0 +1,15 @@ +{erl_opts, [no_debug_info, {i, "include"}]}. +{deps, [ + {eSync, ".*", {git, "http://sismaker.tpddns.cn:53000/SisMaker/eSync.git", {branch, "master"}}} +]}. + +{shell, [ + % {config, "config/sys.config"}, + {apps, [eHJps]} +]}. + +{pre_hooks, + [{"", compile, "escript c_src/eNpc compile"}]}. + +{post_hooks, + [{"", clean, "escript c_src/eNpc clean"}]}. \ No newline at end of file diff --git a/src/eHJps.app.src b/src/eHJps.app.src new file mode 100644 index 0000000..c570d83 --- /dev/null +++ b/src/eHJps.app.src @@ -0,0 +1,10 @@ +{application, eHJps, + [{description, "An library of hexagon jps"}, + {vsn, "0.1.0"}, + {registered, []}, + {applications, [kernel, stdlib, eSync]}, + {env,[]}, + {modules, []}, + {licenses, ["MIT"]}, + {links, []} + ]}. diff --git a/src/eHJps.erl b/src/eHJps.erl new file mode 100644 index 0000000..c100763 --- /dev/null +++ b/src/eHJps.erl @@ -0,0 +1,44 @@ +-module(eHJps). + +-include("eHJps.hrl"). + +-nifs ([ + initMap/1 + , updateMap/3 + , findPath/5 +]). + +-on_load(init/0). + +-export([ + initMap/1 + , updateMap/3 + , findPath/5 +]). + +init() -> + case code:priv_dir(?MODULE) of + {error, _} -> + case code:which(?MODULE) of + Filename when is_list(Filename) -> + SoName = filename:join([filename:dirname(Filename), "../priv", atom_to_list(?MODULE)]); + _ -> + SoName = filename:join("../priv", atom_to_list(?MODULE)) + end; + Dir -> + SoName = filename:join(Dir, atom_to_list(?MODULE)) + end, + erlang:load_nif(SoName, 0). + +-define(NOT_LOADED, erlang:nif_error({not_loaded, {module, ?MODULE}, {line, ?LINE}})). + +initMap(_Data) -> + ?NOT_LOADED. + +updateMap(_X, _Y, _NodeInfo) -> + ?NOT_LOADED. + +findPath(_StartX, _StartY, _EndX, _EndY, _UpdateInfo) -> + ?NOT_LOADED. + + diff --git a/src/user_default.erl b/src/user_default.erl new file mode 100644 index 0000000..60df348 --- /dev/null +++ b/src/user_default.erl @@ -0,0 +1,4 @@ +-module(user_default). + +-compile([export_all, nowarn_export_all]). +