Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a40c632
feat: add jobController state machine
AryanP281 Jul 1, 2026
9b4ddf9
feat: add assemblyController state machine
AryanP281 Jul 1, 2026
9ee45ea
feat: add belt state machine
AryanP281 Jul 1, 2026
8331b65
feat: add arm state machine
AryanP281 Jul 1, 2026
b80c86d
feat: add messageProcessor state machine
AryanP281 Jul 1, 2026
af89e88
feat: add monitor state machine
AryanP281 Jul 1, 2026
e55a0e5
feat: add event declarations
AryanP281 Jul 1, 2026
0a6594f
feat: add service declarations
AryanP281 Jul 1, 2026
f2ab438
feat: add persistent variable declarations
AryanP281 Jul 1, 2026
59241d9
feat: add main.pkl
AryanP281 Jul 1, 2026
3e14f3e
refactor: match pkl standards
AryanP281 Jul 1, 2026
19bf805
refactor: update manual pickup event name
AryanP281 Jul 9, 2026
643af0a
revert: pickup event name
AryanP281 Jul 9, 2026
86ae4c4
refactor: fix comment
AryanP281 Jul 9, 2026
86e5826
fix: add timer based retrying of service invocations to fix deadlock …
AryanP281 Aug 10, 2026
cd03054
feat: simulate queuing of arrived parts
AryanP281 Aug 13, 2026
316bfc6
fix: message logging
AryanP281 Aug 13, 2026
4b3c47f
fix: switch waitingParts data type to long
AryanP281 Aug 17, 2026
cf60795
fix: add bound check for waitingPartsUpdate
AryanP281 Aug 17, 2026
5529b57
chore: remove retry timers
AryanP281 Aug 25, 2026
9b7d6b6
chore: remove unused event declarations
AryanP281 Aug 25, 2026
f15da27
fix: add condition to prevent overflow of waiting parts counter
AryanP281 Aug 25, 2026
a3b7857
chore: update service host
AryanP281 Sep 17, 2026
436ec01
chore: update service host
AryanP281 Sep 18, 2026
acdbf7f
chore: update partsPerProduct for part assembly throughput experiment
AryanP281 Sep 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions .idea/Cirrina-CSML-SmartFactory.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/ktfmt.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

203 changes: 203 additions & 0 deletions smartFactory/arm.pkl
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
import
"https://raw.githubusercontent.com/CollaborativeStateMachines/Cirrina/refs/heads/develop/src/main/resources/pkl/csm/csml.pkl"

import "events.pkl" as Events
import "serviceTypes.pkl" as ServiceTypes
import "variables.pkl" as Vars

armFSM = new csml.StateMachine {
transient {
["pickupSuccess"] = "true"
["errorMsg"] = "''"
["partsAssembled"] = "0"
["partsPerProduct"] = "1000"
}

states {
["idleState"] = new csml.Initial {
entry {
new csml.Match {
cases {
new csml.Case {
of = "!pickupSuccess"
yields {
new csml.Emit { event = new csml.Internal { topic = Events.ePickupNotSuccess } }
}
}
}
}
}

on {
[Events.eJobDone] {
to = "jobDoneState"
}
[Events.eArmPickup] {
to = "pickupState"
provided = "!\(Vars.vIsJobDone)"
}
[Events.ePickupNotSuccess] {
to = "pickupState"
}
}
}

["pickupState"] {
entry {
new csml.Invoke {
type = ServiceTypes.stPickup
}
}

on {
[Events.eUpdatePickupStatus] {
yields {
new csml.Eval { expression = "pickupSuccess = $success" }
new csml.Match {
cases {
new csml.Case {
of = "$success"
yields {
new csml.Emit {
event { topic = Events.ePickedUp }
}
}
}
}
default = new csml.Eval { expression = "errorMsg = 'Pickup failed...'" }
}
new csml.Emit { event = new csml.Internal { topic = Events.eCheckPickUpSuccess } }
}
}

[Events.eCheckPickUpSuccess] {
to = "assembleState"
provided = "pickupSuccess"
or = "errorState"
}
}
}

["errorState"] {
entry {
new csml.Emit {
event {
topic = Events.eProcessMessage
data { ["msg"] = "'Fatal robotic arm failure: ' + errorMsg" }
}
target = "'messageProcessor'"
}
}

after {
["pickupRetryTimeout"] {
delay = "2000"
triggers = new csml.Emit { event = new csml.Internal { topic = Events.eRetry } }
}
}

on {
[Events.eRetry] {
to = "assembleState"
provided = "pickupSuccess"
or = "returnState"
}

[Events.eUpdatePickupStatus] {
yields {
new csml.Eval { expression = "pickupSuccess = $success" }
}
}

[Events.eJobDone] {
to = "jobDoneState"
}
}
}

["assembleState"] {
entry {
new csml.Invoke {
type = ServiceTypes.stAssemble
}
}

on {
[Events.eCheckAssembleSuccess] {
yields {
new csml.Match {
cases {
new csml.Case {
of = "$success"
yields {
new csml.Emit {
event = new csml.Internal { topic = Events.eAssemblySuccessful }
}
}
}
new csml.Case {
of = "!($success)"
yields {
new csml.Emit {
event = new csml.Internal { topic = Events.eAssemblyUnsuccessful }
}
}
}
}
}
}
}

[Events.eAssemblySuccessful] {
to = "returnState"
yields {
new csml.Eval { expression = "partsAssembled = partsAssembled + 1" }
new csml.Emit {
event { topic = Events.eAssemblyComplete }
target = "'monitor'"
}
}
}

[Events.eAssemblyUnsuccessful] {
to = "errorState"
yields {
new csml.Eval { expression = "errorMsg = 'Assemble failed...'" }
}
}
}
}

["returnState"] {
entry {
new csml.Invoke {
type = ServiceTypes.stReturnToStart
}
}

on {
[Events.eResetArm] {
to = "idleState"
yields {
new csml.Match {
cases {
new csml.Case {
of = "partsAssembled >= partsPerProduct"
yields {
new csml.Eval { expression = "partsAssembled = 0" }
new csml.Emit {
event { topic = Events.eProductComplete }
target = "'jobController'"
}
}
}
}
}
}
}
}
}

["jobDoneState"] = new csml.Terminal {}
}
}
Loading