help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: the Elisp robot [photo]


From: Emanuel Berg
Subject: Re: the Elisp robot [photo]
Date: Wed, 21 Oct 2020 16:24:24 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)

Jean Louis wrote:

> And how does the internal OS communicates with
> robot commands? Are those shell commands or how?

It comes with files that represent different parts of
the robot.

The Elisp reads and writes to these files.

Here is one file that is a good example:

;;; -*- lexical-binding: t -*-
;;;
;;; this file:
;;;   http://user.it.uu.se/~embe8573/terror-3/ev3-motor.el
;;;   https://dataswamp.org/~incal/terror-3/ev3-motor.el

(require 'cl-lib)
(require 'ev3-motor-init)
(require 'file-write-to)

;; speed files / getters / setters
;; NB: digit in a/the speed file, not measured/actual droid speed

(defun get-motor-speed-file (motor)
  (cl-case motor
    ('left   left-motor-speed-file)
    ('right  right-motor-speed-file)
    ('medium medium-motor-speed-file) ))

(defun get-motor-speed (motor)
  (file-to-integer (get-motor-speed-file motor) ))

(defun set-motor-speed (motor speed)
  (write-to-file-integer (get-motor-speed-file motor) speed) )

;; commands

(defun get-motor-cmd-file (motor)
  (cl-case motor
    ('left   left-motor-cmd-file)
    ('right  right-motor-cmd-file)
    ('medium medium-motor-cmd-file) ))

(defun motor-cmd (motor cmd)
  (write-to-file (get-motor-cmd-file motor) cmd) )

(defun run-forever (motor)
  (motor-cmd motor "run-forever") )

(defun stop (motor)
  (motor-cmd motor "stop") )

;; individual motor control
;;
;; NB 1: most often, these are not used directly, instead use
;;       the interactive functions in ev3-motor-rotate.el,
;;       ev3-motor-straight.el, etc
;;
;; NB 2: always set motor speed thru `set-motor'
;;       in order to set both speed AND issue robot command
;;       as well as to check that speed doesn't exceed the max speed

(defvar *max-speed* nil)

(defun set-motor (motor speed)
  (let*((max-speed (or *max-speed* (setq *max-speed* 1050))) ;; TODO: get from 
file here
        (min-speed (- max-speed) ))
    (when (and (<= min-speed speed)
               (<= speed max-speed) )
      (set-motor-speed motor speed)
      (if (zerop speed) (stop motor)
        (run-forever motor) ))))

(defun set-motor-left (speed)
  (set-motor 'left speed) )

(defun set-motor-right (speed)
  (set-motor 'right speed) )

(defun set-motor-both (speed &optional right)
  (set-motor 'left  speed)
  (set-motor 'right (or right speed)) )

(defun stop-motor-left ()
  (set-motor 'left 0) )

(defun stop-motor-right ()
  (set-motor 'right 0) )

(defun stop-motor-both ()
  (stop-motor-left)
  (stop-motor-right) )

(provide 'ev3-motor)


-- 
underground experts united
http://user.it.uu.se/~embe8573
https://dataswamp.org/~incal




reply via email to

[Prev in Thread] Current Thread [Next in Thread]