rust experiment
This commit is contained in:
26
ecgsyn-rs/site/package.json
Normal file
26
ecgsyn-rs/site/package.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "ecgsyn-site",
|
||||
"description": "description",
|
||||
"version": "1.0.0",
|
||||
"author": "John Luebs <john@luebs.org>",
|
||||
"license": "MIT",
|
||||
"main": "app/main.js",
|
||||
"scripts": {
|
||||
"build": "webpack --config webpack.config.js",
|
||||
"serve": "webpack serve --config webpack.config.js --open --mode development --devtool eval-source-map"
|
||||
},
|
||||
"dependencies": {
|
||||
"ecgsyn": "link:../pkg",
|
||||
"picnic": "^7.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"copy-webpack-plugin": "^12.0.2",
|
||||
"css-loader": "^7.1.2",
|
||||
"style-loader": "^4.0.0",
|
||||
"ts-loader": "^9.5.1",
|
||||
"typescript": "^5.6.3",
|
||||
"webpack": "^5.96.1",
|
||||
"webpack-cli": "^5.1.4",
|
||||
"webpack-dev-server": "^5.1.0"
|
||||
}
|
||||
}
|
||||
2844
ecgsyn-rs/site/pnpm-lock.yaml
generated
Normal file
2844
ecgsyn-rs/site/pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
4
ecgsyn-rs/site/src/custom.d.ts
vendored
Normal file
4
ecgsyn-rs/site/src/custom.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
declare module "*.css" {
|
||||
const content: any;
|
||||
export default content;
|
||||
}
|
||||
80
ecgsyn-rs/site/src/index.html
Normal file
80
ecgsyn-rs/site/src/index.html
Normal file
@@ -0,0 +1,80 @@
|
||||
<!doctype html>
|
||||
<html class="no-js" lang="">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="ie=edge" />
|
||||
<title>ECGSYN</title>
|
||||
<meta name="description" content="" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||||
<!-- Place favicon.ico in the root directory -->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<script src="./bundle.js"></script>
|
||||
<!--[if lt IE 8]>
|
||||
<p class="browserupgrade">
|
||||
You are using an <strong>outdated</strong> browser. Please
|
||||
<a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.
|
||||
</p>
|
||||
<![endif]-->
|
||||
|
||||
<div class="flex two">
|
||||
<div class="full">
|
||||
<canvas height="200"></canvas>
|
||||
</div>
|
||||
<div style="width: 5%">
|
||||
<label class="stack wlabel">
|
||||
<input name="stack" type="radio" />
|
||||
<span class="button toggle">P</span>
|
||||
</label>
|
||||
<label class="stack wlabel">
|
||||
<input name="stack" type="radio" />
|
||||
<span class="button toggle">Q</span>
|
||||
</label>
|
||||
<label class="stack wlabel">
|
||||
<input name="stack" type="radio" />
|
||||
<span class="button toggle">R</span>
|
||||
</label>
|
||||
<label class="stack wlabel">
|
||||
<input name="stack" type="radio" />
|
||||
<span class="button toggle">S</span>
|
||||
</label>
|
||||
<label class="stack wlabel">
|
||||
<input name="stack" type="radio" />
|
||||
<span class="button toggle">T</span>
|
||||
</label>
|
||||
</div>
|
||||
<div style="width: 95%">
|
||||
<article class="parameter-group">
|
||||
<div class="slider-group">
|
||||
<div class="slider-container">
|
||||
<label>θ (°)</label>
|
||||
<input type="range" min="-180" max="180" value="0" step="1" />
|
||||
<input class="value" type="number" min="-180" max="180" value="0" />
|
||||
</div>
|
||||
|
||||
<div class="slider-container">
|
||||
<label>a</label>
|
||||
<input type="range" min="-30" max="30" value="0" step="0.1" />
|
||||
<input class="value" type="number" min="-30" max="30" value="0" />
|
||||
</div>
|
||||
|
||||
<div class="slider-container">
|
||||
<label>b</label>
|
||||
<input type="range" min="0" max="1" value="0.5" step="0.01" />
|
||||
<input class="value" type="number" min="0" max="1" value="0.5" />
|
||||
</div>
|
||||
|
||||
<div class="slider-container">
|
||||
<label>θrf</label>
|
||||
<input type="range" min="0" max="0.5" value="0" step="0.01" />
|
||||
<input class="value" type="number" min="0" max="0.5" value="0" />
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
18
ecgsyn-rs/site/src/index.ts
Normal file
18
ecgsyn-rs/site/src/index.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import * as ecg from "ecgsyn";
|
||||
import "./styles.css";
|
||||
|
||||
//ecg.greet("WebAssembly with Penis!");
|
||||
let tp = new ecg.TimeParameters();
|
||||
|
||||
let rrprocess = new ecg.RrProcess(tp);
|
||||
let rrp = new ecg.RrParameters();
|
||||
|
||||
let series = rrprocess.generate_series(rrp);
|
||||
|
||||
let params = new ecg.Parameters(-0.4, 1.2, 0.0);
|
||||
params.push_extremum(new ecg.Extremum(0.0, 30, 0.1, 0.0));
|
||||
|
||||
let buffer = new ecg.Buffer();
|
||||
ecg.ecgsyn(params, series, buffer);
|
||||
(window as any).ecg = ecg;
|
||||
(window as any).buffer = buffer;
|
||||
68
ecgsyn-rs/site/src/styles.css
Normal file
68
ecgsyn-rs/site/src/styles.css
Normal file
@@ -0,0 +1,68 @@
|
||||
@import "picnic/picnic.css";
|
||||
|
||||
.wlabel {
|
||||
text-align: center;
|
||||
margin-bottom: 0.2em;
|
||||
}
|
||||
|
||||
.control-panel {
|
||||
max-width: 600px;
|
||||
margin: 20px auto;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.wave-selector {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
align-items: center;
|
||||
margin-bottom: 15px;
|
||||
padding: 15px;
|
||||
background: #f8f8f8;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.wave-selector label {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.wave-buttons {
|
||||
margin-left: auto;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.parameter-group {
|
||||
margin: 0 0;
|
||||
padding: 15px;
|
||||
background: #f8f8f8;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.slider-group {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.slider-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin: 5px 0;
|
||||
}
|
||||
|
||||
.slider-container label {
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.slider-container input[type="range"] {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.slider-container .value {
|
||||
width: 8em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
button.small {
|
||||
padding: 0.3em 0.7em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
22
ecgsyn-rs/site/tsconfig.json
Normal file
22
ecgsyn-rs/site/tsconfig.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES5",
|
||||
"module": "ES6",
|
||||
"jsx": "react",
|
||||
"moduleResolution": "Node",
|
||||
"outDir": "./dist/",
|
||||
"strict": true,
|
||||
"sourceMap": true,
|
||||
"declaration": true,
|
||||
"declarationDir": "./dist/types/",
|
||||
"noImplicitAny": true,
|
||||
"esModuleInterop": true,
|
||||
"downlevelIteration": true,
|
||||
"resolveJsonModule": true,
|
||||
"skipLibCheck": true,
|
||||
"isolatedModules": true,
|
||||
"isolatedDeclarations": true
|
||||
},
|
||||
"include": ["src"],
|
||||
"exclude": ["src/**/*.test.ts"]
|
||||
}
|
||||
34
ecgsyn-rs/site/webpack.config.js
Normal file
34
ecgsyn-rs/site/webpack.config.js
Normal file
@@ -0,0 +1,34 @@
|
||||
const CopyPlugin = require("copy-webpack-plugin");
|
||||
const path = require("path");
|
||||
|
||||
module.exports = {
|
||||
entry: "./src/index.ts",
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.css$/i,
|
||||
use: ["style-loader", "css-loader"],
|
||||
},
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
use: "ts-loader",
|
||||
exclude: /node_modules/,
|
||||
},
|
||||
],
|
||||
},
|
||||
resolve: {
|
||||
extensions: [".tsx", ".ts", ".js"],
|
||||
},
|
||||
output: {
|
||||
path: path.resolve(__dirname, "dist"),
|
||||
filename: "bundle.js",
|
||||
},
|
||||
experiments: {
|
||||
asyncWebAssembly: true,
|
||||
},
|
||||
plugins: [
|
||||
new CopyPlugin({
|
||||
patterns: [{ from: "src/index.html" }],
|
||||
}),
|
||||
],
|
||||
};
|
||||
Reference in New Issue
Block a user