{"id":22887220,"url":"https://github.com/electrostat-lab/automata4j","last_synced_at":"2025-05-07T11:13:57.319Z","repository":{"id":182688080,"uuid":"647214486","full_name":"Electrostat-Lab/Automata4j","owner":"Electrostat-Lab","description":"A classic finite state automaton framework for JVM Applications (Android and jMonkeyEngine Applications).","archived":false,"fork":false,"pushed_at":"2023-08-28T08:47:37.000Z","size":5295,"stargazers_count":5,"open_issues_count":3,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-05-07T11:13:42.453Z","etag":null,"topics":["android-apps","design-patterns","electrostat-lab","finite-state-automata","java","jmonkeyengine","object-oriented-programming","state-machines"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Electrostat-Lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-30T09:53:14.000Z","updated_at":"2024-08-09T18:40:44.000Z","dependencies_parsed_at":"2024-05-03T16:27:58.962Z","dependency_job_id":null,"html_url":"https://github.com/Electrostat-Lab/Automata4j","commit_stats":null,"previous_names":["software-hardware-codesign/automata4j","electrostat-lab/automata4j"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Electrostat-Lab%2FAutomata4j","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Electrostat-Lab%2FAutomata4j/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Electrostat-Lab%2FAutomata4j/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Electrostat-Lab%2FAutomata4j/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Electrostat-Lab","download_url":"https://codeload.github.com/Electrostat-Lab/Automata4j/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252865765,"owners_count":21816308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android-apps","design-patterns","electrostat-lab","finite-state-automata","java","jmonkeyengine","object-oriented-programming","state-machines"],"created_at":"2024-12-13T20:31:41.969Z","updated_at":"2025-05-07T11:13:57.279Z","avatar_url":"https://github.com/Electrostat-Lab.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# \u003cimg src=\"https://github.com/Software-Hardware-Codesign/Automata4j/blob/master/vending-machine-svgrepo-com.svg\" width=55 height=55/\u003e Automata4j [![Codacy Badge](https://app.codacy.com/project/badge/Grade/9d1d6ffa15204f13889340e1288ceba8)](https://app.codacy.com/gh/Software-Hardware-Codesign/Automata4j/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_grade) [![](https://img.shields.io/badge/Automata4j-latest_version-red)](https://github.com/Software-Hardware-Codesign/Automata4j/releases/)\n[![](https://github.com/Software-Hardware-Codesign/Automata4j/actions/workflows/build-test.yml/badge.svg)]() [![](https://github.com/Software-Hardware-Codesign/Automata4j/actions/workflows/build-deploy.yml/badge.svg)]()\n\nA finite state automaton framework for Java, Android, and jMonkeyEngine Applications.\n\n\u003cimg src=\"https://github.com/Software-Hardware-Codesign/Automata4j/blob/master/archives/architecture.png\"/\u003e\n\n## Building: \n```bash\n┌─[pavl-machine@pavl-machine]─[/home/pavl-machine/projects]\n└──╼ $git clone https://github.com/Software-Hardware-Codesign/Automata4j.git \u0026\u0026 cd ./Automata4j\n\n┌─[pavl-machine@pavl-machine]─[/home/pavl-machine/projects/Automata4j]\n└──╼ $./gradlew automata4j:build \u0026\u0026 \\\n     ./gradlew automata4j:generateJavadocJar \u0026\u0026 \\\n     ./gradlew automata4j:generateSourcesJar\n``` \n## Implementation Example: \n```java\nfinal String version = \"1.0.0-beta\"\n\nrepositories {\n    mavenCentral()\n}\ndependencies {\n    implementation \"io.github.software-hardware-codesign:automata4j:${version}\"\n}\n```\n```java\npublic final class SpaceCraftEngine extends Thread implements TransitionalListener {\n     private final TransitionalManager transitionalManager = new TransitionalManager();\n     private final LatLng initialPosition = VehicleManager.getInstance().getSpaceCraft().getLocation();\n     private final SpaceCraftEngine.TravelDistance travelDistance = new SpaceCraftEngine.TravelDistance(10f);\n     private final SpaceCraftEngine.MoveCommand horizontalMoveState = new SpaceCraftEngine.MoveCommand();\n     \n     public SpaceCraftEngine() {\n          super(SpaceCraftEngine.class.getName());\n     }\n     \n     /** Run your example from here or a Game state or a Unit Test */\n     public static void main(String args[]) {\n          final SpaceCraftEngine engine = new SpaceCraftEngine();\n          engine.startTravelling();\n     }\n     \n     public void startTravelling() {\n          /* Assigns the initial state and starts the transitional manager */\n          transitionalManager.assignNextState(horizontalMoveState);\n          this.start();\n     }\n     \n     @Override\n     public void run() {\n          /* Starts the finite-state-system by transiting to the next travel state */\n          travel(travelDistance);\n     }\n     \n     @Override\n     public \u003cI, O\u003e void onTransition(AutoState\u003cI, O\u003e presentState) {\n          final AutoState\u003cPulseCommand, LatLng\u003e autoState = (AutoState\u003cPulseCommand, LatLng\u003e) presentState;\n          if (presentState.getStateTracer().getX() \u003e (initialPosition.getX() + 200f)) {\n               /* Exits the system once traveling has been completed and docks the spacecraft */\n               VehicleManager.getInstance().getSpaceCraft().dock(DockingSpeed.DEFAULT_SPEED);\n               Gui.getInstance().message(Message.Type.Alert,\n                                   \"Completed Travelling 200+ Miles, Docking the SpaceCraft\");\n               return;\n          }\n          /* Continues assigning new states as long as the destination has not been met */\n          transitionalManager.assignNextState(horizontalMoveState);\n          travel(travelDistance);\n     }\n     \n     protected void travel(SpaceCraftEngine.TravelDistance travelDistance) {\n          transitionalManager.transit(travelDistance, this);\n          Gui.getInstance().message(Message.Type.Alert, \"Travelling Now for \"\n                                   + travelDistance.getPulse() + \" Miles\");\n     }\n\n     protected static class MoveCommand implements AutoState\u003cPulseCommand, LatLng\u003e {\n          private PulseCommand command;\n\n          @Override\n          public void setInput(PulseCommand command) {\n               this.command = command;\n          }\n\n          @Override\n          public void invoke(PulseCommand command) {\n               this.command = command;\n               // Your system state goes here\n               VehicleManager.getInstance().getSpaceCraft().force(command.getPulse(), 0);\n               Gui.getInstance().message(Message.Type.Info, \"Added additional \"\n                                        + command.getPulse() + \" Miles\");\n          }\n          \n          @Override\n          public PulseCommand getInput() {\n               return command;\n          }\n          \n          @Override\n          public LatLng getStateTracer() {\n               return VehicleManager.getInstance().getSpaceCraft().getLocation();\n          }\n          \n          @Override\n          public void onFinish() {\n               // Your finish code goes here\n               VehicleManager.getInstance().getSpaceCraft().stopEngine();\n               Gui.getInstance().message(Message.Type.Warning, \"Engine Stops\");\n          }\n          \n          @Override\n          public void onStart() {\n               // Your start code goes here\n               VehicleManager.getInstance().getSpaceCraft().startEngine();\n               Gui.getInstance().message(Message.Type.Info, \"Engine Starts\");\n          }\n     }\n\n     protected static class TravelDistance implements PulseCommand {\n          private float pulse;\n     \n          public TravelDistance(float pulse) {\n               this.pulse = pulse;\n          }\n          \n          @Override\n          public float getPulse() {\n               return pulse;\n          }\n     }\n\n     protected static class Location implements LatLng {\n          private float x;\n          private float y;\n     \n          public Location(float x, float y) {\n               this.x = x;\n               this.y = y;\n          }\n          \n          @Override\n          public void setLocation(float x, float y) {\n               this.x = x;\n               this.y = y;\n          }\n          \n          @Override\n          public float getX() {\n               return x;\n          }\n          \n          @Override\n          public float getY() {\n               return y;\n          }\n     }\n}\n```\n\n## Appendix\n### Features:\n- [x] Finite-State-Machine pattern.\n- [x] SerialAdder Example.\n- [x] API Documentation.\n- [x] Document describing the finite-state theory.\n- [x] Publishing to Maven for public use.\n- [x] Deterministic Finite-State-Automata.\n- [x] Wiki for general use.\n\n### Theory Archive: \n- [Finite-State-Automaton Theory Archive, from Switching and Finite Automata Theory 3rd Edition](https://github.com/Software-Hardware-Codesign/Automata4j/blob/master/archives/Finite-State-Automata.pdf)\n- [Finite-State-Recognizers for DFSA V.S. NDFSA](https://github.com/Software-Hardware-Codesign/Automata4j/blob/master/archives/Finite-State-Recognizers(DFSA-NDFSA).pdf)\n\n### For more about Finite-States, find the full TextBook: \n[![](https://github.com/Software-Hardware-Codesign/Automata4j/assets/60224159/d28b39b0-28f3-43e2-859e-787a5e8f88e1)](https://www.amazon.com/Switching-Finite-Automata-Theory-Kohavi/dp/0521857481)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felectrostat-lab%2Fautomata4j","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felectrostat-lab%2Fautomata4j","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felectrostat-lab%2Fautomata4j/lists"}