Ich schreibe ein DSL in Ruby, um ein Arduino-Projekt zu steuern, an dem ich arbeite; Bardino. Es ist ein Baraffe, der softwaregesteuert wird, um Getränke zu servieren. Der Arduino nimmt über den seriellen Port Befehle entgegen, um dem Arduino zu sagen, welche Pumpen eingeschaltet werden sollen und für wie lange.Brauchen Sie Hilfe ein Ruby DSL für die Steuerung eines Arduino kontrollierten Getränkespender zu verbessern (Bar Affe)
Es liest derzeit ein Rezept (siehe unten) und druckt es wieder aus. Der Code für die serielle Kommunikation muss noch bearbeitet werden, ebenso wie einige andere Ideen, die ich unten erwähnt habe.
Dies ist meine erste DSL und ich arbeite von einem vorherigen Beispiel, so dass es sehr rau an den Rändern ist. Irgendwelche Kritik, Code-Verbesserungen (gibt es irgendwelche guten Referenzen für Ruby DSL Best Practices oder Idiome?) Oder allgemeine Kommentare.
Im Moment habe ich einen groben Entwurf des DSL so ein Getränk Rezept sieht wie folgt aus (Github link):
desc "Simple glass of water"
recipe "water" do
ingredients(
"Water" => 2.ounces
)
end
Dies wiederum interpretiert und führt derzeit mit der folgenden (Github link):
[[email protected] barduino-tender]$ ruby barduino-tender.rb examples/water.rb
Preparing: Simple glass of water
Ingredients:
Water: 2 ounces
Dies ist ein guter Start für die DSL, aber ich denke, es könnte ein bisschen besser umgesetzt werden. Einige Ideen, die ich unten hatte:
- Definieren, was "Zutaten" sind mit dem Namen der Zutat und der Nummer Pumpe, die es verbunden ist. Vielleicht mit einem Hash? Zutaten = {"Wasser" => 1, "Wodka" => 2}. Wenn eine Zutat interpretiert wird, kann sie entweder a) die Pumpennummer über die serielle Schnittstelle senden, gefolgt von der Anzahl der Unzen, die der Arduino ausgeben soll. B) dem Benutzer mitteilen, dass keine Zutat vorhanden ist, und abbrechen, so dass nichts ausgegeben wird. leicht die Fähigkeit haben, neue Zutaten zu ändern oder hinzuzufügen, wenn sie geändert werden.
- Machen Sie das Rezept aussehen weniger Code wie, was ist der Hauptzweck eines DSL, vielleicht ein Rezept Builder bauen? Verwenden Sie die verfügbaren Zutaten, um den Benutzer auf einen Namen, Zutaten beteiligt und wie viel?
Das Github-Projekt ist here, fühlen sich hier frei gabeln und Pull-Anforderungen zu machen, oder posten Sie Ihre Code Anregungen und Beispiele für andere Benutzer zu sehen. Und wenn Sie überhaupt neugierig sind, ist der Arduino-Code mit dem Ruby Arduino Development Framework here.
aktualisieren
I modifiziert und gereinigt Dinge ein wenig bis zum Orion Edwards Vorschlag für ein Rezept zu reflektieren. Es sieht jetzt wie folgt aus.
description 'Screwdriver' do
serve_in 'Highball Glass'
ingredients do
2.ounces :vodka
5.ounces :orange_juice
end
end
Ich habe auch einen Hash hinzugefügt (Schlüssel ist die Zutat und der Wert die Pumpennummer, die es angeschlossen ist). Ich denke, das hat viel Fortschritt gebracht. Ich werde die Frage zunächst für weitere Vorschläge offen lassen, werde aber letztendlich Orions Antwort wählen. Der aktualisierte DSL-Code lautet 10.
Um etwas Pseudo-Code zu der Mischung hinzuzufügen. für Zutat in Zutaten {wenn Zutat.existiert? serial.send (pump_number) warte 1 Sekunde serial.send (Menge) warte auf OK von Arduino um mit der nächsten Zutat fortzufahren} – mwilliams