From caf209981a5ed499c6579404795eb3642627d607 Mon Sep 17 00:00:00 2001 From: chernov Date: Tue, 5 Mar 2024 12:10:53 +0300 Subject: [PATCH] Initial commit --- .gitignore | 1 + book.toml | 6 ++ src/01-introduction/README.md | 14 ++++ src/02-getting-started/01-setup.md | 75 ++++++++++++++++++ .../02-define-device-spec.md | 5 ++ src/02-getting-started/README.md | 25 ++++++ src/02-getting-started/setup.md | 1 + src/03-reference/README.md | 3 + src/03-reference/actions.md | 3 + src/03-reference/properties.md | 3 + src/04-advanced/README.md | 0 src/04-advanced/dev-build.md | 44 ++++++++++ .../images/publishToMavenLocal.png | Bin 0 -> 27059 bytes src/04-advanced/messages.md | 3 + src/04-advanced/tango-interop.md | 7 ++ src/04-advanced/work-with-c.md | 16 ++++ src/SUMMARY.md | 14 ++++ 17 files changed, 220 insertions(+) create mode 100644 .gitignore create mode 100644 book.toml create mode 100644 src/01-introduction/README.md create mode 100644 src/02-getting-started/01-setup.md create mode 100644 src/02-getting-started/02-define-device-spec.md create mode 100644 src/02-getting-started/README.md create mode 100644 src/02-getting-started/setup.md create mode 100644 src/03-reference/README.md create mode 100644 src/03-reference/actions.md create mode 100644 src/03-reference/properties.md create mode 100644 src/04-advanced/README.md create mode 100644 src/04-advanced/dev-build.md create mode 100644 src/04-advanced/images/publishToMavenLocal.png create mode 100644 src/04-advanced/messages.md create mode 100644 src/04-advanced/tango-interop.md create mode 100644 src/04-advanced/work-with-c.md create mode 100644 src/SUMMARY.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7585238 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +book diff --git a/book.toml b/book.toml new file mode 100644 index 0000000..99f68c3 --- /dev/null +++ b/book.toml @@ -0,0 +1,6 @@ +[book] +authors = ["chernov"] +language = "en" +multilingual = false +src = "src" +title = "Controls-kt" \ No newline at end of file diff --git a/src/01-introduction/README.md b/src/01-introduction/README.md new file mode 100644 index 0000000..aa55bb7 --- /dev/null +++ b/src/01-introduction/README.md @@ -0,0 +1,14 @@ +# Introduction + +
+🚧 Черновой вариант. Здесь нет осмысленного текста. только наброски. +
+ +Общие слова + + +## Key features +- async +- dynamic structures under the hood (to do not mess with tools like CORBA, Protobuf) +- interoperation with [Tango-CS](../advanced/tango-interop.md) + diff --git a/src/02-getting-started/01-setup.md b/src/02-getting-started/01-setup.md new file mode 100644 index 0000000..013c4c1 --- /dev/null +++ b/src/02-getting-started/01-setup.md @@ -0,0 +1,75 @@ +# Setting up the project +For quick start we provide a minimal working [boilerplate](https://github.com/kapot65/controls-kt-boilerplate) project with controls-kt. We are going to use it as a base for our tutorial. Follow the next preparation steps: +```shell +git clone https://github.com/kapot65/controls-kt-boilerplate.git +``` +After cloning you will have a project structure like this: +``` +controls-kt-boilerplate/ +├── build.gradle.kts +├── gradle.properties +├── README.md +├── settings.gradle.kts +└── src + ├── commonMain + │   └── kotlin + │   └── devices + │   └── IDemoDevice.kt + ├── jsMain + │   ├── kotlin + │   │   └── Main.kt + │   └── resources + │   └── index.html + └── jvmMain + └── kotlin + ├── devices + │   └── DemoDevice.kt + └── Server.kt +``` +This is a common kotlin mutliplatform project with enabled `jvm` and `js` targets and some controls-kt dependencies: +- ./src/commonMain/kotlin/devices/IDemoDevice.kt - contains a demo device interface and specification of its properties and actions. +- ./src/jvmMain/kotlin/devices/DemoDevice.kt - contains a demo device implementation. +- ./src/jvmMain/kotlin/Server.kt file contains a magix server with embed device manager with installed demo device. +- ./src/jsMain/kotlin/Main.kt - contains a simple controls-kt client example. + + + + +
🚧 Work in progress + +? WASM supported ? + +? What is the recommended way to use kotlin multiplatform project with controls-kt ? +
+ +In this section we are going to work with kotlin multiplatform project. + +If you plan to use only one platfrom (jvm/native/js) you can use regular kotlin project to simplify your SCADA architecture. + + + + + + + + + + diff --git a/src/02-getting-started/02-define-device-spec.md b/src/02-getting-started/02-define-device-spec.md new file mode 100644 index 0000000..5ed46ac --- /dev/null +++ b/src/02-getting-started/02-define-device-spec.md @@ -0,0 +1,5 @@ +# Define the device specification + + +## Device interface + diff --git a/src/02-getting-started/README.md b/src/02-getting-started/README.md new file mode 100644 index 0000000..1c29fd1 --- /dev/null +++ b/src/02-getting-started/README.md @@ -0,0 +1,25 @@ +This chapter contains step-by-step tutorial teaching you how to use basic controls-kt functionality: +- define device specification (device properties, actions) +- create controls-kt event loop +- read/write device properties +- execute device actions + +During this chapter we are going to create a simple device that simulates a simple attractor in 2D space defined by the following differential equations: +``` +dx/dt = y - ax^2 +dy/dt = -x - y +``` +The device will have the following properties: +- (x, y) - coordinates as current step +- a - parameter of the attractor +and the following action: +- reset - reset the coordinates + + +## Prerequisites +- Tutorial assumes that you use IntelliJ IDEA as your IDE as currently it's the only way to work with Kotlin Multiplatform projects. + + + + + \ No newline at end of file diff --git a/src/02-getting-started/setup.md b/src/02-getting-started/setup.md new file mode 100644 index 0000000..0f003ec --- /dev/null +++ b/src/02-getting-started/setup.md @@ -0,0 +1 @@ +# Setting up the project diff --git a/src/03-reference/README.md b/src/03-reference/README.md new file mode 100644 index 0000000..4cf1a4c --- /dev/null +++ b/src/03-reference/README.md @@ -0,0 +1,3 @@ +
+🚧 Work in progress +
\ No newline at end of file diff --git a/src/03-reference/actions.md b/src/03-reference/actions.md new file mode 100644 index 0000000..4cf1a4c --- /dev/null +++ b/src/03-reference/actions.md @@ -0,0 +1,3 @@ +
+🚧 Work in progress +
\ No newline at end of file diff --git a/src/03-reference/properties.md b/src/03-reference/properties.md new file mode 100644 index 0000000..4cf1a4c --- /dev/null +++ b/src/03-reference/properties.md @@ -0,0 +1,3 @@ +
+🚧 Work in progress +
\ No newline at end of file diff --git a/src/04-advanced/README.md b/src/04-advanced/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/04-advanced/dev-build.md b/src/04-advanced/dev-build.md new file mode 100644 index 0000000..aa4c515 --- /dev/null +++ b/src/04-advanced/dev-build.md @@ -0,0 +1,44 @@ +# Use the latest build from the development branch + +Currently controls-kt is under active development. If you want to use the latest build from the development branch, you can do the following steps: + +1. Clone the repository: + ```bash + git clone -b dev https://git.sciprog.center/kscience/controls-kt.git + ``` +2. Change the [version](https://git.sciprog.center/kscience/controls-kt/src/commit/5b655a9354de5ddb4be25ee9e6be876f14f10b87/build.gradle.kts#L16) in your `build.gradle.kts` file to new unique: + ```kotlin + allprojects { + // ... + version = "0.3.0-dev-6-19-02-24-local" + // ... + } + ``` +3. Execute `publishToMavenLocal` task: + ```bash + ./gradlew publishToMavenLocal + ``` + or from Idea Gradle panel: + + ![publishToMavenLocal](./images/publishToMavenLocal.png) + + Latest version of the library will be published to your local maven repository. +4. In your project add mavenLocal() to your repositories: + ```kotlin + repositories { + mavenLocal() + mavenCentral() + // ... + } + ``` +5. Add the dependencies you need using the unique version you set in p2: + ```kotlin + // ... + dependencies { + implementation("space.kscience:controls-core:0.3.0-dev-6-19-02-24-local") + // ... + } + // ... + ``` + + diff --git a/src/04-advanced/images/publishToMavenLocal.png b/src/04-advanced/images/publishToMavenLocal.png new file mode 100644 index 0000000000000000000000000000000000000000..b1bca15f843663bf01241ee3233b828901134afb GIT binary patch literal 27059 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 literal 0 HcmV?d00001 diff --git a/src/04-advanced/messages.md b/src/04-advanced/messages.md new file mode 100644 index 0000000..4cf1a4c --- /dev/null +++ b/src/04-advanced/messages.md @@ -0,0 +1,3 @@ +
+🚧 Work in progress +
\ No newline at end of file diff --git a/src/04-advanced/tango-interop.md b/src/04-advanced/tango-interop.md new file mode 100644 index 0000000..da3ecfa --- /dev/null +++ b/src/04-advanced/tango-interop.md @@ -0,0 +1,7 @@ +# Interoperability with Tango + +
+🚧 Work in progress +
+ + diff --git a/src/04-advanced/work-with-c.md b/src/04-advanced/work-with-c.md new file mode 100644 index 0000000..03722e8 --- /dev/null +++ b/src/04-advanced/work-with-c.md @@ -0,0 +1,16 @@ +# Work with c libraries + +
+🚧 Work in progress +
+ +Controls-kt can be used in kotlin native projects. As long as your devices drivers have c interface, you can controls-kt as SCADA system for your devices. + +## setting up kotlin native project +🚧 Work in progress + +## using c libraries in kotlin native +🚧 Work in progress + +drawbacks: +- even in final binaries is fully native you still need to have jvm installed on your machine to run gradle tasks \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md new file mode 100644 index 0000000..7a53a33 --- /dev/null +++ b/src/SUMMARY.md @@ -0,0 +1,14 @@ +# Summary + +- [Introduction](./01-introduction/README.md) +- [Getting started](./02-getting-started/README.md) + - [Setting up the project](./02-getting-started/01-setup.md) + - [Define device spec](./02-getting-started/02-define-device-spec.md) +- [Reference Guide](./03-reference/README.md) + - [Device Properties](./03-reference/properties.md) + - [Device Actions](./03-reference/actions.md) +- [Advanced usage](./04-advanced/README.md) + - [Use latest dev build](./04-advanced/dev-build.md) + - [Work with c](./04-advanced/work-with-c.md) + - [Interoperability with Tango](./04-advanced/tango-interop.md) + - [Message API](./04-advanced/messages.md) \ No newline at end of file