From dc4abd8f030b5d6034ef0a17b6b11006296e4621 Mon Sep 17 00:00:00 2001 From: Martin Evans Date: Wed, 19 Jul 2017 17:25:28 +0100 Subject: [PATCH 1/3] update settings for cam jam Change motor pins for CamJam edukit 3 --- coderbot.py | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/coderbot.py b/coderbot.py index 7900e8b8..1dbec39f 100644 --- a/coderbot.py +++ b/coderbot.py @@ -25,21 +25,21 @@ import sonar PIN_MOTOR_ENABLE = 22 -PIN_LEFT_FORWARD = 25 -PIN_LEFT_BACKWARD = 24 -PIN_RIGHT_FORWARD = 4 -PIN_RIGHT_BACKWARD = 17 +PIN_LEFT_FORWARD = 8 +PIN_LEFT_BACKWARD = 7 +PIN_RIGHT_FORWARD = 10 +PIN_RIGHT_BACKWARD = 9 PIN_PUSHBUTTON = 11 -PIN_SERVO_3 = 9 -PIN_SERVO_4 = 10 -PIN_SONAR_1_TRIGGER = 18 -PIN_SONAR_1_ECHO = 7 -PIN_SONAR_2_TRIGGER = 18 -PIN_SONAR_2_ECHO = 8 -PIN_SONAR_3_TRIGGER = 18 -PIN_SONAR_3_ECHO = 23 -PIN_ENCODER_LEFT = 14 -PIN_ENCODER_RIGHT = 15 +#PIN_SERVO_3 = 9 +#PIN_SERVO_4 = 10 +PIN_SONAR_1_TRIGGER = 17 +PIN_SONAR_1_ECHO = 18 +#PIN_SONAR_2_TRIGGER = 18 +#PIN_SONAR_2_ECHO = 8 +#PIN_SONAR_3_TRIGGER = 18 +#PIN_SONAR_3_ECHO = 23 +#PIN_ENCODER_LEFT = 14 +#PIN_ENCODER_RIGHT = 15 PWM_FREQUENCY = 100 #Hz PWM_RANGE = 100 #0-100 @@ -75,7 +75,7 @@ def __init__(self, servo=False, motor_trim_factor=1.0): self._is_moving = False self.sonar = [sonar.Sonar(self.pi, PIN_SONAR_1_TRIGGER, PIN_SONAR_1_ECHO), sonar.Sonar(self.pi, PIN_SONAR_2_TRIGGER, PIN_SONAR_2_ECHO), - sonar.Sonar(self.pi, PIN_SONAR_3_TRIGGER, PIN_SONAR_3_ECHO)] + sonar.Sonar(self.pi, PIN_SONAR_3_TRIGGER, PIN_SONAR_3_ECHO)] self._encoder_cur_left = 0 self._encoder_cur_right = 0 self._encoder_target_left = -1 @@ -127,7 +127,7 @@ def _dc_motor(self, speed_left=100, speed_right=100, elapse=-1, steps_left=-1, s self._encoder_cur_right = 0 self._encoder_target_left = steps_left self._encoder_target_right = steps_right - + self._is_moving = True if speed_left < 0: speed_left = abs(speed_left) @@ -210,7 +210,7 @@ def callback(self, gpio, level, tick): elapse = self._cb_elapse.get(gpio) if level == 0: self._cb_last_tick[gpio] = tick - elif tick - self._cb_last_tick[gpio] > elapse: + elif tick - self._cb_last_tick[gpio] > elapse: self._cb_last_tick[gpio] = tick print "pushed: ", level, tick cb() @@ -226,5 +226,3 @@ def reboot(self): def sleep(self, elapse): time.sleep(elapse) - - From 9a8aa6b7f3c031dfd6e62d3271fef78c08d15498 Mon Sep 17 00:00:00 2001 From: Martin Evans Date: Thu, 20 Jul 2017 16:11:08 +0100 Subject: [PATCH 2/3] Changes for CamJam Edukit 3 with LED's, button code and line follower. Removed camera references and all audio stuff --- .gitignore | 10 ++ awesomeinput.py | 35 +++++++ awesomeoutput.py | 20 ++++ coderbot.py | 41 +++++--- data/program_face_find.data | 1 - data/program_find_code_test.data | 1 - data/program_find_color.data | 1 - data/program_find_text.data | 1 - data/program_hear_test.data | 1 - data/program_img_average_test.data | 1 - data/program_obstacle_avoidance.data | 2 +- data/program_path_ahead.data | 1 - data/program_sound_rec_test.data | 1 - data/program_test_sound.data | 1 - data/program_test_speech_recog.data | 1 - infrared.py | 29 ++++++ main.py | 36 +++---- program.py | 42 +++----- static/.DS_Store | Bin 6148 -> 0 bytes static/css/.DS_Store | Bin 6148 -> 0 bytes static/js/.DS_Store | Bin 6148 -> 0 bytes static/js/blockly/blocks.js | 91 ++++++++++++----- static/js/control.js | 30 +++--- static/js/program.js | 14 +-- templates/blocks_adv.xml | 146 +++------------------------ templates/config.html | 96 ++---------------- templates/control.html | 76 +++----------- templates/index.html | 16 +-- templates/program.html | 12 +-- 29 files changed, 281 insertions(+), 425 deletions(-) create mode 100644 awesomeinput.py create mode 100644 awesomeoutput.py delete mode 100644 data/program_face_find.data delete mode 100644 data/program_find_code_test.data delete mode 100644 data/program_find_color.data delete mode 100644 data/program_find_text.data delete mode 100644 data/program_hear_test.data delete mode 100644 data/program_img_average_test.data delete mode 100644 data/program_path_ahead.data delete mode 100644 data/program_sound_rec_test.data delete mode 100644 data/program_test_sound.data delete mode 100644 data/program_test_speech_recog.data create mode 100644 infrared.py delete mode 100644 static/.DS_Store delete mode 100644 static/css/.DS_Store delete mode 100644 static/js/.DS_Store diff --git a/.gitignore b/.gitignore index dc8f12bb..510af278 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,13 @@ static/blockly-tutorial .Trashes ehthumbs.db Thumbs.db + +static/.DS_Store + +static/.DS_Store + +static/js/.DS_Store + +static/css/.DS_Store + +static/.DS_Store diff --git a/awesomeinput.py b/awesomeinput.py new file mode 100644 index 00000000..0a8443c4 --- /dev/null +++ b/awesomeinput.py @@ -0,0 +1,35 @@ +import time +import pigpio +import logging + +class Awesomeinput: + """ + ound trip time. + """ + + def __init__(self, pi, linesensorpin): + """ + The class is instantiated with the Pi to use and the + gpios connected to the trigger and echo pins. + """ + self.pi = pi + self._linesensorpin = linesensorpin + pi.set_mode(self._linesensorpin, pigpio.INPUT) + self._inited = True + + def buttonInput(self, awesome_button): + self.pi.set_mode(awesome_button, pigpio.INPUT) + self.pi.set_pull_up_down(awesome_button, pigpio.PUD_UP) + print "Button pin:" + str(awesome_button) + print "Button reads: " + str(self.pi.read(awesome_button)) + if self.pi.read(awesome_button) == 1: + return False + else: + return True + + def lineSensor(self): + if self._inited: + if self.pi.read(self._linesensorpin) == 1: + return False + else: + return True diff --git a/awesomeoutput.py b/awesomeoutput.py new file mode 100644 index 00000000..181f27b1 --- /dev/null +++ b/awesomeoutput.py @@ -0,0 +1,20 @@ +import time +import pigpio +import logging + +class Awesomeoutput: + """ + ound trip time. + """ + + def __init__(self, pi): + """ + The class is instantiated with the Pi to use and the + gpios connected to the trigger and echo pins. + """ + self.pi = pi + + + def ledOutput(self, awesome_led, LED_State): + self.pi.set_mode(awesome_led, pigpio.OUTPUT) + self.pi.write(awesome_led, LED_State) diff --git a/coderbot.py b/coderbot.py index 1dbec39f..42dbc9cd 100644 --- a/coderbot.py +++ b/coderbot.py @@ -23,6 +23,9 @@ import config import logging import sonar +import awesomeoutput +import awesomeinput + PIN_MOTOR_ENABLE = 22 PIN_LEFT_FORWARD = 8 @@ -34,27 +37,26 @@ #PIN_SERVO_4 = 10 PIN_SONAR_1_TRIGGER = 17 PIN_SONAR_1_ECHO = 18 -#PIN_SONAR_2_TRIGGER = 18 -#PIN_SONAR_2_ECHO = 8 -#PIN_SONAR_3_TRIGGER = 18 -#PIN_SONAR_3_ECHO = 23 -#PIN_ENCODER_LEFT = 14 -#PIN_ENCODER_RIGHT = 15 PWM_FREQUENCY = 100 #Hz PWM_RANGE = 100 #0-100 +PIN_LINE_SENSOR = 25 + +#OUTPUT_LED = 1 +#PIN_LED = 24 + def coderbot_callback(gpio, level, tick): return CoderBot.get_instance().callback(gpio, level, tick) class CoderBot: - _pin_out = [PIN_MOTOR_ENABLE, PIN_LEFT_FORWARD, PIN_RIGHT_FORWARD, PIN_LEFT_BACKWARD, PIN_RIGHT_BACKWARD, PIN_SERVO_3, PIN_SERVO_4] + _pin_out = [PIN_MOTOR_ENABLE, PIN_LEFT_FORWARD, PIN_RIGHT_FORWARD, PIN_LEFT_BACKWARD, PIN_RIGHT_BACKWARD] def __init__(self, servo=False, motor_trim_factor=1.0): self.pi = pigpio.pi('localhost') self.pi.set_mode(PIN_PUSHBUTTON, pigpio.INPUT) - self.pi.set_mode(PIN_ENCODER_LEFT, pigpio.INPUT) - self.pi.set_mode(PIN_ENCODER_RIGHT, pigpio.INPUT) +# self.pi.set_mode(PIN_ENCODER_LEFT, pigpio.INPUT) +# self.pi.set_mode(PIN_ENCODER_RIGHT, pigpio.INPUT) self._cb = dict() self._cb_last_tick = dict() self._cb_elapse = dict() @@ -65,17 +67,15 @@ def __init__(self, servo=False, motor_trim_factor=1.0): else: self.motor_control = self._dc_motor self._cb1 = self.pi.callback(PIN_PUSHBUTTON, pigpio.EITHER_EDGE, coderbot_callback) - self._cb2 = self.pi.callback(PIN_ENCODER_LEFT, pigpio.RISING_EDGE, coderbot_callback) - self._cb3 = self.pi.callback(PIN_ENCODER_RIGHT, pigpio.RISING_EDGE, coderbot_callback) for pin in self._pin_out: self.pi.set_PWM_frequency(pin, PWM_FREQUENCY) self.pi.set_PWM_range(pin, PWM_RANGE) self.stop() self._is_moving = False - self.sonar = [sonar.Sonar(self.pi, PIN_SONAR_1_TRIGGER, PIN_SONAR_1_ECHO), - sonar.Sonar(self.pi, PIN_SONAR_2_TRIGGER, PIN_SONAR_2_ECHO), - sonar.Sonar(self.pi, PIN_SONAR_3_TRIGGER, PIN_SONAR_3_ECHO)] + self.sonar = [sonar.Sonar(self.pi, PIN_SONAR_1_TRIGGER, PIN_SONAR_1_ECHO)] + self.awesomeoutput = awesomeoutput.Awesomeoutput(self.pi) + self.awesomeinput = awesomeinput.Awesomeinput(self.pi, PIN_LINE_SENSOR) self._encoder_cur_left = 0 self._encoder_cur_right = 0 self._encoder_target_left = -1 @@ -84,8 +84,8 @@ def __init__(self, servo=False, motor_trim_factor=1.0): def exit(self): self._cb1.cancel() - self._cb2.cancel() - self._cb3.cancel() +# self._cb2.cancel() +# self._cb3.cancel() for s in self.sonar: s.cancel() @@ -122,6 +122,15 @@ def servo4(self, angle): def get_sonar_distance(self, sonar_id=0): return self.sonar[sonar_id].get_distance() + def ledOutput(self, pin_led, output_led): + self.awesomeoutput.ledOutput(pin_led, output_led) + + def buttonInput(self, pin_button): + return self.awesomeinput.buttonInput(pin_button) + + def lineSensor(self): + return self.awesomeinput.lineSensor() + def _dc_motor(self, speed_left=100, speed_right=100, elapse=-1, steps_left=-1, steps_right=-1 ): self._encoder_cur_left = 0 self._encoder_cur_right = 0 diff --git a/data/program_face_find.data b/data/program_face_find.data deleted file mode 100644 index 56618209..00000000 --- a/data/program_face_find.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "WHILETRUEfaceALLface_xGETFROM_STARTface1face_sizeGETFROM_STARTface2face: face_xface_xLTface_x-10LEFT400.1GTface_x10RIGHT400.1", "code": "face = None\nface_x = None\nface_size = None\n\n\nwhile True:\n get_prog_eng().check_end()\n face = get_cam().find_face()\n face_x = face[0]\n face_size = face[1]\n get_cam().set_text(str('face: ') + str(face_x))\n if face_x:\n if face_x < -10:\n get_bot().left(speed=40, elapse=0.1)\n elif face_x > 10:\n get_bot().right(speed=40, elapse=0.1)\n else:\n get_bot().stop()\n", "name": "face_find"} \ No newline at end of file diff --git a/data/program_find_code_test.data b/data/program_find_code_test.data deleted file mode 100644 index 25424314..00000000 --- a/data/program_find_code_test.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "WHILETRUE", "code": "while True:\n get_prog_eng().check_end()\n get_cam().set_text(get_cam().find_code())\n", "name": "find_code_test"} \ No newline at end of file diff --git a/data/program_find_color.data b/data/program_find_color.data deleted file mode 100644 index 68bc4586..00000000 --- a/data/program_find_color.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "WHILETRUEdistDIST#96b73cangleANGLE#96b73cDistance: dist angle: angle", "code": "dist = None\nangle = None\n\n\nwhile True:\n get_prog_eng().check_end()\n dist = get_cam().find_color('#96b73c')[0]\n angle = get_cam().find_color('#96b73c')[1]\n get_cam().set_text(''.join([str(temp_value) for temp_value in ['Distance: ', dist, ' angle: ', angle]]))\n", "name": "find_color"} \ No newline at end of file diff --git a/data/program_find_text.data b/data/program_find_text.data deleted file mode 100644 index 69ca7c8b..00000000 --- a/data/program_find_text.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "WHILETRUEalpha#802b29", "code": "while True:\n get_prog_eng().check_end()\n get_cam().set_text(get_cam().find_text(accept=\"alpha\", back_color='#802b29'))\n", "name": "find_text"} \ No newline at end of file diff --git a/data/program_hear_test.data b/data/program_hear_test.data deleted file mode 100644 index 31ff1247..00000000 --- a/data/program_hear_test.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "WHILETRUE1001.0", "code": "while True:\n get_prog_eng().check_end()\n get_cam().set_text(get_audio().hear(level=100, elapse=1))\n", "name": "hear_test"} \ No newline at end of file diff --git a/data/program_img_average_test.data b/data/program_img_average_test.data deleted file mode 100644 index 90bacb94..00000000 --- a/data/program_img_average_test.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "WHILETRUEV", "code": "while True:\n get_prog_eng().check_end()\n get_cam().set_text(get_cam().get_average()[2])\n", "name": "img_average_test"} \ No newline at end of file diff --git a/data/program_obstacle_avoidance.data b/data/program_obstacle_avoidance.data index 86bc1547..cb276b87 100644 --- a/data/program_obstacle_avoidance.data +++ b/data/program_obstacle_avoidance.data @@ -1 +1 @@ -{"dom_code": "WHILETRUELT10RIGHT1000.5FORWARD100-1", "code": "while True:\n get_prog_eng().check_end()\n if get_bot().get_sonar_distance() < 10:\n get_bot().right(speed=100, elapse=0.5)\n else:\n get_bot().forward(speed=100, elapse=-1)\nget_bot().stop()\n", "name": "obstacle_avoidance"} \ No newline at end of file +{"dom_code": "WHILETRUELT10RIGHT1000.5FORWARD100-1", "code": "while True:\n get_prog_eng().check_end()\n if get_bot().get_sonar_distance() < 10:\n get_bot().right(speed=100, elapse=0.5)\n else:\n get_bot().forward(speed=100, elapse=-1)\nget_bot().stop()\n", "name": "obstacle_avoidance"} diff --git a/data/program_path_ahead.data b/data/program_path_ahead.data deleted file mode 100644 index a6519297..00000000 --- a/data/program_path_ahead.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "WHILETRUE", "code": "while True:\n get_prog_eng().check_end()\n get_cam().set_text(get_cam().path_ahead())\n", "name": "path_ahead"} \ No newline at end of file diff --git a/data/program_sound_rec_test.data b/data/program_sound_rec_test.data deleted file mode 100644 index 9360e9c1..00000000 --- a/data/program_sound_rec_test.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "test01.wav5", "code": "get_audio().record_to_file(filename='test01.wav', elapse=5)\n", "name": "sound_rec_test"} \ No newline at end of file diff --git a/data/program_test_sound.data b/data/program_test_sound.data deleted file mode 100644 index d4949f55..00000000 --- a/data/program_test_sound.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "test.wav10test.wav", "code": "get_audio().record_to_file(filename='test.wav', elapse=10)get_audio().play('test.wav')\n", "name": "test_sound"} \ No newline at end of file diff --git a/data/program_test_speech_recog.data b/data/program_test_speech_recog.data deleted file mode 100644 index fc86fbd8..00000000 --- a/data/program_test_speech_recog.data +++ /dev/null @@ -1 +0,0 @@ -{"dom_code": "WHILETRUEListening...model_simple1", "code": "while True:\n get_prog_eng().check_end()\n get_cam().set_text('Listening...')\n get_cam().set_text(get_audio().speech_recog(model=\"model_simple\"))\n get_cam().sleep(1)\n", "name": "test_speech_recog"} \ No newline at end of file diff --git a/infrared.py b/infrared.py new file mode 100644 index 00000000..17d8f9a7 --- /dev/null +++ b/infrared.py @@ -0,0 +1,29 @@ +import time +import pigpio +import logging + +# +# Infrared Sensor from CamJam Edukit3 +# +# Pin 1 - 5V +# Pin 2 - Ground +# Pin 3 - gpio (here P1-8, gpio 14, TXD is used) +# +# The internal gpio pull-up is enabled so that the sensor +# normally reads high. It reads low when a magnet is close. +# + +INFRARED=14 + +pi = pigpio.pi() # connect to local Pi + +pi.set_mode(HALL, pigpio.INPUT) +pi.set_pull_up_down(HALL, pigpio.PUD_UP) + +start = time.time() + +while (time.time() - start) < 60: + print("Hall = {}".format(pi.read(HALL))) + time.sleep(0.2) + +pi.stop() diff --git a/main.py b/main.py index da7026dc..786f0f40 100644 --- a/main.py +++ b/main.py @@ -23,12 +23,12 @@ import time import logging.handlers import subprocess -import picamera +#import picamera from coderbot import CoderBot, PIN_PUSHBUTTON -from camera import Camera -from motion import Motion -from audio import Audio +#from camera import Camera +#from motion import Motion +#from audio import Audio from program import ProgramEngine, Program from config import Config @@ -38,7 +38,7 @@ logger = logging.getLogger() logger.setLevel(logging.INFO) - + # add a rotating handler handler = logging.handlers.RotatingFileHandler('logs/coderbot.log', maxBytes=1000000, backupCount=5) logger.addHandler(handler) @@ -69,7 +69,7 @@ def get_locale(): @app.route("/") def handle_home(): - stream_port = cam.stream_port if cam else "" + stream_port = cam.stream_port if cam else "" return render_template('main.html', host=request.host[:request.host.find(':')], stream_port=stream_port, locale = get_locale(), config=app.bot_config, program_level=app.bot_config.get("prog_level", "std"), cam=cam!=None) @app.route("/config", methods=["POST"]) @@ -159,10 +159,10 @@ def handle_bot(): @app.route("/bot/status", methods=["GET"]) def handle_bot_status(): logging.info( "bot_status" ) - return json.dumps({'status': 'ok'}) + return json.dumps({'status': 'ok'}) def video_stream(cam): - refresh_timeout = float(app.bot_config.get("camera_refresh_timeout", "0.1")) + refresh_timeout = float(app.bot_config.get("camera_refresh_timeout", "0.1")) while not app.shutdown_requested: last_refresh_time = time.time() frame = cam.get_image_jpeg() @@ -222,7 +222,7 @@ def handle_photo_cmd(filename): def handle_photo_thumb(filename): logging.debug("photo_thumb") return send_file(cam.get_photo_thumb_file(filename)) - + @app.route("/program/list", methods=["GET"]) def handle_program_list(): logging.debug("program_list") @@ -265,7 +265,7 @@ def handle_program_end(): logging.debug("program_end") if app.prog: app.prog.end() - app.prog = None + app.prog = None return "ok" @app.route("/program/status", methods=["GET"]) @@ -274,7 +274,7 @@ def handle_program_status(): prog = Program("") if app.prog: prog = app.prog - return json.dumps({'name': prog.name, "running": prog.is_running()}) + return json.dumps({'name': prog.name, "running": prog.is_running()}) @app.route("/tutorial") def handle_tutorial(): @@ -307,14 +307,10 @@ def run_server(): try: app.bot_config = Config.read() bot = CoderBot.get_instance(servo=(app.bot_config.get("move_motor_mode")=="servo"), motor_trim_factor=float(app.bot_config.get('move_motor_trim', 1.0))) - audio = Audio.get_instance() - audio.say(app.bot_config.get("sound_start")) - try: - cam = Camera.get_instance() - #motion = Motion.get_instance() - except picamera.exc.PiCameraError: - logging.error("Camera not present") - +# audio = Audio.get_instance() +# audio.say(app.bot_config.get("sound_start")) + + if app.bot_config.get('load_at_start') and len(app.bot_config.get('load_at_start')): app.prog = app.prog_engine.load(app.bot_config.get('load_at_start')) app.prog.execute() @@ -323,7 +319,7 @@ def run_server(): logging.error(e) bot.set_callback(PIN_PUSHBUTTON, button_pushed, 100) - app.run(host="0.0.0.0", port=8080, debug=True, use_reloader=False, threaded=True) + app.run(host="roverbot.local", port=8080, debug=True, use_reloader=False, threaded=True) finally: if cam: cam.exit() diff --git a/program.py b/program.py index ea2b8534..c1c6267f 100644 --- a/program.py +++ b/program.py @@ -24,26 +24,22 @@ import logging import coderbot -import camera -import motion +#import camera +#import motion import config -import audio +#import audio + PROGRAM_PATH = "./data/" PROGRAM_PREFIX = "program_" PROGRAM_SUFFIX = ".data" -def get_cam(): - return camera.Camera.get_instance() def get_bot(): return coderbot.CoderBot.get_instance() -def get_motion(): - return motion.Motion.get_instance() - -def get_audio(): - return audio.Audio.get_instance() +#def get_motion(): +# return motion.Motion.get_instance() def get_prog_eng(): return ProgramEngine.get_instance() @@ -58,9 +54,9 @@ def __init__(self): for dirname, dirnames, filenames, in os.walk("./data"): for filename in filenames: if PROGRAM_PREFIX in filename: - program_name = filename[len(PROGRAM_PREFIX):-len(PROGRAM_SUFFIX)] + program_name = filename[len(PROGRAM_PREFIX):-len(PROGRAM_SUFFIX)] self._repository[program_name] = filename - + @classmethod def get_instance(cls): if not cls._instance: @@ -69,13 +65,13 @@ def get_instance(cls): def list(self): return self._repository.keys() - + def save(self, program): self._program = self._repository[program.name] = program f = open(PROGRAM_PATH + PROGRAM_PREFIX + program.name + PROGRAM_SUFFIX, 'w') json.dump(program.as_json(), f) f.close() - + def load(self, name): #return self._repository[name] f = open(PROGRAM_PATH + PROGRAM_PREFIX + name + PROGRAM_SUFFIX, 'r') @@ -109,7 +105,7 @@ def __init__(self, name, code=None, dom_code=None): self._thread = None self.name = name self._dom_code = dom_code - self._code = code + self._code = code def execute(self): if self._running: @@ -142,24 +138,13 @@ def run(self): #print "run.1" bot = coderbot.CoderBot.get_instance() program = self - try: - cam = camera.Camera.get_instance() - if config.Config.get().get("prog_video_rec") == "true": - get_cam().video_rec(program.name) - logging.debug("starting video") - except: - logging.error("Camera not available") - + exec(self._code) #print "run.2" except RuntimeError as re: logging.info("quit: " + str(re)) finally: - try: - get_cam().video_stop() #if video is running, stop it - get_motion().stop() - except: - logging.error("Camera not available") + self._running = False def as_json(self): @@ -170,4 +155,3 @@ def as_json(self): @classmethod def from_json(cls, map): return Program(name=map['name'], dom_code=map['dom_code'], code=map['code']) - diff --git a/static/.DS_Store b/static/.DS_Store deleted file mode 100644 index eb3d484ab7a4e310fbc4328f360460a1fa43aadc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-wpm5S|UmVJi~nlPE&B9ZiZ5;8LCyLUqkaK0yHpY#b3IpBKdrDMBQd+z;J7 z#OZh;3Lb`;-35UH6%sAS4A8r)z$xU>I6r&*{_>*Lx)GIyYVE_K7PTPzLgqXQQ`0w7k=tp#nGB`8N)^evVK@eYbGsfZ?3 z*bzgRbo5Ib=UXfdnsg9$_z?EV!cHhcKOOg%Ivj*=kXL4a8FH1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 384) { - $("#ui_control_left").width((width - contentWidth)/2); - $("#ui_control_center").width(contentWidth); - $("#ui_control_right").width((width - contentWidth)/2); + $("#ui_control_left").width(contentWidth); + $("#ui_control_center").width((width - contentWidth)/2); + $("#ui_control_right").width((width - contentWidth)/2); } else { - $("#ui_control_left").width((width)/2); - $("#ui_control_center").width(0); - $("#ui_control_right").width((width)/2); + $("#ui_control_left").width(0); + $("#ui_control_center").width((width)/2); + $("#ui_control_right").width((width)/2); } $(".ui-content-stream").height(contentHeight); @@ -40,7 +40,7 @@ $(document).on( "pageshow", '#page-control', function( event, ui ) { $(document).on( "pagecreate", '#page-control', function( event ) { if(Modernizr.touch){ - /* browser with either Touch Events of Pointer Events running on touch-capable device */ + /* browser with either Touch Events of Pointer Events running on touch-capable device */ $('#b_forward') .on("touchstart", function (){bot.move(CODERBOT_CTRL_FW_SPEED,CODERBOT_CTRL_FW_ELAPSE);}) .on("touchend", function (){bot.stop();}); @@ -98,7 +98,7 @@ $(document).on( "pagecreate", '#page-control', function( event ) { canvas.getContext('2d').drawImage(img.get(0), 0, 0, img.width(), img.height()); var pixelData = canvas.getContext('2d').getImageData(x, y, 1, 1).data; var colorHex = "#" + paddedHexString(pixelData[0]) + paddedHexString(pixelData[1]) + paddedHexString(pixelData[2]); - alert("Color at point: " + colorHex); + alert("Color at point: " + colorHex); }); $( ".photopopup" ).on({ popupbeforeposition: function() { @@ -111,7 +111,7 @@ $(document).on( "pagecreate", '#page-control', function( event ) { function paddedHexString(n) { var ns = n.toString(16); - return ("00" + ns).substring(ns.length); + return ("00" + ns).substring(ns.length); } @@ -128,7 +128,7 @@ function findPos(obj) { } $(document).on( "pagecreate", '#page-preferences', function( event ) { - $('#f_config').on("submit", function (){ + $('#f_config').on("submit", function (){ var form_data = $(this).serialize(); $.post(url='/config', form_data, success=function(){ alert(BotMessages.Saved); @@ -164,7 +164,7 @@ $(document).on( "pagecreate", '#page-preferences', function( event ) { }); $('#b_update').on("click", function (){ if(confirm(BotMessages.UpdateSystem)){ - $('#popup-update-system').popup('open'); + $('#popup-update-system').popup('open'); $.get(url='/update', success=function (data) { $('#i_update_system_log').text(data); $('#b_update_system_close').removeClass('ui-disabled'); @@ -191,7 +191,7 @@ $('li.ui-li-has-thumb').hover( function( event ) { $('video').on('loadeddata', function( event, ui ) { $( '#popup-video' ).popup( 'reposition', 'positionTo: window' ); }); - }, dataType="json"); + }, dataType="json"); }); $(document).on( "click", 'a[data-rel="popup"]', function( event ) { @@ -223,7 +223,7 @@ Mousetrap.bind(['command+alt+h', 'ctrl+alt+h'], function(e) { bot.halt(); } }); - + botStatus(); function botStatus() { diff --git a/static/js/program.js b/static/js/program.js index e4621188..e1134aa1 100644 --- a/static/js/program.js +++ b/static/js/program.js @@ -47,7 +47,7 @@ $(document).on( "pagecreate", '#page-program', function( event ) { }}); } catch (e) { alert(e); - } + } } function newProg() { @@ -73,7 +73,7 @@ $(document).on( "pagecreate", '#page-program', function( event ) { var name = progList[i]; $('#i_prog_list').append('
  • '+name+'

    Delete program
  • '); } - $('#i_prog_list').listview('refresh'); + $('#i_prog_list').listview('refresh'); $('.c_load_prog').on('click', loadProgPost); $('.c_delete_prog').on('click', deleteProg); $("#dialogLoadProg").popup("open", {transition: "pop"}); @@ -132,7 +132,7 @@ $(document).on( "pagecreate", '#page-program', function( event ) { } function deleteProg() { - var prog_element = $(this).parent('li'); + var prog_element = $(this).parent('li'); var name=prog_element.attr('data-prog-name'); if(confirm("Delete program " + name + "?")) { var data = {'name': name}; @@ -155,7 +155,7 @@ $(document).on( "pagecreate", '#page-program', function( event ) { var bot = new CoderBot(); // Generate Python code and run it. - window.LoopTrap = 1000; + window.LoopTrap = 1000; Blockly.Python.INFINITE_LOOP_TRAP = ' get_prog_eng().check_end()\n'; var code = Blockly.Python.workspaceToCode(); @@ -193,11 +193,11 @@ $(document).on( "pagecreate", '#page-program', function( event ) { console.log(data.running); if(!data.running) { $('#b_end_prog_d').text(BotMessages.ProgramDialogClose); - $('#i_dialog_running_title').text('CoderBot ' + BotMessages.ProgramStatusStop); + $('#i_dialog_running_title').text('RoverBot ' + BotMessages.ProgramStatusStop); } else { $('#b_end_prog_d').text(BotMessages.ProgramDialogStop); - $('#i_dialog_running_title').text('CoderBot ' + BotMessages.ProgramStatusRunning); + $('#i_dialog_running_title').text('RoverBot ' + BotMessages.ProgramStatusRunning); setTimeout(statusProg, 1000); - } + } }}); } diff --git a/templates/blocks_adv.xml b/templates/blocks_adv.xml index 1cd7b61b..455dce76 100644 --- a/templates/blocks_adv.xml +++ b/templates/blocks_adv.xml @@ -34,7 +34,6 @@ - @@ -82,112 +81,13 @@ - - - - - - - - - - - - - {% trans %}text{% endtrans %} - - - - - - - {% trans %}text{% endtrans %} - - - - - - - {% trans %}text{% endtrans %} - - - - - - - - - - - - - - 5 - - - - - - - - - {% trans %}list{% endtrans %} - - - - - - - {% trans %}list{% endtrans %} - - - - - - - {% trans %}list{% endtrans %} - - - - - - - {% trans %}list{% endtrans %} - - - - - - - - - - - - - - 10 - - - - - - - 90 - - - @@ -225,49 +125,27 @@ - {%if cam%} - - - - - - - - - - - - - - - - - - - + + + + + + 1.0 - + + - {%endif%} - - - - - - - - 100 - - + + + 1.0 - - + diff --git a/templates/config.html b/templates/config.html index 7545f00c..8b96751e 100644 --- a/templates/config.html +++ b/templates/config.html @@ -1,7 +1,7 @@
    {% trans %}Back{% endtrans %} -

    CoderBot

    +

    RoverBot

    -
    - - -
    {% trans %}Step timing | distance / angle{% endtrans %} @@ -34,12 +26,6 @@

    CoderBot

    -
    - - -
    - -
    @@ -49,21 +35,16 @@

    CoderBot

    - + - +
    {% trans %}Program editor details{% endtrans %} - -
    -
    - - -
    + @@ -72,47 +53,6 @@

    CoderBot

    -
    - {% trans %}Other program parameters{% endtrans %} - - -
    - - -
    -
    - - - - - - -
    -
    - {% trans %}Camera parameters{% endtrans %} - - - - - - - - - - - - - - - -
    @@ -120,7 +60,7 @@

    CoderBot

    - + @@ -130,28 +70,6 @@

    CoderBot

    -
    -
    - {% trans %}Button function{% endtrans %} - - - - -
    -
    -
    -
    - {% trans %}User Interface{% endtrans %} - - - - - - - - -
    -
    @@ -165,7 +83,8 @@

    CoderBot

    - + + - diff --git a/templates/control.html b/templates/control.html index 06862131..9a0685d6 100644 --- a/templates/control.html +++ b/templates/control.html @@ -11,72 +11,26 @@

    CoderBot

    -
    - {%if config.ctrl_counter%}
    - -
    {%endif%} -
    + +
    - {% if config.show_control_move_commands%}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - {% endif %} +
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    - -
    -
    -
    -
    {%if stream_port%} - {%endif%} -
    -
    -
    -
    {%if stream_port%} - - {%endif%} -
    -
    {%if stream_port%} - {%endif%} -
    -
    +
    -
    - -
    -
      -
    -
    - - -
    diff --git a/templates/index.html b/templates/index.html index 993c37f8..8ff1967e 100644 --- a/templates/index.html +++ b/templates/index.html @@ -3,7 +3,7 @@ - CoderBot + RoverBot