rust experiment

This commit is contained in:
2024-11-15 22:03:51 -06:00
parent 2fc47b2554
commit 04e5d24cab
17 changed files with 4183 additions and 22 deletions

View 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

File diff suppressed because it is too large Load Diff

4
ecgsyn-rs/site/src/custom.d.ts vendored Normal file
View File

@@ -0,0 +1,4 @@
declare module "*.css" {
const content: any;
export default content;
}

View 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>

View 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;

View 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;
}

View 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"]
}

View 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" }],
}),
],
};