From 8faf4c50b6fab48c96a820375a1ef0caaf5b76bf Mon Sep 17 00:00:00 2001
From: Jake Read <jake.read@cba.mit.edu>
Date: Mon, 18 May 2020 22:40:40 -0400
Subject: [PATCH] arrow

---
 hunks/statemachines/pendulum-ukx-sg.js | 52 +++++++++++++++++++++++---
 1 file changed, 47 insertions(+), 5 deletions(-)

diff --git a/hunks/statemachines/pendulum-ukx-sg.js b/hunks/statemachines/pendulum-ukx-sg.js
index d34a42f..35297b9 100644
--- a/hunks/statemachines/pendulum-ukx-sg.js
+++ b/hunks/statemachines/pendulum-ukx-sg.js
@@ -164,10 +164,37 @@ export default function Pendulum() {
   svg.appendChild(circle)
   dom.appendChild(svg)
 
+  // ---------------------------------------------------------------- KEYDOWNS
+  let keyAttack = 1
+  // (override PID controlled xddot)
+  document.addEventListener('keydown', (evt) => {
+    if (evt.repeat) return
+    if (evt.keyCode === 37) {
+      // left down
+      odot += keyAttack
+    } else if (evt.keyCode === 39) {
+      // right down
+      odot -= keyAttack
+    }
+    // console.log('xdd', xddot)
+  })
+  document.addEventListener('keyup', (evt) => {
+    if (evt.repeat) return
+    if (evt.keyCode === 37) {
+      // left up
+      odot -= keyAttack
+    } else if (evt.keyCode === 39) {
+      // right up
+      odot += keyAttack
+    }
+    // console.log('xdd', xddot)
+  })
+
   // ---------------------------------------------------------------- SIMULATION
   let odamp = 0.1
   let length = 1
   let xddotLimit = 9.8 * 3
+  let xdotLimit = 10
 
   // start time, increment, count, init, k[4]
   let runSimulation = (t, tstep, count, x, xdot, o, odot, k) => {
@@ -181,12 +208,20 @@ export default function Pendulum() {
       t += tstep
       // use k-vals control law to generate new xddot
       xddot = x * k[0] + xdot * k[1] + o * k[2] + odot * k[3]
-      if (xddot > xddotLimit) xddot = xddotLimit
-      if (xddot < -xddotLimit) xddot = -xddotLimit
+      if (xddot > xddotLimit) {
+        xddot = xddotLimit
+      } else if (xddot < -xddotLimit) {
+        xddot = -xddotLimit
+      }
       // angular acceleration, given effect of gravity and cart accel
       oddot = (xddot * Math.cos(o) + 9.8 * Math.sin(o)) / length
       // integrations,
       xdot += xddot * tstep
+      if(xdot > xdotLimit){
+        xdot = xdotLimit
+      } else if (xdot < -xdotLimit){
+        xdot = -xdotLimit
+      }
       odot = odot + oddot * tstep - odot * odamp * tstep
       x += xdot * tstep
       o += odot * tstep
@@ -222,6 +257,8 @@ export default function Pendulum() {
 
   let rt = 0
   let rerr = 0
+  let ru = 0
+  let odot = 0 // global, for keystrokes
   let timer
   // start and run render w/
   let startRender = () => {
@@ -230,7 +267,7 @@ export default function Pendulum() {
     let x = Math.random() * 1 - 0.5 // [-10, 10]
     let xdot = Math.random() * 2 - 1 // [-1, 1]
     let o = Math.random() - 0.5 // [-0.5, 0.5]
-    let odot = Math.random() - 0.5 // [-0.5, 0.5]
+    odot = Math.random() - 0.5 // [-0.5, 0.5]
     // k!
     let kvals = [
       randGaussian() * 10 - 5,
@@ -243,7 +280,7 @@ export default function Pendulum() {
     let iters = 0
     let update = () => {
       let result
-      for (let s = 0; s < 40; s++) {
+      for (let s = 0; s < 60; s++) {
         kvals = moveGenerator(t, 0.001, mgForecast, x, xdot, o, odot, kvals)
         //console.log('kv', kvals)
         //let kvals = [k0.value, k1.value, k2.value, k3.value]
@@ -258,6 +295,7 @@ export default function Pendulum() {
       // render output vars
       rt = t
       rerr = result.err
+      ru = result.xddot
       drawLine(x, o)
       // and watch k-vals,
       k0.set(parseFloat(kvals[0].toFixed(6)))
@@ -302,6 +340,10 @@ export default function Pendulum() {
   startRender()
 
   this.loop = () => {
-
+    if (!rtOut.io() && !rerrOut.io() && !ruOut.io()) {
+      rtOut.put(rt)
+      rerrOut.put(rerr)
+      ruOut.put(ru)
+    }
   }
 }
-- 
GitLab