455455struct Parameter{T <: Real }
456456 data:: Vector{T}
457457 ref:: T
458+ circular_buffer:: Bool
459+ end
460+
461+ Parameter (data:: Vector{T} , ref:: T ) where {T <: Real } = Parameter (data, ref, true )
462+ Parameter (x:: Parameter ) = x
463+ function Parameter (x:: T ; tofloat = true ) where {T <: Real }
464+ if tofloat
465+ x = float (x)
466+ P = typeof (x)
467+ else
468+ P = T
469+ end
470+
471+ return Parameter (P[], x)
458472end
459473
460474function Base. isequal (x:: Parameter , y:: Parameter )
@@ -501,18 +515,6 @@ function Base.show(io::IO, m::MIME"text/plain", p::Parameter)
501515 end
502516end
503517
504- Parameter (x:: Parameter ) = x
505- function Parameter (x:: T ; tofloat = true ) where {T <: Real }
506- if tofloat
507- x = float (x)
508- P = typeof (x)
509- else
510- P = T
511- end
512-
513- return Parameter (P[], x)
514- end
515-
516518function get_sampled_data (t, memory:: Parameter{T} ) where {T}
517519 if t < 0
518520 t = zero (t)
@@ -536,9 +538,15 @@ function get_sampled_data(t, memory::Parameter{T}) where {T}
536538 return x1
537539 else
538540 n = length (memory. data)
539- if i2 > n
540- i2 = n
541- i1 = i2 - 1
541+
542+ if memory. circular_buffer
543+ i1 = (i1 - 1 ) % n + 1
544+ i2 = (i2 - 1 ) % n + 1
545+ else
546+ if i2 > n
547+ i2 = n
548+ i1 = i2 - 1
549+ end
542550 end
543551
544552 t2 = (i2 - 1 ) * memory. ref
@@ -566,12 +574,6 @@ function Symbolics.derivative(::typeof(get_sampled_data), args::NTuple{2, Any},
566574 first_order_backwards_difference (t, memory)
567575end
568576
569- SampledData (T:: Type ; name) = SampledData (T[], zero (T); name)
570- SampledData (dt:: T ) where {T <: Real } = SampledData (T[], dt; name)
571- function SampledData (data:: Vector{T} , dt:: T ; name) where {T <: Real }
572- SampledData (; name, buffer = Parameter (data, dt))
573- end
574-
575577"""
576578 SampledData(; name, buffer)
577579
@@ -599,6 +601,16 @@ data input component.
599601end
600602@deprecate Input SampledData
601603
604+ function SampledData (T:: Type , circular_buffer = true ; name)
605+ SampledData (T[], zero (T), circular_buffer; name)
606+ end
607+ function SampledData (dt:: T , circular_buffer = true ) where {T <: Real }
608+ SampledData (T[], dt, circular_buffer; name)
609+ end
610+ function SampledData (data:: Vector{T} , dt:: T , circular_buffer = true ; name) where {T <: Real }
611+ SampledData (; name, buffer = Parameter (data, dt, circular_buffer))
612+ end
613+
602614Base. convert (:: Type{T} , x:: Parameter{T} ) where {T <: Real } = x. ref
603615
604616# Beta Code for potential AE Hack ----------------------
0 commit comments