Stap 15: Client GUI
Zoals eerder gezegd, worden we Shoes.rb, een GUI-wrapper voor Robijnrode code gebruiken. Het project schoenen is vrij netjes - zeker check out hun site. Ik kon heb gekozen voor het gebruik van Java, maar besloten het zou netter uitproberen met een ander kader.
De clientcode is gekoppeld. Zoals u zien kunt, is het een relatief normale .rb ruby-bestand.
Veel van deze code is zichzelf, dus ik zal alleen gaan over de onderdelen die zou verwarrend kunnen zijn.
# MOTION CAPTURE BEGIN = nil, nil motion do |_x, _y| if and and ( != _x or != _y) and _x < 500 and _y < 500 and _x > 0 and _y > 0 and < 500 and < 500 append do line _x, _y end "X is now #{ "Y is now #{ end = _x, _y end
Hier, gebruiken we de schoen 'motion' blok te vangen van de muisbeweging. We besparen de nieuwe x, y van de muis als _x en _y. Dat eerste als verklaring, controleren we of x en y beide bestaan, en geef dat wij alleen de zorg over x / y-die waarden zijn gewijzigd als het oorspronkelijke/product zijn beide binnen 0 en 500 pixels (een vierkant van 500 x 500 pixels).
Als die voldoet aan onze voorwaarde, werken we met de nieuwe posities.
Vervolgens, hebben we onze blok dat verantwoordelijk is voor het daadwerkelijk het verzenden van berichten naar onze server. De reacties leggen nogal.:
def x_scaler(raw_x) (raw_x.to_f / 250.to_f).round(1) * 2 end def y_scaler(raw_y) # smallest value should be 800 (all the way up): -700 # largest value should be 2200 (all the way down): +800 # zero should be 1500 (center) # so: # 0 -> 800 # 250 -> 1500 # 500 -> 2200 return (((raw_y * 2.8) + 800) / 10).to_i * 10 end # Initial value = 1500 # Animate(2) runs it twice a second. Animate(8) (the fastest) would run this code 8 times a second. animate(2) do # For y variable if and > 0 and < 500 and != and > 0 and < 500 = y_scaler( "Sending Y: #{ (raw: #{ 0) else end # For x variable if and and > 0 and < 500 and != = x_scaler( - #x_scaler( "Sending X: #{ (raw: #{ 0) else "Nothing changed." = 0 end # Save these values for next time = = end
We definiëren x_scaler en y_scaler als de formateurs voor de ruwe X en Y input, hieraan een waarde die is vriendelijk naar de set die we hebben op de Pi-server.
Het animate(2) blok betekent dat wij deze opdracht tweemaal elke seconde wordt uitgevoerd. Shoes.rb kunt dingen te lopen zo spoedig 8 keer een tweede, maar voor onze doeleinden, tweemaal een tweede volstaat. Hiermee wordt in wezen bepaald onze bemonsteringssnelheid van en (hoe vaak we zijn in de stemlokalen die variabelen)
Binnen dat blok, wij behandelen en anders. In ons geval betekent het torentje, dat wordt beheerd door een PWM servo motor puls. Dit betekent dat we alleen hoeft te geven dat één waarde voor het naar, en dus we direct naar y_scaler voeden kunnen
Sindsdien betekent daarentegen yaw hoek van de pi, die wordt beheerd door onze motoren draaien op een lengte van de variabele tijd, dit moet eigenlijk naar een nummer dat de verandering in waarde sinds de laatste verkiezingen betekent. Een beetje ingewikkelder, maar geen rocket-science wiskunde.
Aan het eind van dit blok, we besparen en voor toekomstige vergelijking voor volgende polling-cyclus.
De rest van de client GUI code is relatief duidelijk, dus ik zal niet het punt probeert afrossen te gaan over het hier.