aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorGlenn Morris2008-06-13 08:04:56 +0000
committerGlenn Morris2008-06-13 08:04:56 +0000
commit3f6f1d8e865e1e033dc88472270614b2db064a21 (patch)
tree8930c0315946a41e9b0c07b654f87dfe71911595 /lisp
parentb8a9467ce973aace499e0352fd1c1719961fdc75 (diff)
downloademacs-3f6f1d8e865e1e033dc88472270614b2db064a21.tar.gz
emacs-3f6f1d8e865e1e033dc88472270614b2db064a21.zip
Daniel Engeler <engeler at gmail.com>
These changes add serial port access. (term-update-mode-line): Modify. (serial-port-is-file-p, serial-nice-speed-history) (serial-no-speed, serial-mode-line-speed-menu) (serial-mode-line-config-menu): New variables and constants. (serial-name-history, serial-speed-history) (serial-supported-or-barf, serial-read-name, serial-read-speed) (serial-term, serial-speed, serial-mode-line-speed-menu-1) (serial-mode-line-speed-menu, serial-update-speed-menu) (serial-mode-line-config-menu-1, serial-mode-line-config-menu) (serial-update-config-menu): New functions.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog14
-rw-r--r--lisp/term.el272
2 files changed, 278 insertions, 8 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 88ffde53e51..ab82fc72396 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,17 @@
12008-06-13 Daniel Engeler <engeler@gmail.com>
2
3 These changes add serial port access.
4 * term.el (term-update-mode-line): Modify.
5 (serial-port-is-file-p, serial-nice-speed-history)
6 (serial-no-speed, serial-mode-line-speed-menu)
7 (serial-mode-line-config-menu): New variables and constants.
8 (serial-name-history, serial-speed-history)
9 (serial-supported-or-barf, serial-read-name, serial-read-speed)
10 (serial-term, serial-speed, serial-mode-line-speed-menu-1)
11 (serial-mode-line-speed-menu, serial-update-speed-menu)
12 (serial-mode-line-config-menu-1, serial-mode-line-config-menu)
13 (serial-update-config-menu): New functions.
14
12008-06-13 Glenn Morris <rgm@gnu.org> 152008-06-13 Glenn Morris <rgm@gnu.org>
2 16
3 * menu-bar.el (menu-set-font): Use fboundp rather than functionp. 17 * menu-bar.el (menu-set-font): Use fboundp rather than functionp.
diff --git a/lisp/term.el b/lisp/term.el
index ecf7ed90dae..e9dad90736c 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -1277,18 +1277,42 @@ you type \\[term-send-input] which sends the current line to the inferior."
1277 (term-update-mode-line))) 1277 (term-update-mode-line)))
1278 1278
1279(defun term-update-mode-line () 1279(defun term-update-mode-line ()
1280 (setq mode-line-process 1280 (let ((term-mode (if (term-in-char-mode) "char" "line"))
1281 (if (term-in-char-mode) 1281 (term-page (when (term-pager-enabled) " page"))
1282 (if (term-pager-enabled) '(": char page %s") '(": char %s")) 1282 (serial-item-speed)
1283 (if (term-pager-enabled) '(": line page %s") '(": line %s")))) 1283 (serial-item-config)
1284 (temp)
1285 (proc (get-buffer-process (current-buffer))))
1286 (when (and (term-check-proc (current-buffer))
1287 (equal (process-type nil) 'serial))
1288 (let ((temp (serial-speed)))
1289 (setq serial-item-speed
1290 `(:propertize
1291 ,(or (and temp (format " %d" temp)) "")
1292 help-echo "mouse-1: Change the speed of the serial port"
1293 mouse-face mode-line-highlight
1294 local-map (keymap (mode-line keymap
1295 (down-mouse-1 . serial-mode-line-speed-menu-1))))))
1296 (let ((temp (process-contact proc :summary)))
1297 (setq serial-item-config
1298 `(:propertize
1299 ,(or (and temp (format " %s" temp)) "")
1300 help-echo "mouse-1: Change the configuration of the serial port"
1301 mouse-face mode-line-highlight
1302 local-map (keymap (mode-line keymap
1303 (down-mouse-1 . serial-mode-line-config-menu-1)))))))
1304 (setq mode-line-process
1305 (list ": " term-mode term-page
1306 serial-item-speed
1307 serial-item-config
1308 " %s")))
1284 (force-mode-line-update)) 1309 (force-mode-line-update))
1285 1310
1286(defun term-check-proc (buffer) 1311(defun term-check-proc (buffer)
1287 "True if there is a process associated w/buffer BUFFER, and 1312 "True if there is a process associated w/buffer BUFFER, and it
1288it is alive (status RUN or STOP). BUFFER can be either a buffer or the 1313is alive. BUFFER can be either a buffer or the name of one."
1289name of one."
1290 (let ((proc (get-buffer-process buffer))) 1314 (let ((proc (get-buffer-process buffer)))
1291 (and proc (memq (process-status proc) '(run stop))))) 1315 (and proc (memq (process-status proc) '(run stop open listen connect)))))
1292 1316
1293;;;###autoload 1317;;;###autoload
1294(defun make-term (name program &optional startfile &rest switches) 1318(defun make-term (name program &optional startfile &rest switches)
@@ -4205,6 +4229,238 @@ the process. Any more args are arguments to PROGRAM."
4205 (switch-to-buffer term-ansi-buffer-name)) 4229 (switch-to-buffer term-ansi-buffer-name))
4206 4230
4207 4231
4232;;; Serial terminals
4233;;; ===========================================================================
4234(defun serial-port-is-file-p ()
4235 "Guess whether serial ports are files on this system.
4236Return t if this is a Unix-based system, where serial ports are
4237files, such as /dev/ttyS0.
4238Return nil if this is Windows or DOS, where serial ports have
4239special identifiers such as COM1."
4240 (not (member system-type (list 'windows-nt 'cygwin 'ms-dos))))
4241
4242(defvar serial-name-history
4243 (if (serial-port-is-file-p)
4244 (or (when (file-exists-p "/dev/ttys0") (list "/dev/ttys0"))
4245 (when (file-exists-p "/dev/ttyS0") (list "/dev/ttyS0")))
4246 (list "COM1"))
4247 "History of serial ports used by `serial-read-name'.")
4248
4249(defvar serial-speed-history
4250 ;; Initialised with reasonable values for newbies.
4251 (list "9600" ;; Given twice because 9600 b/s is the most common speed
4252 "1200" "2400" "4800" "9600" "14400" "19200"
4253 "28800" "38400" "57600" "115200")
4254 "History of serial port speeds used by `serial-read-speed'.")
4255
4256(defun serial-nice-speed-history ()
4257 "Return `serial-speed-history' cleaned up for a mouse-menu."
4258 (let ((x) (y))
4259 (setq x
4260 (sort
4261 (copy-sequence serial-speed-history)
4262 '(lambda (a b) (when (and (stringp a) (stringp b))
4263 (> (string-to-number a) (string-to-number b))))))
4264 (dolist (i x) (when (not (equal i (car y))) (push i y)))
4265 y))
4266
4267(defconst serial-no-speed "nil"
4268 "String for `serial-read-speed' for special serial ports.
4269If `serial-read-speed' reads this string from the user, it
4270returns nil, which is recognized by `serial-process-configure'
4271for special serial ports that cannot be configured.")
4272
4273(defun serial-supported-or-barf ()
4274 "Signal an error if serial processes are not supported"
4275 (unless (fboundp 'make-serial-process)
4276 (error "Serial processes are not supported on this system")))
4277
4278(defun serial-read-name ()
4279 "Read a serial port name from the user.
4280Try to be nice by providing useful defaults and history.
4281On Windows, prepend \\.\ to the port name unless it already
4282contains a backslash. This handles the legacy ports COM1-COM9 as
4283well as the newer ports COM10 and higher."
4284 (serial-supported-or-barf)
4285 (let* ((file-name-history serial-name-history)
4286 (h (car file-name-history))
4287 (x (if (serial-port-is-file-p)
4288 (read-file-name
4289 ;; `prompt': The most recently used port is provided as
4290 ;; the default value, which is used when the user
4291 ;; simply presses return.
4292 (if (stringp h) (format "Serial port (default %s): " h)
4293 "Serial port: ")
4294 ;; `directory': Most systems have their serial ports
4295 ;; in the same directory, so start in the directory
4296 ;; of the most recently used port, or in a reasonable
4297 ;; default directory.
4298 (or (and h (file-name-directory h))
4299 (and (file-exists-p "/dev/") "/dev/")
4300 (and (file-exists-p "/") "/"))
4301 ;; `default': This causes (read-file-name) to return
4302 ;; the empty string if he user simply presses return.
4303 ;; Using nil here may result in a default directory
4304 ;; of the current buffer, which is not useful for
4305 ;; serial port.
4306 "")
4307 (read-from-minibuffer
4308 (if (stringp h) (format "Serial port (default %s): " h)
4309 "Serial port: ")
4310 nil nil nil '(file-name-history . 1) nil nil))))
4311 (if (or (null x) (and (stringp x) (zerop (length x))))
4312 (setq x h)
4313 (setq serial-name-history file-name-history))
4314 (when (or (null x) (and (stringp x) (zerop (length x))))
4315 (error "No serial port selected"))
4316 (when (and (not (serial-port-is-file-p))
4317 (not (string-match "\\\\" x)))
4318 (set 'x (concat "\\\\.\\" x)))
4319 x))
4320
4321(defun serial-read-speed ()
4322 "Read a serial port speed (in bits per second) from the user.
4323Try to be nice by providing useful defaults and history."
4324 (serial-supported-or-barf)
4325 (let* ((history serial-speed-history)
4326 (h (car history))
4327 (x (read-from-minibuffer
4328 (cond ((string= h serial-no-speed)
4329 "Speed (default nil = set by port): ")
4330 (h
4331 (format "Speed (default %s b/s): " h))
4332 (t
4333 (format "Speed (b/s): ")))
4334 nil nil nil '(history . 1) nil nil)))
4335 (when (or (null x) (and (stringp x) (zerop (length x))))
4336 (setq x h))
4337 (when (or (null x) (not (stringp x)) (zerop (length x)))
4338 (error "Invalid speed"))
4339 (if (string= x serial-no-speed)
4340 (setq x nil)
4341 (setq x (string-to-number x))
4342 (when (or (null x) (not (integerp x)) (<= x 0))
4343 (error "Invalid speed")))
4344 (setq serial-speed-history history)
4345 x))
4346
4347;;;###autoload
4348(defun serial-term (port speed)
4349 "Start a terminal-emulator for a serial port in a new buffer.
4350PORT is the path or name of the serial port. For example, this
4351could be \"/dev/ttyS0\" on Unix. On Windows, this could be
4352\"COM1\" or \"\\\\.\\COM10\".
4353SPEED is the speed of the serial port in bits per second. 9600
4354is a common value. SPEED can be nil, see
4355`serial-process-configure' for details.
4356The buffer is in Term mode; see `term-mode' for the commands to
4357use in that buffer.
4358\\<term-raw-map>Type \\[switch-to-buffer] to switch to another buffer."
4359 (interactive (list (serial-read-name) (serial-read-speed)))
4360 (serial-supported-or-barf)
4361 (let* ((process (make-serial-process
4362 :port port
4363 :speed speed
4364 :coding 'no-conversion
4365 :noquery t))
4366 (buffer (process-buffer process)))
4367 (save-excursion
4368 (set-buffer buffer)
4369 (term-mode)
4370 (term-char-mode)
4371 (goto-char (point-max))
4372 (set-marker (process-mark process) (point))
4373 (set-process-filter process 'term-emulate-terminal)
4374 (set-process-sentinel process 'term-sentinel))
4375 (switch-to-buffer buffer)
4376 buffer))
4377
4378(defvar serial-mode-line-speed-menu nil)
4379(defvar serial-mode-line-config-menu nil)
4380
4381(defun serial-speed ()
4382 "Return the speed of the serial port of the current buffer's process.
4383The return value may be nil for a special serial port."
4384 (process-contact (get-buffer-process (current-buffer)) :speed))
4385
4386(defun serial-mode-line-speed-menu-1 (event)
4387 (interactive "e")
4388 (save-selected-window
4389 (select-window (posn-window (event-start event)))
4390 (serial-update-speed-menu)
4391 (let* ((selection (serial-mode-line-speed-menu event))
4392 (binding (and selection (lookup-key serial-mode-line-speed-menu
4393 (vector (car selection))))))
4394 (when binding (call-interactively binding)))))
4395
4396(defun serial-mode-line-speed-menu (event)
4397 (x-popup-menu event serial-mode-line-speed-menu))
4398
4399(defun serial-update-speed-menu ()
4400 (setq serial-mode-line-speed-menu (make-sparse-keymap "Speed (b/s)"))
4401 (define-key serial-mode-line-speed-menu [serial-mode-line-speed-menu-other]
4402 '(menu-item "Other..."
4403 (lambda (event) (interactive "e")
4404 (let ((speed (serial-read-speed)))
4405 (serial-process-configure :speed speed)
4406 (term-update-mode-line)
4407 (message "Speed set to %d b/s" speed)))))
4408 (dolist (str (serial-nice-speed-history))
4409 (let ((num (or (and (stringp str) (string-to-number str)) 0)))
4410 (define-key
4411 serial-mode-line-speed-menu
4412 (vector (make-symbol (format "serial-mode-line-speed-menu-%s" str)))
4413 `(menu-item
4414 ,str
4415 (lambda (event) (interactive "e")
4416 (serial-process-configure :speed ,num)
4417 (term-update-mode-line)
4418 (message "Speed set to %d b/s" ,num))
4419 :button (:toggle . (= (serial-speed) ,num)))))))
4420
4421(defun serial-mode-line-config-menu-1 (event)
4422 (interactive "e")
4423 (save-selected-window
4424 (select-window (posn-window (event-start event)))
4425 (serial-update-config-menu)
4426 (let* ((selection (serial-mode-line-config-menu event))
4427 (binding (and selection (lookup-key serial-mode-line-config-menu
4428 (vector (car selection))))))
4429 (when binding (call-interactively binding)))))
4430
4431(defun serial-mode-line-config-menu (event)
4432 (x-popup-menu event serial-mode-line-config-menu))
4433
4434(defun serial-update-config-menu ()
4435 (setq serial-mode-line-config-menu (make-sparse-keymap "Configuration"))
4436 (let ((config (process-contact
4437 (get-buffer-process (current-buffer)) t))
4438 (y)
4439 (str))
4440 (dolist (y '((:flowcontrol hw "Hardware flowcontrol (RTS/CTS)")
4441 (:flowcontrol sw "Software flowcontrol (XON/XOFF)")
4442 (:flowcontrol nil "No flowcontrol")
4443 (:stopbits 2 "2 stopbits")
4444 (:stopbits 1 "1 stopbit")
4445 (:parity odd "Odd parity")
4446 (:parity even "Even parity")
4447 (:parity nil "No parity")
4448 (:bytesize 7 "7 bits per byte")
4449 (:bytesize 8 "8 bits per byte")))
4450 (define-key serial-mode-line-config-menu
4451 (vector (make-symbol (format "%s-%s" (nth 0 y) (nth 1 y))))
4452 `(menu-item
4453 ,(nth 2 y)
4454 (lambda (event) (interactive "e")
4455 (serial-process-configure ,(nth 0 y) ',(nth 1 y))
4456 (term-update-mode-line)
4457 (message "%s" ,(nth 2 y)))
4458 ;; Use :toggle instead of :radio because a non-standard port
4459 ;; configuration may not match any menu items.
4460 :button (:toggle . ,(equal (plist-get config (nth 0 y))
4461 (nth 1 y))))))))
4462
4463
4208;;; Converting process modes to use term mode 4464;;; Converting process modes to use term mode
4209;;; =========================================================================== 4465;;; ===========================================================================
4210;;; Renaming variables 4466;;; Renaming variables