diff options
| author | Glenn Morris | 2008-06-13 08:04:56 +0000 |
|---|---|---|
| committer | Glenn Morris | 2008-06-13 08:04:56 +0000 |
| commit | 3f6f1d8e865e1e033dc88472270614b2db064a21 (patch) | |
| tree | 8930c0315946a41e9b0c07b654f87dfe71911595 /lisp | |
| parent | b8a9467ce973aace499e0352fd1c1719961fdc75 (diff) | |
| download | emacs-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/ChangeLog | 14 | ||||
| -rw-r--r-- | lisp/term.el | 272 |
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 @@ | |||
| 1 | 2008-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 | |||
| 1 | 2008-06-13 Glenn Morris <rgm@gnu.org> | 15 | 2008-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 |
| 1288 | it is alive (status RUN or STOP). BUFFER can be either a buffer or the | 1313 | is alive. BUFFER can be either a buffer or the name of one." |
| 1289 | name 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. | ||
| 4236 | Return t if this is a Unix-based system, where serial ports are | ||
| 4237 | files, such as /dev/ttyS0. | ||
| 4238 | Return nil if this is Windows or DOS, where serial ports have | ||
| 4239 | special 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. | ||
| 4269 | If `serial-read-speed' reads this string from the user, it | ||
| 4270 | returns nil, which is recognized by `serial-process-configure' | ||
| 4271 | for 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. | ||
| 4280 | Try to be nice by providing useful defaults and history. | ||
| 4281 | On Windows, prepend \\.\ to the port name unless it already | ||
| 4282 | contains a backslash. This handles the legacy ports COM1-COM9 as | ||
| 4283 | well 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. | ||
| 4323 | Try 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. | ||
| 4350 | PORT is the path or name of the serial port. For example, this | ||
| 4351 | could be \"/dev/ttyS0\" on Unix. On Windows, this could be | ||
| 4352 | \"COM1\" or \"\\\\.\\COM10\". | ||
| 4353 | SPEED is the speed of the serial port in bits per second. 9600 | ||
| 4354 | is a common value. SPEED can be nil, see | ||
| 4355 | `serial-process-configure' for details. | ||
| 4356 | The buffer is in Term mode; see `term-mode' for the commands to | ||
| 4357 | use 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. | ||
| 4383 | The 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 |