1. How to diffuse a bomb with ECF
and e(fx)clipse
Building a bomb disarming simulation
2. Simulation Prototype
Cut the correct cables to
disarm the bomb!
Every cable has a unique number:
5 = ORANGE
15 = WHITE
30 = BLUE
40 = GREEN
50 = YELLOW
3. Live Escape Game
• Played as a team
• You must be physically present
• You have 1 hour time
• to solve a chain of puzzles
Great place to use IoT technologies to
create cool interactive puzzle gadgets!
int a = LocalDate.now().getMonthValue();
5. Bomb Gadget Hardware
Sensors
• Touch and magnetic sensors (fake “fingerprint scanner”)
• Magnetic lid sensor (turn on lights, lock lid)
• 5 Cables (disarm or detonate bomb)
Actors
• Fingerprint LEDs (red and green) – 5V (via Output)
• Lid lock: electromagnet – 12V (via Relay)
• LED lights – 12V (via Relay)
int d = LocalDate.now().minusYears(2016).getEra().toString().length();
6. Simple Gadget Setup
Hardware
• Raspberry Pi 2
• PiFace Digital 2
• Sensors (Input)
• Actors (Output)
Software
• Equinox gateway application
• Pi4J library (API for PiFace)
• ECF Remote Services
int d = LocalDate.now().minusYears(2016).getEra().toString().length();
7. System Architecture
Communication lines between all the components with
OSGi remote services
One Service for every Input (Sensor) and Output (Actor)
Bomb
Monitor
Operator
Tool
Gadget 4Gadget 3Gadget 2
Bomb
Gadget
int c = Character.getNumericValue(System.getProperty("java.version").charAt(0));
8. Remote Services
Why I love OSGi remote services
• Type safe development
• Loosely coupled
• No central server (dependencies by design)
• Dynamic (services may come and go)
• Protocol independent
int cable2 = e - d;
9. Register a Remote Service
Register the service through the API or use DS
int cable2 = e - d;
11. Gadget Service Architecture
int e = Integer.valueOf(System.getProperty("javafx.runtime.version").substring(0, c)).intValue();
Every service has a unique
name to identify it
This Ecore diagram is used for presentation purposes only. No EMF model code generation …
12. Gadget Service Architecture
Remote
control
int e = Integer.valueOf(System.getProperty("javafx.runtime.version").substring(0, c)).intValue();
This Ecore diagram is used for presentation purposes only. No EMF model code generation …
14. Sniffers
Whiteboard Pattern
• The sniffer is
registered as a remote
OSGi service
• By the party that is
interested in receiving
change notifications
• The gadget will pick
up the service and
start sending
notifications if
connect() returns true
int a = LocalDate.now().getMonthValue();
15. Service Implementation
• Generic implementations
for PiFace inputs and
outputs using Pi4J
• Abstract implementation
SniffableIO provides API
to register IOSniffers as
observers
int e = Integer.valueOf(System.getProperty("javafx.runtime.version").substring(0, c)).intValue();
18. OSGi + JavaFX =
FX-OSGi Application
• Equinox runtime
• JavaFX (design in FXML)
• Eclipse DI
• E(fx)clipse APIs
• (no e4 application)
int cable1 = (b - a) * c;
19. Game Services
Use GameService
• Internally when
sniffed sensors
change state
• Built-in test panel
for rapid creative
development
• From the operator
application for
remote control
Whiteboard Pattern
int b = Double.valueOf(System.getProperty("java.class.version")).intValue();
This Ecore diagram is used for presentation purposes only. No EMF model code generation …
22. Simulation Prototype
Cut the correct cables to
disarm the bomb!
Every cable has a unique number:
5 = ORANGE
15 = WHITE
30 = BLUE
40 = GREEN
50 = YELLOW
int cable1 = (b - a) * c; int cable2 = e - d;
Hinweis der Redaktion
Simple logic, like “turn on the red light, when the touch sensor is pressed but the magnetic sensor is off” can be implemented on the device directly. But often enough, this information needs to be accessible remotely. Let’s take a step back and look at the big picture.
Simple logic, like “turn on the red light, when the touch sensor is pressed but the magnetic sensor is off” can be implemented on the device directly. But often enough, this information needs to be accessible remotely. Let’s take a step back and look at the big picture.
7 Inputs
7 Outputs 5V
2 Relays (up to 20V)
No soldering!
Gadget: Sensors and actors
Application: Graphics and sounds
It’s a game, so an agile development approach is necessary. We want to be able to change this quickly:
Move services from one device to another
Introduce new services and/or new devices
Change the game logic
The distribution provider is responsible for the actual marshalling/serialization and network communication that takes place when a consumer invokes a method on a remote service
The discovery provider is responsible to publish, find and register remote services
Used the Ecore diagram editor to visualize the interface relationships. No EMF model is generated from this.
Used the Ecore diagram editor to visualize the interface relationships. No EMF model is generated from this.
Used the Ecore diagram editor to visualize the interface relationships. No EMF model is generated from this.
This Sniffer is used by the bomb monitor application
Sniffers need to be found using a service tracker, which then adds the sniffer to the IO service if its connect() method returns true.
Now we have our building blocks to create and publish simple input/output services hooked to sensors and actors.
Ggf. die nächsten beiden Seiten (Register Remote Services & Using Remote Services) weglassen und hier einfach erzählen
Sniffers need to be found using a service tracker, which then adds the sniffer to the IO service if its connect() method returns true.
Now we have our building blocks to create and publish simple input/output services hooked to sensors and actors.
Ggf. die nächsten beiden Seiten (Register Remote Services & Using Remote Services) weglassen und hier einfach erzählen
This can potentially be a very media enabled application. JavaFX seems a no-brainer in this situation.
JavaFX + OSGi = e(fx)clipse
Bomb monitor application can be in different states, depending on the observed (sniffed) sensor states.
Used the Ecore diagram editor to visualize the interface relationships. No EMF model is generated from this.