Skip to content
2 changes: 2 additions & 0 deletions arduino-mode-init.el
Original file line number Diff line number Diff line change
@@ -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))
83 changes: 75 additions & 8 deletions arduino-mode.el
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand Down Expand Up @@ -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))

Expand All @@ -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.
Expand Down
149 changes: 149 additions & 0 deletions emacs-common-arduino-mode.spec
Original file line number Diff line number Diff line change
@@ -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 <rpm@mavit.org.uk> - 0-0.3.20100907gitaa051bb
- Add missing BuildRequires of xemacs-packages-extra.

* Thu Sep 9 2010 Peter Oliver <rpm@mavit.org.uk> - 0-0.2.20100907gitaa051bb
- Updated version of arduino-mode.

* Tue Sep 7 2010 Peter Oliver <rpm@mavit.org.uk> - 0-0.1.20100907git3cc39d9
- Apply package naming guidelines.

* Tue Sep 7 2010 Peter Oliver <rpm@mavit.org.uk> - git2.3cc39d9-1
- Updated version of arduino-mode.
- Require arduino-mk.

* Tue Sep 7 2010 Peter Oliver <rpm@mavit.org.uk> - git1.16e1d57-2
- Use correct version of compiled code for GNU Emacs.

* Tue Sep 7 2010 Peter Oliver <rpm@mavit.org.uk> - git1.16e1d57-1
- Initial version.