diff --git a/arduino-mode-init.el b/arduino-mode-init.el new file mode 100644 index 0000000..341a9fe --- /dev/null +++ b/arduino-mode-init.el @@ -0,0 +1,2 @@ +(autoload 'arduino-mode "arduino-mode" "Major mode for editing Arduino code." t) +(add-to-list 'auto-mode-alist '("\\.pde\\'" . arduino-mode)) diff --git a/arduino-mode.el b/arduino-mode.el index 0f434b5..224e429 100644 --- a/arduino-mode.el +++ b/arduino-mode.el @@ -33,7 +33,8 @@ (eval-when-compile (require 'cc-langs) (require 'cc-fonts) - (require 'cc-menus)) + (require 'cc-menus) + (require 'term)) (eval-and-compile ;; fall back on c-mode @@ -49,22 +50,26 @@ (c-lang-defconst c-simple-stmt-kwds arduino (append '("pinMode" "digitalWrite" "digitalRead" ; Digital I/O - "analogRead" "analogWrite" ; Analog I/O - "shiftOut" "pulseIn" ; Advanced I/O - "millis" "delay" "delayMicroseconds" ; Time - "min" "max" "abs" "constrain" "map" "pow" "sq" "sqrt" "sin" ; Math + "analogReference" "analogRead" "analogWrite" ; Analog I/O + "tone" "noTone" "shiftIn" "shiftOut" "pulseIn" ; Advanced I/O + "millis" "micros" "delay" "delayMicroseconds" ; Time + "min" "max" "abs" "constrain" "map" "pow" "sq" "sqrt" ; Math "sin" "cos" "tan" ; Trigonometry "randomSeed" "random" ; Random Numbers + "lowByte" "highByte" "bitRead" "bitWrite" "bitSet" ; Bits and Bytes + "bitClear" "bit" "attachInterrupt" "detachInterrupt" ; External Interrupts "interrupts" "noInterrupts" ; Interrupts - "begin" "available" "read" "flush" "print" "println") ; Serial Communication + "begin" "end" "available" "read" "flush" "print" "println" ; Serial Communication + "write" "peek") (c-lang-const c-simple-stmt-kwds))) (c-lang-defconst c-primary-expr-kwds arduino (append '("Serial") (c-lang-const c-primary-expr-kwds))) -(defgroup arduino nil "Arduino mode customizations") +(defgroup arduino nil "Arduino mode customizations" + :group 'languages) (defcustom arduino-font-lock-extra-types nil "*List of extra types (aside from the type keywords) to recognize in Arduino mode. @@ -102,10 +107,72 @@ Each list item should be a regexp matching a single identifier." :group 'arduino ;; Add bindings which are only useful for Arduino map) "Keymap used in arduino-mode buffers.") +(define-key arduino-mode-map "\C-cg" 'arduino-upload) +(unless (string-match "XEmacs" emacs-version) + (define-key arduino-mode-map "\C-cm" 'arduino-serial-monitor)) (easy-menu-define arduino-menu arduino-mode-map "Arduino Mode Commands" (cons "Arduino" (c-lang-const c-mode-menu arduino))) +; How does one add this directly to the Arduino menu in XEmacs? +(if (string-match "XEmacs" emacs-version) + (easy-menu-add-item arduino-menu + (list "Micro-controller") ["Upload" arduino-upload t]) + (easy-menu-add-item arduino-menu + nil ["----" nil nil]) + (easy-menu-add-item arduino-menu + nil ["Upload" arduino-upload t]) + (easy-menu-add-item arduino-menu + nil ["Serial monitor" arduino-serial-monitor t])) + +(defcustom arduino-makefile-name "Makefile" + "Name of Makefile used to compile and upload Arduino sketches." + :type 'string + :group 'arduino) + +(defun arduino-upload () + "Upload a sketch to an Arduino board. + +You will need a suitable Makefile. See URL +`http://mjo.tc/atelier/2009/02/arduino-cli.html'." + (interactive) + (if (file-exists-p arduino-makefile-name) + (progn + (make-local-variable 'compile-command) + (compile (concat "make -f " arduino-makefile-name " -k upload"))) + (if (y-or-n-p (concat "No Makefile `" arduino-makefile-name + "' exists. Create it? ")) + (let ((arduino-project-name + (file-name-nondirectory + (file-name-sans-extension (buffer-file-name))))) + (find-file-other-window arduino-makefile-name) + (insert "# Customise the following values as required: + +TARGET = " arduino-project-name " +ARDUINO_LIBS = + +MCU = atmega328p +F_CPU = 16000000 +ARDUINO_PORT = /dev/ttyUSB* +AVRDUDE_ARD_BAUDRATE = 57600 +ARDUINO_DIR = /usr/share/arduino + +# If you do not already have Arduino.mk, find it at +# http://mjo.tc/atelier/2009/02/arduino-cli.html +include /usr/share/arduino/Arduino.mk +") + (message "Edit the Makefile as required and re-run arduino-upload.")) + (message (concat "No Makefile `" arduino-makefile-name "' exists. Uploading cancelled."))))) + +(unless (string-match "XEmacs" emacs-version) + (defun arduino-serial-monitor (port speed) + "Monitor the serial connection to the Arduino." + (interactive (list (serial-read-name) nil)) + + (if (get-buffer-process port) + (switch-to-buffer port) + (serial-term port (or speed (serial-read-speed)))))) + ;;;###autoload (add-to-list 'auto-mode-alist '("\\.pde\\'" . arduino-mode)) @@ -127,7 +194,7 @@ Key bindings: local-abbrev-table arduino-mode-abbrev-table abbrev-mode t imenu-generic-expression cc-imenu-c-generic-expression) - (use-local-map c-mode-map) + (use-local-map arduino-mode-map) ;; `c-init-language-vars' is a macro that is expanded at compile ;; time to a large `setq' with all the language variables and their ;; customized values for our language. diff --git a/emacs-common-arduino-mode.spec b/emacs-common-arduino-mode.spec new file mode 100644 index 0000000..908175b --- /dev/null +++ b/emacs-common-arduino-mode.spec @@ -0,0 +1,149 @@ +%global pkg arduino-mode +%global pkgname Arduino Mode +%global gitcommit aa051bb + +Name: emacs-common-%{pkg} +Version: 0 +Release: 0.3.20100907git%{gitcommit}%{?dist} +Summary: Emacs editing mode for Arduino code + +Group: Development/Tools +License: GPLv3+ +URL: http://github.com/mavit/%{pkg}/ +Source0: http://download.github.com/mavit-%{pkg}-%{gitcommit}.tar.gz + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildArch: noarch +BuildRequires: emacs xemacs xemacs-packages-extra +Requires: arduino-mk + +%description +%{pkgname} is an add-on package for GNU Emacs and XEmacs, providing an +editing mode for the Arduino electronics prototyping platform. + +This package contains the files common to both the GNU Emacs and XEmacs +%{pkgname} packages. + + +%package -n emacs-%{pkg} +Summary: Compiled elisp files to run %{pkgname} under GNU Emacs +Group: Development/Tools +Requires: emacs(bin) >= %{_emacs_version} +Requires: emacs-common-%{pkg} = %{version}-%{release} + +%description -n emacs-%{pkg} +This package contains the byte compiled elisp packages to run +%{pkgname} with GNU Emacs. + + +%package -n emacs-%{pkg}-el +Summary: Elisp source files for %{pkgname} under GNU Emacs +Group: Development/Tools +Requires: emacs-%{pkg} = %{version}-%{release} + +%description -n emacs-%{pkg}-el +This package contains the elisp source files for %{pkgname} under GNU +Emacs. You do not need to install this package to run +%{pkgname}. Install the emacs-%{pkg} package to use %{pkgname} with +GNU Emacs. + + +%package -n xemacs-%{pkg} +Summary: Compiled elisp files to run %{pkgname} under XEmacs +Group: Development/Tools +Requires: xemacs(bin) >= %{_xemacs_version} +Requires: emacs-common-%{pkg} = %{version}-%{release} + +%description -n xemacs-%{pkg} +This package contains the byte compiled elisp packages to use %{pkgname} +with XEmacs. + + +%package -n xemacs-%{pkg}-el +Summary: Elisp source files for %{pkgname} under XEmacs +Group: Development/Tools +Requires: xemacs-%{pkg} = %{version}-%{release} + +%description -n xemacs-%{pkg}-el +This package contains the elisp source files for %{pkgname} under +XEmacs. You do not need to install this package to run +%{pkgname}. Install the xemacs-%{pkg} package to use %{pkgname} with +XEmacs. + + +%prep +%setup -q -n mavit-%{pkg}-%{gitcommit} + + +%build +%{_emacs_bytecompile} %{pkg}.el +mv %{pkg}.elc %{pkg}.gnu.elc +%{_xemacs_bytecompile} %{pkg}.el + + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/%{_emacs_sitelispdir}/%{pkg} \ + $RPM_BUILD_ROOT/%{_xemacs_sitelispdir}/%{pkg} \ + $RPM_BUILD_ROOT/%{_emacs_sitestartdir} \ + $RPM_BUILD_ROOT/%{_xemacs_sitestartdir} +cp -a %{pkg}.el $RPM_BUILD_ROOT/%{_emacs_sitelispdir}/%{pkg}/ +cp -a %{pkg}.gnu.elc $RPM_BUILD_ROOT/%{_emacs_sitelispdir}/%{pkg}/%{pkg}.elc +cp -a %{pkg}.el %{pkg}.elc $RPM_BUILD_ROOT/%{_xemacs_sitelispdir}/%{pkg}/ +cp -a %{pkg}-init.el $RPM_BUILD_ROOT/%{_emacs_sitestartdir}/ +cp -a %{pkg}-init.el $RPM_BUILD_ROOT/%{_xemacs_sitestartdir}/ + + +%clean +rm -rf $RPM_BUILD_ROOT + + +%files +%defattr(-,root,root,-) +%doc + + +%files -n emacs-%{pkg} +%defattr(-,root,root,-) +%{_emacs_sitelispdir}/%{pkg}/*.elc +%{_emacs_sitestartdir}/*.el +%dir %{_emacs_sitelispdir}/%{pkg} + + +%files -n emacs-%{pkg}-el +%defattr(-,root,root,-) +%{_emacs_sitelispdir}/%{pkg}/*.el + + +%files -n xemacs-%{pkg} +%defattr(-,root,root,-) +%{_xemacs_sitelispdir}/%{pkg}/*.elc +%{_xemacs_sitestartdir}/*.el +%dir %{_xemacs_sitelispdir}/%{pkg} + + +%files -n xemacs-%{pkg}-el +%defattr(-,root,root,-) +%{_xemacs_sitelispdir}/%{pkg}/*.el + + +%changelog +* Wed Sep 22 2010 Peter Oliver - 0-0.3.20100907gitaa051bb +- Add missing BuildRequires of xemacs-packages-extra. + +* Thu Sep 9 2010 Peter Oliver - 0-0.2.20100907gitaa051bb +- Updated version of arduino-mode. + +* Tue Sep 7 2010 Peter Oliver - 0-0.1.20100907git3cc39d9 +- Apply package naming guidelines. + +* Tue Sep 7 2010 Peter Oliver - git2.3cc39d9-1 +- Updated version of arduino-mode. +- Require arduino-mk. + +* Tue Sep 7 2010 Peter Oliver - git1.16e1d57-2 +- Use correct version of compiled code for GNU Emacs. + +* Tue Sep 7 2010 Peter Oliver - git1.16e1d57-1 +- Initial version. +