From d77722a4fd51a26ffe751fdd33b2a090edfcad62 Mon Sep 17 00:00:00 2001 From: "Martin.Otter@dlr.de" Date: Thu, 7 Jul 2022 13:06:33 +0200 Subject: [PATCH] Improvements --- .github/workflows/test.yml | 40 + Project.toml | 2 +- .../images/sigTable-line-plots - Kopie.png | Bin 41376 -> 0 bytes docs/src/index.md | 10 + examples/fileIO/CSV_ReadFromFile.jl | 15 + examples/fileIO/JSON_WriteToFile.jl | 13 +- examples/fileIO/JSON_WriteToString.jl | 9 +- examples/fileIO/Rotational_First.csv | 2003 +++++++++++++++++ examples/fileIO/_include_all.jl | 4 + src/ExampleSignalTables.jl | 2 +- src/NoPlot.jl | 2 + src/PlotPackageDefinition.jl | 6 +- src/SignalTableFunctions.jl | 42 +- src/SignalTables.jl | 4 +- src/SilentNoPlot.jl | 2 + test/include_all.jl | 1 + 16 files changed, 2124 insertions(+), 31 deletions(-) create mode 100644 .github/workflows/test.yml delete mode 100644 docs/resources/images/sigTable-line-plots - Kopie.png create mode 100644 examples/fileIO/CSV_ReadFromFile.jl create mode 100644 examples/fileIO/Rotational_First.csv create mode 100644 examples/fileIO/_include_all.jl diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..29670c0 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,40 @@ +name: Run tests + +env: + JULIA_NUM_THREADS: 4 +on: + pull_request: + branches: + - main +jobs: + test: + name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + version: + - '1.7.3' + os: + - ubuntu-latest + - windows-latest + arch: + - x64 + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: ${{ matrix.version }} + arch: ${{ matrix.arch }} + - uses: actions/cache@v1 + env: + cache-name: cache-artifacts + with: + path: ~/.julia/artifacts + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} + restore-keys: | + ${{ runner.os }}-test-${{ env.cache-name }}- + ${{ runner.os }}-test- + ${{ runner.os }}- + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 diff --git a/Project.toml b/Project.toml index cb8b6e9..b1dc6e2 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "SignalTables" uuid = "3201582d-3078-4276-ba5d-0a1254d79d7c" authors = ["Martin.Otter@dlr.de "] -version = "0.3.4" +version = "0.3.5" [deps] DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" diff --git a/docs/resources/images/sigTable-line-plots - Kopie.png b/docs/resources/images/sigTable-line-plots - Kopie.png deleted file mode 100644 index 8e53c08c53cf4e19a72f413a4eb086eb80f9bea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41376 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 Var(values= t, unit="s", independent=true), "load.r" => Var(values= [sin.(t) cos.(t) sin.(t)], unit="m"), "motor.angle" => Var(values= sin.(t), unit="rad", state=true, der="motor.w"), - "motor.w" => Var(values= cos.(t), unit="rad/s"), + "motor.w" => Var(values= cos.(t), unit="rad/s", state=true, start=1.0u"rad/s"), "motor.w_ref" => Var(values= 0.9*[sin.(t) cos.(t)], unit = ["rad", "1/s"], info="Reference angle and speed"), "wm" => Var(alias = "motor.w"), diff --git a/src/NoPlot.jl b/src/NoPlot.jl index 58538ec..de2aaa7 100644 --- a/src/NoPlot.jl +++ b/src/NoPlot.jl @@ -3,6 +3,8 @@ module NoPlot +export plot, showFigure, saveFigure, closeFigure, closeAllFigures + include("AbstractPlotInterface.jl") plot(signalTable, names::AbstractMatrix; heading::AbstractString="", grid::Bool=true, xAxis="time", diff --git a/src/PlotPackageDefinition.jl b/src/PlotPackageDefinition.jl index 0e08d7a..96e294f 100644 --- a/src/PlotPackageDefinition.jl +++ b/src/PlotPackageDefinition.jl @@ -19,7 +19,7 @@ macro usingPlotPackage() elseif PlotPackage == "NoPlot" @goto USE_NO_PLOT elseif PlotPackage == "SilentNoPlot" - expr = :( import SignalTables.SilentNoPlot: plot, showFigure, saveFigure, closeFigure, closeAllFigures ) + expr = :( using SignalTables.SilentNoPlot ) return esc( expr ) else PlotPackage = Symbol("SignalTablesInterface_" * PlotPackage) @@ -36,7 +36,7 @@ macro usingPlotPackage() elseif PlotPackage == "NoPlot" @goto USE_NO_PLOT elseif PlotPackage == "SilentNoPlot" - expr = :( import SignalTables.SilentNoPlot: plot, showFigure, saveFigure, closeFigure, closeAllFigures ) + expr = :( using SignalTables.SilentNoPlot ) return esc( expr ) else PlotPackage = Symbol("SignalTablesInterface_" * PlotPackage) @@ -51,7 +51,7 @@ macro usingPlotPackage() end @label USE_NO_PLOT - expr = :( using SignalTables.SilentNoPlot: plot, showFigure, saveFigure, closeFigure, closeAllFigures ) + expr = :( using SignalTables.SilentNoPlot ) println("$expr") return esc( expr ) end diff --git a/src/SignalTableFunctions.jl b/src/SignalTableFunctions.jl index a460612..efe5765 100644 --- a/src/SignalTableFunctions.jl +++ b/src/SignalTableFunctions.jl @@ -684,6 +684,11 @@ function encodeSignalTable(signalTable; signalNames=nothing) end for name in signalNames signal = getSignal(signalTable, name) + if haskey(signal, :alias) + signal = copy(signal) + delete!(signal, :values) + delete!(signal, :value) + end encodedSignal = encodeSignalTableElement(name, signal) if !isnothing(encodedSignal) jdict[name] = encodedSignal @@ -726,22 +731,43 @@ function encodeSignalTableElement(path, element) end elseif typeof(element) <: AbstractArray && (elementBaseType(eltype(element)) <: Number || elementBaseType(eltype(element)) <: String) - if ndims(element) == 1 && string(elementBaseType(eltype(element))) in TypesWithoutEncoding + if ndims(element) == 1 && string(eltype(element)) in TypesWithoutEncoding return element end - jdict = OrderedDict{String,Any}("_class" => "Array", - "eltype" => string(eltype(element)), - "size" => Int[i for i in size(element)], - "values" => reshape(element, length(element))) + elunit = unitAsParseableString(element) + if elunit == "" + jdict = OrderedDict{String,Any}("_class" => "Array", + "eltype" => string(eltype(element)), + "size" => Int[i for i in size(element)], + "layout" => "column-major", + "values" => reshape(element, length(element))) + else + element = ustrip.(element) + jdict = OrderedDict{String,Any}("_class" => "Array", + "unit" => elunit, + "eltype" => string(eltype(element)), + "size" => Int[i for i in size(element)], + "layout" => "column-major", + "values" => reshape(element, length(element))) + end return jdict elseif string(typeof(element)) in TypesWithoutEncoding return element elseif typeof(element) <: Number - jdict = OrderedDict{String,Any}("_class" => "Number", - "type" => typeof(element), - "value" => element) + elunit = unitAsParseableString(element) + if elunit == "" + jdict = OrderedDict{String,Any}("_class" => "Number", + "type" => typeof(element), + "value" => element) + else + element = ustrip.(element) + jdict = OrderedDict{String,Any}("_class" => "Number", + "unit" => elunit, + "type" => typeof(element), + "value" => element) + end return jdict else diff --git a/src/SignalTables.jl b/src/SignalTables.jl index 4e7d71f..60b9d58 100644 --- a/src/SignalTables.jl +++ b/src/SignalTables.jl @@ -1,8 +1,8 @@ module SignalTables const path = dirname(dirname(@__FILE__)) -const version = "0.3.2" -const version_SignalTable_JSON = "0.3.1" # version tag to be stored in JSON files +const version = "0.3.5" +const version_SignalTable_JSON = "0.3.5" # version tag to be stored in JSON files using OrderedCollections using Unitful diff --git a/src/SilentNoPlot.jl b/src/SilentNoPlot.jl index d022a9e..1661b0e 100644 --- a/src/SilentNoPlot.jl +++ b/src/SilentNoPlot.jl @@ -3,6 +3,8 @@ module SilentNoPlot +export plot, showFigure, saveFigure, closeFigure, closeAllFigures + include("AbstractPlotInterface.jl") plot(signalTable, names::AbstractMatrix; heading::AbstractString="", grid::Bool=true, xAxis="time", diff --git a/test/include_all.jl b/test/include_all.jl index addcd9f..25e3127 100644 --- a/test/include_all.jl +++ b/test/include_all.jl @@ -5,6 +5,7 @@ include("SignalTableFunctions/test_DataFrames.jl") include("SignalTableFunctions/test_json.jl") include("../examples/plots/_include_all.jl") +include("../examples/fileIO/_include_all.jl") #= include("LinePlots/test_06_OneScalarMeasurementSignal.jl")