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.cfg b/coderbot.cfg index 47fa3526..7e5ef258 100644 --- a/coderbot.cfg +++ b/coderbot.cfg @@ -1 +1 @@ -{"move_tr_speed": "80", "move_fw_elapse": "1", "camera_color_object_size_min": "4000", "camera_path_object_size_min": "4000", "load_at_start": "", "move_tr_elapse": "0.5", "sound_stop": "$shutdown.mp3", "prog_video_rec": "true", "show_control_move_commands": "true", "prog_level": "adv", "prog_scrollbars": "true", "move_fw_speed": "100", "camera_color_object_size_max": "160000", "sound_shutter": "$shutter.mp3", "show_page_prefs": "true", "cv_image_factor": "4", "ctrl_hud_image": "", "button_func": "none", "ctrl_fw_elapse": "-1", "ctrl_tr_elapse": "-1", "move_power_angle_2": "60", "move_power_angle_3": "60", "move_power_angle_1": "40", "move_motor_trim": "1.1", "show_page_program": "true", "sound_start": "$startup.mp3", "camera_exposure_mode": "auto", "ctrl_tr_speed": "80", "ctrl_fw_speed": "100", "camera_refresh_timeout": "0.1", "camera_jpeg_quality": "20", "prog_maxblocks": "-1", "move_motor_mode": "dc", "camera_path_object_size_max": "160000", "show_page_control": "true"} \ No newline at end of file +{"move_tr_speed": "80", "move_fw_elapse": "1", "load_at_start": "", "move_tr_elapse": "0.5", "show_control_move_commands": "true", "prog_level": "adv", "prog_scrollbars": "true", "move_fw_speed": "100", "ctrl_fw_elapse": "-1", "ctrl_tr_elapse": "-1", "move_power_angle_2": "60", "move_power_angle_3": "60", "move_power_angle_1": "40", "move_motor_trim": "1.1", "show_page_program": "true", "ctrl_tr_speed": "80", "ctrl_fw_speed": "100", "prog_maxblocks": "-1", "move_motor_mode": "dc", "show_page_control": "true"} \ No newline at end of file diff --git a/coderbot.py b/coderbot.py index 7900e8b8..42dbc9cd 100644 --- a/coderbot.py +++ b/coderbot.py @@ -23,38 +23,40 @@ import config import logging import sonar +import awesomeoutput +import awesomeinput + 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 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,12 +122,21 @@ 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 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 +219,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 +235,3 @@ def reboot(self): def sleep(self, elapse): time.sleep(elapse) - - 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 eb3d484a..00000000 Binary files a/static/.DS_Store and /dev/null differ diff --git a/static/css/.DS_Store b/static/css/.DS_Store deleted file mode 100644 index 5008ddfc..00000000 Binary files a/static/css/.DS_Store and /dev/null differ diff --git a/static/js/.DS_Store b/static/js/.DS_Store deleted file mode 100644 index 5008ddfc..00000000 Binary files a/static/js/.DS_Store and /dev/null differ diff --git a/static/js/blockly/blocks.js b/static/js/blockly/blocks.js index fb42b1df..df5d04e5 100644 --- a/static/js/blockly/blocks.js +++ b/static/js/blockly/blocks.js @@ -35,7 +35,7 @@ Blockly.Blocks['coderbot_repeat'] = { di.appendField(new Blockly.FieldImage('/images/blocks/loop_repeat.png', 32, 32, '*')); } else { di.appendField(Blockly.Msg.CONTROLS_REPEAT_TITLE_REPEAT) - } + } di.appendField(new Blockly.FieldTextInput('10', Blockly.FieldTextInput.nonnegativeIntegerValidator), 'TIMES'); if(CODERBOT_PROG_LEVEL.indexOf("basic")<0) { @@ -63,13 +63,6 @@ Blockly.Python['coderbot_repeat'] = function(block) { return code; }; -Blockly.Python['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_NONE) || '\'\''; - return 'get_cam().set_text(' + argument0 + ')\n'; -}; - Blockly.Blocks['coderbot_moveForward'] = { // Block for moving forward. @@ -118,9 +111,9 @@ Blockly.Blocks['coderbot_moveBackward'] = { Blockly.Python['coderbot_moveBackward'] = function(block) { // Generate Python for moving forward. - if(CODERBOT_PROG_MOVE_MOTION) { + if(CODERBOT_PROG_MOVE_MOTION) { return 'get_motion().move(dist=' + (-CODERBOT_MOV_FW_DEF_ELAPSE) + ')\n'; - + } else { return 'get_bot().backward(speed=' + CODERBOT_MOV_FW_DEF_SPEED + ', elapse=' + CODERBOT_MOV_FW_DEF_ELAPSE + ')\n'; } @@ -177,7 +170,7 @@ Blockly.Python['coderbot_turnRight'] = function(block) { } else { return 'get_bot().right(speed=' + CODERBOT_MOV_TR_DEF_SPEED + ', elapse=' + CODERBOT_MOV_TR_DEF_ELAPSE + ')\n'; - } + } }; Blockly.Blocks['coderbot_audio_say'] = { @@ -242,7 +235,7 @@ Blockly.Blocks['coderbot_adv_move'] = { [Blockly.Msg.CODERBOT_MOVE_ADV_TIP_RIGHT, 'RIGHT']] this.setHelpUrl('http://code.google.com/p/blockly/wiki/Move'); this.setColour(40); - + this.appendDummyInput("ACTION") .appendField(Blockly.Msg.CODERBOT_MOVE_ADV_MOVE) .appendField(new Blockly.FieldDropdown(ACTIONS), 'ACTION'); @@ -345,7 +338,7 @@ Blockly.Blocks['coderbot_adv_motor'] = { init: function() { this.setHelpUrl('http://code.google.com/p/blockly/wiki/Motor'); this.setColour(40); - + this.appendValueInput('SPEED_LEFT') .setCheck('Number') .appendField(Blockly.Msg.CODERBOT_MOVE_ADV_MOTOR + " " + Blockly.Msg.CODERBOT_MOVE_ADV_MOTOR_SPEED_LEFT); @@ -590,7 +583,7 @@ Blockly.Blocks['coderbot_cam_average'] = { this.setColour(250); this.appendDummyInput() .appendField(Blockly.Msg.CODERBOT_SENSOR_AVERAGE) - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.CODERBOT_SENSOR_AVERAGE_HUE, 'H'], + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.CODERBOT_SENSOR_AVERAGE_HUE, 'H'], [Blockly.Msg.CODERBOT_SENSOR_AVERAGE_SATURATION, 'S'], [Blockly.Msg.CODERBOT_SENSOR_AVERAGE_VALUE, 'V'], [Blockly.Msg.CODERBOT_SENSOR_AVERAGE_ALL,'ALL']]), 'RETVAL') @@ -618,7 +611,7 @@ Blockly.Blocks['coderbot_adv_findText'] = { this.setColour(250); this.appendDummyInput() .appendField(Blockly.Msg.CODERBOT_SENSOR_FINDTEXT_FIND) - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.CODERBOT_SENSOR_FINDTEXT_ACCEPT_ALPHA, 'alpha'], + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.CODERBOT_SENSOR_FINDTEXT_ACCEPT_ALPHA, 'alpha'], [Blockly.Msg.CODERBOT_SENSOR_FINDTEXT_ACCEPT_NUM, 'num'], [Blockly.Msg.CODERBOT_SENSOR_FINDTEXT_ACCEPT_ALPHANUM,'alphanum'], [Blockly.Msg.CODERBOT_SENSOR_FINDTEXT_ACCEPT_UNSPEC,'unspec']]), 'ACCEPT') @@ -631,13 +624,6 @@ Blockly.Blocks['coderbot_adv_findText'] = { } }; -Blockly.Python['coderbot_adv_findText'] = function(block) { - // Boolean values true and false. - var accept = block.getFieldValue('ACCEPT'); - var color = Blockly.Python.valueToCode(block, 'COLOR', Blockly.Python.ORDER_NONE); - var code = 'get_cam().find_text(accept="' + accept + '", back_color=' + color + ')'; - return [code, Blockly.Python.ORDER_ATOMIC]; -}; Blockly.Blocks['coderbot_adv_findCode'] = { /** @@ -802,9 +788,7 @@ Blockly.Blocks['coderbot_sonar_get_distance'] = { this.setColour(250); this.appendDummyInput() .appendField(Blockly.Msg.CODERBOT_SONAR_GET_DISTANCE) - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.CODERBOT_SONAR_SENSOR_1, "0"], - [Blockly.Msg.CODERBOT_SONAR_SENSOR_2, "1"], - [Blockly.Msg.CODERBOT_SONAR_SENSOR_3, "2"]]), 'SONAR'); + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.CODERBOT_SONAR_SENSOR_1, "0"]]), 'SONAR'); this.setOutput(true, 'Number'); this.setTooltip(Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP); } @@ -817,3 +801,60 @@ Blockly.Python['coderbot_sonar_get_distance'] = function(block) { return [code, Blockly.Python.ORDER_ATOMIC]; }; +Blockly.Blocks['awesome_led'] = { + init: function() { + this.appendDummyInput() + .appendField("LED connected to Pin") + .appendField(new Blockly.FieldDropdown([["04","4"], ["22","22"], ["23","23"], ["24","24"], ["27","27"]]), "GPIO") + .appendField("is") + .appendField(new Blockly.FieldDropdown([["ON","1"], ["OFF","0"]]), "LED_State"); +// this.setOutput(true, 'Number'); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(230); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Python['awesome_led'] = function(block) { + var dropdown_gpio = block.getFieldValue('GPIO'); + var dropdown_led_state = block.getFieldValue('LED_State'); + var code = 'get_bot().ledOutput(' + dropdown_gpio + ', ' + dropdown_led_state + ' )\n'; + return code; +}; + +Blockly.Blocks['awesome_button'] = { + init: function() { + this.appendDummyInput() + .appendField("Button connected to Pin") + .appendField(new Blockly.FieldDropdown([["04","4"], ["22","22"], ["23","23"], ["24","24"], ["27","27"]]), "GPIO") + .appendField("is pressed") + this.setOutput(true, 'Boolean') + this.setColour(230); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Python['awesome_button'] = function(block) { + var dropdown_gpio = block.getFieldValue('GPIO'); + var code = 'get_bot().buttonInput(' + dropdown_gpio + ')'; + return [code, Blockly.Python.ORDER_NONE]; +}; + +Blockly.Blocks['awesome_line_sensor'] = { + init: function() { + this.appendDummyInput() + .appendField("Detect Line") + this.setOutput(true, 'Boolean') + this.setColour(230); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Python['awesome_line_sensor'] = function(block) { + var code = 'get_bot().lineSensor()'; + return [code, Blockly.Python.ORDER_NONE]; +}; diff --git a/static/js/control.js b/static/js/control.js index 772a3906..cdb3ea29 100644 --- a/static/js/control.js +++ b/static/js/control.js @@ -2,7 +2,7 @@ var bot = new CoderBot('#b_counter'); $(document).on( "pagecontainershow", function(){ ScaleContentToDevice(); - + $(window).on("resize orientationchange", function(){ ScaleContentToDevice(); }) @@ -12,20 +12,20 @@ function ScaleContentToDevice(){ scroll(0, 0); var w = $( window ).width(); var h = $( window ).height(); - + var width = w; var height = h - $(".ui-header").outerHeight() - $(".ui-footer").outerHeight(); var contentHeight = height - $(".ui-content").outerHeight() + $(".ui-content").height(); var contentWidth = (contentHeight * 4) / 3; if (width - contentWidth > 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

    @@ -10,21 +10,13 @@

    CoderBot

    -
    - - -
    {% 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 %} - - - - - - - - -
    -
    {% trans %}WiFi Client access mode{% endtrans %}
    @@ -165,7 +83,8 @@

    CoderBot

    {% trans %}Cancel{% endtrans %}
    - + + - diff --git a/templates/control.html b/templates/control.html index 06862131..79b130e7 100644 --- a/templates/control.html +++ b/templates/control.html @@ -2,7 +2,6 @@
    Online

    CoderBot

    - {%if config.show_page_prefs%}{% trans %}Preferences{% endtrans %}{%endif%}
    -
    - {%if config.ctrl_counter%}
    - -
    {%endif%} -
    + +
    - {% if config.show_control_move_commands%}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - {% endif %} +
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -
    -
    - -
    -
    -
    -
    {%if stream_port%} - {%endif%} -
    -
    -
    -
    {%if stream_port%} - - {%endif%} -
    -
    {%if stream_port%} - {%endif%} -
    -
    +
    -
    -
    - {% trans %}Back{% endtrans %} -

    CoderBot

    -
    -
    -
      -
    -
    - - -
    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