diff --git a/app/src/processing/app/AbstractTextMonitor.java b/app/src/processing/app/AbstractTextMonitor.java index 72239a668..7caeee195 100644 --- a/app/src/processing/app/AbstractTextMonitor.java +++ b/app/src/processing/app/AbstractTextMonitor.java @@ -23,7 +23,6 @@ import javax.swing.border.EmptyBorder; import javax.swing.text.DefaultCaret; import cc.arduino.packages.BoardPort; -import processing.app.debug.TextAreaFIFO; @SuppressWarnings("serial") public abstract class AbstractTextMonitor extends AbstractMonitor { diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index e69647701..2f6a41b16 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -36,7 +36,6 @@ import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities; import org.fife.ui.rtextarea.Gutter; import org.fife.ui.rtextarea.RTextScrollPane; import processing.app.debug.RunnerException; -import processing.app.debug.RunnerListener; import processing.app.forms.PasswordAuthorizationDialog; import processing.app.helpers.OSUtils; import processing.app.helpers.PreferencesMapException; diff --git a/app/src/processing/app/debug/RunnerListener.java b/app/src/processing/app/RunnerListener.java similarity index 97% rename from app/src/processing/app/debug/RunnerListener.java rename to app/src/processing/app/RunnerListener.java index b9505a510..83381be66 100644 --- a/app/src/processing/app/debug/RunnerListener.java +++ b/app/src/processing/app/RunnerListener.java @@ -20,7 +20,7 @@ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -package processing.app.debug; +package processing.app; public interface RunnerListener { @@ -30,4 +30,4 @@ public interface RunnerListener { public void statusError(Exception exception); public void statusNotice(String message); -} \ No newline at end of file +} diff --git a/app/src/processing/app/debug/TextAreaFIFO.java b/app/src/processing/app/TextAreaFIFO.java similarity index 98% rename from app/src/processing/app/debug/TextAreaFIFO.java rename to app/src/processing/app/TextAreaFIFO.java index 0edc8f24c..abf953dfd 100644 --- a/app/src/processing/app/debug/TextAreaFIFO.java +++ b/app/src/processing/app/TextAreaFIFO.java @@ -18,7 +18,7 @@ // adapted from https://community.oracle.com/thread/1479784 -package processing.app.debug; +package processing.app; import javax.swing.JTextArea; import javax.swing.SwingUtilities; diff --git a/app/src/processing/app/debug/EasySSLProtocolSocketFactory.java b/app/src/processing/app/debug/EasySSLProtocolSocketFactory.java deleted file mode 100644 index a08996c75..000000000 --- a/app/src/processing/app/debug/EasySSLProtocolSocketFactory.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * ==================================================================== - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ - -package processing.app.debug; - -import org.apache.commons.httpclient.ConnectTimeoutException; -import org.apache.commons.httpclient.HttpClientError; -import org.apache.commons.httpclient.params.HttpConnectionParams; -import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.net.SocketFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.TrustManager; -import java.io.IOException; -import java.net.*; - -/** - *

- * EasySSLProtocolSocketFactory can be used to creats SSL {@link Socket}s - * that accept self-signed certificates. - *

- *

- * This socket factory SHOULD NOT be used for productive systems - * due to security reasons, unless it is a concious decision and - * you are perfectly aware of security implications of accepting - * self-signed certificates - *

- *

- *

- * Example of using custom protocol socket factory for a specific host: - *

- *     Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
- *
- *     URI uri = new URI("https://localhost/", true);
- *     // use relative url only
- *     GetMethod httpget = new GetMethod(uri.getPathQuery());
- *     HostConfiguration hc = new HostConfiguration();
- *     hc.setHost(uri.getHost(), uri.getPort(), easyhttps);
- *     HttpClient client = new HttpClient();
- *     client.executeMethod(hc, httpget);
- *     
- *

- *

- * Example of using custom protocol socket factory per default instead of the standard one: - *

- *     Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
- *     Protocol.registerProtocol("https", easyhttps);
- *
- *     HttpClient client = new HttpClient();
- *     GetMethod httpget = new GetMethod("https://localhost/");
- *     client.executeMethod(httpget);
- *     
- *

- * - * @author Oleg Kalnichevski - *

- *

- * DISCLAIMER: HttpClient developers DO NOT actively support this component. - * The component is provided as a reference material, which may be inappropriate - * for use without additional customization. - *

- */ - -public class EasySSLProtocolSocketFactory implements SecureProtocolSocketFactory { - - /** - * Log object for this class. - */ - private static final Log LOG = LogFactory.getLog(EasySSLProtocolSocketFactory.class); - public static final String[] SSL_PROTOCOLS = {"SSLv3", "TLSv1"}; - public static final String[] SSL_CYPHER_SUITES = {"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", "TLS_ECDHE_RSA_WITH_RC4_128_SHA", "SSL_RSA_WITH_RC4_128_SHA", "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", "TLS_ECDH_RSA_WITH_RC4_128_SHA", "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", "SSL_RSA_WITH_RC4_128_MD5", "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"}; - - private SSLContext sslcontext = null; - - /** - * Constructor for EasySSLProtocolSocketFactory. - */ - public EasySSLProtocolSocketFactory() { - super(); - } - - private static SSLContext createEasySSLContext() { - try { - SSLContext context = SSLContext.getInstance("SSL"); - context.init( - null, - new TrustManager[]{new EasyX509TrustManager(null)}, - null); - return context; - } catch (Exception e) { - LOG.error(e.getMessage(), e); - throw new HttpClientError(e.toString()); - } - } - - private SSLContext getSSLContext() { - if (this.sslcontext == null) { - this.sslcontext = createEasySSLContext(); - } - return this.sslcontext; - } - - /** - * @see SecureProtocolSocketFactory#createSocket(java.lang.String, int, java.net.InetAddress, int) - */ - public Socket createSocket( - String host, - int port, - InetAddress clientHost, - int clientPort) - throws IOException, UnknownHostException { - - Socket socket = getSSLContext().getSocketFactory().createSocket( - host, - port, - clientHost, - clientPort - ); - return socket; - } - - /** - * Attempts to get a new socket connection to the given host within the given time limit. - *

- * To circumvent the limitations of older JREs that do not support connect timeout a - * controller thread is executed. The controller thread attempts to create a new socket - * within the given limit of time. If socket constructor does not return until the - * timeout expires, the controller terminates and throws an {@link ConnectTimeoutException} - *

- * - * @param host the host name/IP - * @param port the port on the host - * @param clientHost the local host name/IP to bind the socket to - * @param clientPort the port on the local machine - * @param params {@link HttpConnectionParams Http connection parameters} - * @return Socket a new socket - * @throws IOException if an I/O error occurs while creating the socket - * @throws UnknownHostException if the IP address of the host cannot be - * determined - */ - public Socket createSocket( - final String host, - final int port, - final InetAddress localAddress, - final int localPort, - final HttpConnectionParams params - ) throws IOException, UnknownHostException, ConnectTimeoutException { - if (params == null) { - throw new IllegalArgumentException("Parameters may not be null"); - } - int timeout = params.getConnectionTimeout(); - SocketFactory socketfactory = getSSLContext().getSocketFactory(); - Socket socket; - if (timeout == 0) { - socket = socketfactory.createSocket(host, port, localAddress, localPort); - } else { - socket = socketfactory.createSocket(); - SocketAddress localaddr = new InetSocketAddress(localAddress, localPort); - SocketAddress remoteaddr = new InetSocketAddress(host, port); - socket.bind(localaddr); - socket.connect(remoteaddr, timeout); - } - - SSLSocket sslSocket = (SSLSocket) socket; - sslSocket.setEnabledProtocols(SSL_PROTOCOLS); - sslSocket.setEnabledCipherSuites(SSL_CYPHER_SUITES); - - return socket; - } - - /** - * @see SecureProtocolSocketFactory#createSocket(java.lang.String, int) - */ - public Socket createSocket(String host, int port) - throws IOException, UnknownHostException { - return getSSLContext().getSocketFactory().createSocket( - host, - port - ); - } - - /** - * @see SecureProtocolSocketFactory#createSocket(java.net.Socket, java.lang.String, int, boolean) - */ - public Socket createSocket( - Socket socket, - String host, - int port, - boolean autoClose) - throws IOException, UnknownHostException { - return getSSLContext().getSocketFactory().createSocket( - socket, - host, - port, - autoClose - ); - } - - public boolean equals(Object obj) { - return ((obj != null) && obj.getClass().equals(EasySSLProtocolSocketFactory.class)); - } - - public int hashCode() { - return EasySSLProtocolSocketFactory.class.hashCode(); - } - -} diff --git a/app/src/processing/app/debug/EasyX509TrustManager.java b/app/src/processing/app/debug/EasyX509TrustManager.java deleted file mode 100644 index e4d57de46..000000000 --- a/app/src/processing/app/debug/EasyX509TrustManager.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * ==================================================================== - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ - -package processing.app.debug; - -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; - -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - *

- * EasyX509TrustManager unlike default {@link X509TrustManager} accepts - * self-signed certificates. - *

- *

- * This trust manager SHOULD NOT be used for productive systems - * due to security reasons, unless it is a concious decision and - * you are perfectly aware of security implications of accepting - * self-signed certificates - *

- * - * @author Adrian Sutton - * @author Oleg Kalnichevski - * - *

- * DISCLAIMER: HttpClient developers DO NOT actively support this component. - * The component is provided as a reference material, which may be inappropriate - * for use without additional customization. - *

- */ - -public class EasyX509TrustManager implements X509TrustManager -{ - private X509TrustManager standardTrustManager = null; - - /** Log object for this class. */ - private static final Log LOG = LogFactory.getLog(EasyX509TrustManager.class); - - /** - * Constructor for EasyX509TrustManager. - */ - public EasyX509TrustManager(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException { - super(); - TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); - factory.init(keystore); - TrustManager[] trustmanagers = factory.getTrustManagers(); - if (trustmanagers.length == 0) { - throw new NoSuchAlgorithmException("no trust manager found"); - } - this.standardTrustManager = (X509TrustManager)trustmanagers[0]; - } - - /** - * @see javax.net.ssl.X509TrustManager#checkClientTrusted(X509Certificate[],String authType) - */ - public void checkClientTrusted(X509Certificate[] certificates,String authType) throws CertificateException { - standardTrustManager.checkClientTrusted(certificates,authType); - } - - /** - * @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[],String authType) - */ - public void checkServerTrusted(X509Certificate[] certificates,String authType) throws CertificateException { - if ((certificates != null) && LOG.isDebugEnabled()) { - LOG.debug("Server certificate chain:"); - for (int i = 0; i < certificates.length; i++) { - LOG.debug("X509Certificate[" + i + "]=" + certificates[i]); - } - } - if ((certificates != null) && (certificates.length == 1)) { - certificates[0].checkValidity(); - } else { - standardTrustManager.checkServerTrusted(certificates,authType); - } - } - - /** - * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers() - */ - public X509Certificate[] getAcceptedIssuers() { - return this.standardTrustManager.getAcceptedIssuers(); - } -} diff --git a/app/src/processing/app/tools/DiscourseFormat.java b/app/src/processing/app/tools/DiscourseFormat.java index 75240cb69..913df85ec 100644 --- a/app/src/processing/app/tools/DiscourseFormat.java +++ b/app/src/processing/app/tools/DiscourseFormat.java @@ -143,7 +143,7 @@ public class DiscourseFormat { } else if (c == '&') { buffer.append("&"); } else if (c > 127) { - buffer.append("&#" + ((int) c) + ";"); // use unicode entity + buffer.append("&#").append((int) c).append(";"); // use unicode entity } else { buffer.append(c); // normal character } diff --git a/app/src/processing/app/tools/Tool.java b/app/src/processing/app/tools/Tool.java index 7278452e0..c909c847f 100644 --- a/app/src/processing/app/tools/Tool.java +++ b/app/src/processing/app/tools/Tool.java @@ -31,14 +31,11 @@ import processing.app.Editor; */ public interface Tool extends Runnable { - public void init(Editor editor); - - public void run(); + void init(Editor editor); - // Not doing shortcuts for now, no way to resolve between tools. - // Also would need additional modifiers for shift and alt. - //public char getShortcutKey(); + void run(); + + String getMenuTitle(); - public String getMenuTitle(); } diff --git a/app/test/processing/app/debug/OldCompilerTest.java b/app/test/processing/app/debug/OldCompilerTest.java deleted file mode 100755 index b7cb5619b..000000000 --- a/app/test/processing/app/debug/OldCompilerTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of Arduino. - * - * Copyright 2015 Arduino LLC (http://www.arduino.cc/) - * - * Arduino is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * As a special exception, you may use this file as part of a free software - * library without restriction. Specifically, if other files instantiate - * templates or use macros or inline functions from this file, or you compile - * this file and link it with other files to produce an executable, this - * file does not by itself cause the resulting executable to be covered by - * the GNU General Public License. This exception does not however - * invalidate any other reasons why the executable file might be covered by - * the GNU General Public License. - */ - -package processing.app.debug; - -import static org.junit.Assert.assertEquals; -import static processing.app.debug.OldCompiler.unescapeDepFile; - -import org.junit.Test; - -import processing.app.AbstractWithPreferencesTest; - -public class OldCompilerTest extends AbstractWithPreferencesTest { - - @Test - public void makeDepUnescapeTest() throws Exception { - assertEquals("C:\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Stream.cpp", - unescapeDepFile("C:\\Arduino\\hardware\\arduino\\avr\\cores\\arduino\\Stream.cpp")); - assertEquals("C:\\Arduino 1.5.3\\hardware\\arduino\\avr\\cores\\arduino\\Stream.cpp", - unescapeDepFile("C:\\Arduino\\ 1.5.3\\hardware\\arduino\\avr\\cores\\arduino\\Stream.cpp")); - assertEquals("C:\\Ard$ui#\\\\ no 1.5.3\\hardware\\arduino\\avr\\cores\\arduino\\Stream.cpp", - unescapeDepFile("C:\\Ard$$ui\\#\\\\\\\\\\ no 1.5.3\\hardware\\arduino\\avr\\cores\\arduino\\Stream.cpp")); - } - -} diff --git a/app/src/processing/app/debug/TargetPackageStub.java b/app/test/processing/app/debug/TargetPackageStub.java similarity index 100% rename from app/src/processing/app/debug/TargetPackageStub.java rename to app/test/processing/app/debug/TargetPackageStub.java diff --git a/app/test/processing/app/preproc/Baladuino.ino b/app/test/processing/app/preproc/Baladuino.ino deleted file mode 100644 index a208fafde..000000000 --- a/app/test/processing/app/preproc/Baladuino.ino +++ /dev/null @@ -1,303 +0,0 @@ -/* - * The code is released under the GNU General Public License. - * Developed by Kristian Lauszus, TKJ Electronics 2013 - * This is the algorithm for the Balanduino balancing robot. - * It can be controlled by either an Android app or a Processing application via Bluetooth. - * The Android app can be found at the following link: https://github.com/TKJElectronics/BalanduinoAndroidApp - * The Processing application can be found here: https://github.com/TKJElectronics/BalanduinoProcessingApp - * It can also be controlled by a PS3, Wii or a Xbox controller - * For details, see: http://balanduino.net/ - */ - -/* Use this to enable and disable the different options */ -#define ENABLE_TOOLS -#define ENABLE_SPP -#define ENABLE_PS3 -#define ENABLE_WII -#define ENABLE_XBOX -#define ENABLE_ADK - -#include "Balanduino.h" -#include // Official Arduino Wire library -#include // Some dongles can have a hub inside - -#ifdef ENABLE_ADK -#include -#endif - -// These are all open source libraries written by Kristian Lauszus, TKJ Electronics -// The USB libraries are located at the following link: https://github.com/felis/USB_Host_Shield_2.0 -#include // Kalman filter library - see: http://blog.tkjelectronics.dk/2012/09/a-practical-approach-to-kalman-filter-and-how-to-implement-it/ - -#ifdef ENABLE_XBOX -#include -#endif -#ifdef ENABLE_SPP -#include -#endif -#ifdef ENABLE_PS3 -#include -#endif -#ifdef ENABLE_WII -#include -#endif - -// Create the Kalman library instance -Kalman kalman; // See https://github.com/TKJElectronics/KalmanFilter for source code - -#if defined(ENABLE_SPP) || defined(ENABLE_PS3) || defined(ENABLE_WII) || defined(ENABLE_XBOX) || defined(ENABLE_ADK) -#define ENABLE_USB -USB Usb; // This will take care of all USB communication -#endif - -#ifdef ENABLE_ADK -// Implementation for the Android Open Accessory Protocol. Simply connect your phone to get redirected to the Play Store -ADK adk(&Usb, "TKJ Electronics", // Manufacturer Name - "Balanduino", // Model Name - "Android App for Balanduino", // Description - user visible string - "0.5.0", // Version of the Android app - "https://play.google.com/store/apps/details?id=com.tkjelectronics.balanduino", // URL - web page to visit if no installed apps support the accessory - "1234"); // Serial Number - this is not used -#endif - -#ifdef ENABLE_XBOX -XBOXRECV Xbox(&Usb); // You have to connect a Xbox wireless receiver to the Arduino to control it with a wireless Xbox controller -#endif - -#if defined(ENABLE_SPP) || defined(ENABLE_PS3) || defined(ENABLE_WII) -USBHub Hub(&Usb); // Some dongles have a hub inside -BTD Btd(&Usb); // This is the main Bluetooth library, it will take care of all the USB and HCI communication with the Bluetooth dongle -#endif - -#ifdef ENABLE_SPP -SPP SerialBT(&Btd, "Balanduino", "0000"); // The SPP (Serial Port Protocol) emulates a virtual Serial port, which is supported by most computers and mobile phones -#endif - -#ifdef ENABLE_PS3 -PS3BT PS3(&Btd); // The PS3 library supports all three official controllers: the Dualshock 3, Navigation and Move controller -#endif - -#ifdef ENABLE_WII -WII Wii(&Btd); // The Wii library can communicate with Wiimotes and the Nunchuck and Motion Plus extension and finally the Wii U Pro Controller -//WII Wii(&Btd,PAIR); // You will have to pair with your Wiimote first by creating the instance like this and the press 1+2 on the Wiimote -// or press sync if you are using a Wii U Pro Controller -// Or you can simply send "CW;" to the robot to start the pairing sequence -// This can also be done using the Android or Processing application -#endif - -void setup() { - /* Initialize UART */ - Serial.begin(115200); - - /* Read the PID values, target angle and other saved values in the EEPROM */ - if (!checkInitializationFlags()) - readEEPROMValues(); // Only read the EEPROM values if they have not been restored - - /* Setup encoders */ - pinMode(leftEncoder1, INPUT); - pinMode(leftEncoder2, INPUT); - pinMode(rightEncoder1, INPUT); - pinMode(rightEncoder2, INPUT); - attachInterrupt(0, leftEncoder, CHANGE); - attachInterrupt(1, rightEncoder, CHANGE); - - /* Enable the motor drivers */ - pinMode(leftEnable, OUTPUT); - pinMode(rightEnable, OUTPUT); - digitalWrite(leftEnable, HIGH); - digitalWrite(rightEnable, HIGH); - - /* Setup motor pins to output */ - sbi(pwmPortDirection, leftPWM); - sbi(leftPortDirection, leftA); - sbi(leftPortDirection, leftB); - sbi(pwmPortDirection, rightPWM); - sbi(rightPortDirection, rightA); - sbi(rightPortDirection, rightB); - - /* Set PWM frequency to 20kHz - see the datasheet http://www.atmel.com/Images/doc8272.pdf page 128-135 */ - // Set up PWM, Phase and Frequency Correct on pin 18 (OC1A) & pin 17 (OC1B) with ICR1 as TOP using Timer1 - TCCR1B = _BV(WGM13) | _BV(CS10); // Set PWM Phase and Frequency Correct with ICR1 as TOP and no prescaling - ICR1 = PWMVALUE; // ICR1 is the TOP value - this is set so the frequency is equal to 20kHz - - /* Enable PWM on pin 18 (OC1A) & pin 17 (OC1B) */ - // Clear OC1A/OC1B on compare match when up-counting - // Set OC1A/OC1B on compare match when downcounting - TCCR1A = _BV(COM1A1) | _BV(COM1B1); - setPWM(leftPWM, 0); // Turn off PWM on both pins - setPWM(rightPWM, 0); - - /* Setup buzzer pin */ - pinMode(buzzer, OUTPUT); - -#ifdef ENABLE_USB - if (Usb.Init() == -1) { // Check if USB Host is working - Serial.print(F("OSC did not start")); - digitalWrite(buzzer, HIGH); - while (1); // Halt - } -#endif - - /* Attach onInit function */ - // This is used to set the LEDs according to the voltage level and vibrate the controller to indicate the new connection -#ifdef ENABLE_PS3 - PS3.attachOnInit(onInit); -#endif -#ifdef ENABLE_WII - Wii.attachOnInit(onInit); -#endif -#ifdef ENABLE_XBOX - Xbox.attachOnInit(onInit); -#endif - - /* Setup IMU */ - Wire.begin(); - - while (i2cRead(0x75, i2cBuffer, 1)); - if (i2cBuffer[0] != 0x68) { // Read "WHO_AM_I" register - Serial.print(F("Error reading sensor")); - digitalWrite(buzzer, HIGH); - while (1); // Halt - } - - i2cBuffer[0] = 19; // Set the sample rate to 400Hz - 8kHz/(19+1) = 400Hz - i2cBuffer[1] = 0x00; // Disable FSYNC and set 260 Hz Acc filtering, 256 Hz Gyro filtering, 8 KHz sampling - i2cBuffer[2] = 0x00; // Set Gyro Full Scale Range to ±250deg/s - i2cBuffer[3] = 0x00; // Set Accelerometer Full Scale Range to ±2g - while (i2cWrite(0x19, i2cBuffer, 4, false)); // Write to all four registers at once - while (i2cWrite(0x6B, 0x09, true)); // PLL with X axis gyroscope reference, disable temperature sensor and disable sleep mode - - delay(100); // Wait for the sensor to get ready - - /* Set Kalman and gyro starting angle */ - while (i2cRead(0x3D, i2cBuffer, 4)); - accY = ((i2cBuffer[0] << 8) | i2cBuffer[1]); - accZ = ((i2cBuffer[2] << 8) | i2cBuffer[3]); - // atan2 outputs the value of -π to π (radians) - see http://en.wikipedia.org/wiki/Atan2 - // We then convert it to 0 to 2π and then from radians to degrees - accAngle = (atan2((double)accY - cfg.accYzero, (double)accZ - cfg.accZzero) + PI) * RAD_TO_DEG; - - kalman.setAngle(accAngle); // Set starting angle - pitch = accAngle; - gyroAngle = accAngle; - - /* Find gyro zero value */ - calibrateGyro(); - - pinMode(LED_BUILTIN, OUTPUT); // LED_BUILTIN is defined in pins_arduino.h in the hardware add-on - - /* Beep to indicate that it is now ready */ - digitalWrite(buzzer, HIGH); - delay(100); - digitalWrite(buzzer, LOW); - - /* Setup timing */ - kalmanTimer = micros(); - pidTimer = kalmanTimer; - encoderTimer = kalmanTimer; - imuTimer = millis(); - reportTimer = imuTimer; - ledTimer = imuTimer; - blinkTimer = imuTimer; -} - -void loop() { -#ifdef ENABLE_WII - if (Wii.wiimoteConnected) // We have to read much more often from the Wiimote to decrease latency - Usb.Task(); -#endif - - /* Calculate pitch */ - while (i2cRead(0x3D, i2cBuffer, 8)); - accY = ((i2cBuffer[0] << 8) | i2cBuffer[1]); - accZ = ((i2cBuffer[2] << 8) | i2cBuffer[3]); - gyroX = ((i2cBuffer[6] << 8) | i2cBuffer[7]); - - // atan2 outputs the value of -π to π (radians) - see http://en.wikipedia.org/wiki/Atan2 - // We then convert it to 0 to 2π and then from radians to degrees - accAngle = (atan2((double)accY - cfg.accYzero, (double)accZ - cfg.accZzero) + PI) * RAD_TO_DEG; - - uint32_t timer = micros(); - // This fixes the 0-360 transition problem when the accelerometer angle jumps between 0 and 360 degrees - if ((accAngle < 90 && pitch > 270) || (accAngle > 270 && pitch < 90)) { - kalman.setAngle(accAngle); - pitch = accAngle; - gyroAngle = accAngle; - } else { - gyroRate = ((double)gyroX - gyroXzero) / 131.0; // Convert to deg/s - double dt = (double)(timer - kalmanTimer) / 1000000.0; - gyroAngle += gyroRate * dt; // Gyro angle is only used for debugging - if (gyroAngle < 0 || gyroAngle > 360) - gyroAngle = pitch; // Reset the gyro angle when it has drifted too much - pitch = kalman.getAngle(accAngle, gyroRate, dt); // Calculate the angle using a Kalman filter - } - kalmanTimer = timer; - //Serial.print(accAngle);Serial.print('\t');Serial.print(gyroAngle);Serial.print('\t');Serial.println(pitch); - -#ifdef ENABLE_WII - if (Wii.wiimoteConnected) // We have to read much more often from the Wiimote to decrease latency - Usb.Task(); -#endif - - /* Drive motors */ - timer = micros(); - // If the robot is laying down, it has to be put in a vertical position before it starts balancing - // If it's already balancing it has to be ±45 degrees before it stops trying to balance - if ((layingDown && (pitch < cfg.targetAngle - 10 || pitch > cfg.targetAngle + 10)) || (!layingDown && (pitch < cfg.targetAngle - 45 || pitch > cfg.targetAngle + 45))) { - layingDown = true; // The robot is in a unsolvable position, so turn off both motors and wait until it's vertical again - stopAndReset(); - } else { - layingDown = false; // It's no longer laying down - updatePID(cfg.targetAngle, targetOffset, turningOffset, (double)(timer - pidTimer) / 1000000.0); - } - pidTimer = timer; - - /* Update encoders */ - timer = micros(); - if (timer - encoderTimer >= 100000) { // Update encoder values every 100ms - encoderTimer = timer; - int32_t wheelPosition = getWheelsPosition(); - wheelVelocity = wheelPosition - lastWheelPosition; - lastWheelPosition = wheelPosition; - //Serial.print(wheelPosition);Serial.print('\t');Serial.print(targetPosition);Serial.print('\t');Serial.println(wheelVelocity); - if (abs(wheelVelocity) <= 40 && !stopped) { // Set new targetPosition if braking - targetPosition = wheelPosition; - stopped = true; - } - - batteryCounter++; - if (batteryCounter > 10) { // Measure battery every 1s - batteryCounter = 0; - batteryVoltage = (double)analogRead(VBAT) / 63.050847458; // VBAT is connected to analog input 5 which is not broken out. This is then connected to a 47k-12k voltage divider - 1023.0/(3.3/(12.0/(12.0+47.0))) = 63.050847458 - if (batteryVoltage < 10.2 && batteryVoltage > 5) // Equal to 3.4V per cell - don't turn on if it's below 5V, this means that no battery is connected - digitalWrite(buzzer, HIGH); - else - digitalWrite(buzzer, LOW); - } - } - - /* Read the Bluetooth dongle and send PID and IMU values */ -#ifdef ENABLE_USB - readUsb(); -#endif -#ifdef ENABLE_TOOLS - checkSerialData(); -#endif -#if defined(ENABLE_TOOLS) || defined(ENABLE_SPP) - printValues(); -#endif - -#if defined(ENABLE_SPP) || defined(ENABLE_PS3) || defined(ENABLE_WII) - if (Btd.isReady()) { - timer = millis(); - if ((Btd.watingForConnection && timer - blinkTimer > 1000) || (!Btd.watingForConnection && timer - blinkTimer > 100)) { - blinkTimer = timer; - ledState = !ledState; - digitalWrite(LED_BUILTIN, ledState); // Used to blink the built in LED, starts blinking faster upon an incoming Bluetooth request - } - } else if (ledState) { // The LED is on - ledState = !ledState; - digitalWrite(LED_BUILTIN, ledState); // This will turn it off - } -#endif -} \ No newline at end of file diff --git a/app/test/processing/app/preproc/Baladuino.nocomments.ino b/app/test/processing/app/preproc/Baladuino.nocomments.ino deleted file mode 100644 index 81324031c..000000000 --- a/app/test/processing/app/preproc/Baladuino.nocomments.ino +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - - - - -#define ENABLE_TOOLS -#define ENABLE_SPP -#define ENABLE_PS3 -#define ENABLE_WII -#define ENABLE_XBOX -#define ENABLE_ADK - -#include "Balanduino.h" -#include -#include - -#ifdef ENABLE_ADK -#include -#endif - - - -#include - -#ifdef ENABLE_XBOX -#include -#endif -#ifdef ENABLE_SPP -#include -#endif -#ifdef ENABLE_PS3 -#include -#endif -#ifdef ENABLE_WII -#include -#endif - - -Kalman kalman; - -#if defined(ENABLE_SPP) || defined(ENABLE_PS3) || defined(ENABLE_WII) || defined(ENABLE_XBOX) || defined(ENABLE_ADK) -#define ENABLE_USB -USB Usb; -#endif - -#ifdef ENABLE_ADK - -ADK adk(&Usb, "TKJ Electronics", - "Balanduino", - "Android App for Balanduino", - "0.5.0", - "https://play.google.com/store/apps/details?id=com.tkjelectronics.balanduino", - "1234"); -#endif - -#ifdef ENABLE_XBOX -XBOXRECV Xbox(&Usb); -#endif - -#if defined(ENABLE_SPP) || defined(ENABLE_PS3) || defined(ENABLE_WII) -USBHub Hub(&Usb); -BTD Btd(&Usb); -#endif - -#ifdef ENABLE_SPP -SPP SerialBT(&Btd, "Balanduino", "0000"); -#endif - -#ifdef ENABLE_PS3 -PS3BT PS3(&Btd); -#endif - -#ifdef ENABLE_WII -WII Wii(&Btd); - - - - -#endif - -void setup() { - - Serial.begin(115200); - - - if (!checkInitializationFlags()) - readEEPROMValues(); - - - pinMode(leftEncoder1, INPUT); - pinMode(leftEncoder2, INPUT); - pinMode(rightEncoder1, INPUT); - pinMode(rightEncoder2, INPUT); - attachInterrupt(0, leftEncoder, CHANGE); - attachInterrupt(1, rightEncoder, CHANGE); - - - pinMode(leftEnable, OUTPUT); - pinMode(rightEnable, OUTPUT); - digitalWrite(leftEnable, HIGH); - digitalWrite(rightEnable, HIGH); - - - sbi(pwmPortDirection, leftPWM); - sbi(leftPortDirection, leftA); - sbi(leftPortDirection, leftB); - sbi(pwmPortDirection, rightPWM); - sbi(rightPortDirection, rightA); - sbi(rightPortDirection, rightB); - - - - TCCR1B = _BV(WGM13) | _BV(CS10); - ICR1 = PWMVALUE; - - - - - TCCR1A = _BV(COM1A1) | _BV(COM1B1); - setPWM(leftPWM, 0); - setPWM(rightPWM, 0); - - - pinMode(buzzer, OUTPUT); - -#ifdef ENABLE_USB - if (Usb.Init() == -1) { - Serial.print(F("OSC did not start")); - digitalWrite(buzzer, HIGH); - while (1); - } -#endif - - - -#ifdef ENABLE_PS3 - PS3.attachOnInit(onInit); -#endif -#ifdef ENABLE_WII - Wii.attachOnInit(onInit); -#endif -#ifdef ENABLE_XBOX - Xbox.attachOnInit(onInit); -#endif - - - Wire.begin(); - - while (i2cRead(0x75, i2cBuffer, 1)); - if (i2cBuffer[0] != 0x68) { - Serial.print(F("Error reading sensor")); - digitalWrite(buzzer, HIGH); - while (1); - } - - i2cBuffer[0] = 19; - i2cBuffer[1] = 0x00; - i2cBuffer[2] = 0x00; - i2cBuffer[3] = 0x00; - while (i2cWrite(0x19, i2cBuffer, 4, false)); - while (i2cWrite(0x6B, 0x09, true)); - - delay(100); - - - while (i2cRead(0x3D, i2cBuffer, 4)); - accY = ((i2cBuffer[0] << 8) | i2cBuffer[1]); - accZ = ((i2cBuffer[2] << 8) | i2cBuffer[3]); - - - accAngle = (atan2((double)accY - cfg.accYzero, (double)accZ - cfg.accZzero) + PI) * RAD_TO_DEG; - - kalman.setAngle(accAngle); - pitch = accAngle; - gyroAngle = accAngle; - - - calibrateGyro(); - - pinMode(LED_BUILTIN, OUTPUT); - - - digitalWrite(buzzer, HIGH); - delay(100); - digitalWrite(buzzer, LOW); - - - kalmanTimer = micros(); - pidTimer = kalmanTimer; - encoderTimer = kalmanTimer; - imuTimer = millis(); - reportTimer = imuTimer; - ledTimer = imuTimer; - blinkTimer = imuTimer; -} - -void loop() { -#ifdef ENABLE_WII - if (Wii.wiimoteConnected) - Usb.Task(); -#endif - - - while (i2cRead(0x3D, i2cBuffer, 8)); - accY = ((i2cBuffer[0] << 8) | i2cBuffer[1]); - accZ = ((i2cBuffer[2] << 8) | i2cBuffer[3]); - gyroX = ((i2cBuffer[6] << 8) | i2cBuffer[7]); - - - - accAngle = (atan2((double)accY - cfg.accYzero, (double)accZ - cfg.accZzero) + PI) * RAD_TO_DEG; - - uint32_t timer = micros(); - - if ((accAngle < 90 && pitch > 270) || (accAngle > 270 && pitch < 90)) { - kalman.setAngle(accAngle); - pitch = accAngle; - gyroAngle = accAngle; - } else { - gyroRate = ((double)gyroX - gyroXzero) / 131.0; - double dt = (double)(timer - kalmanTimer) / 1000000.0; - gyroAngle += gyroRate * dt; - if (gyroAngle < 0 || gyroAngle > 360) - gyroAngle = pitch; - pitch = kalman.getAngle(accAngle, gyroRate, dt); - } - kalmanTimer = timer; - - -#ifdef ENABLE_WII - if (Wii.wiimoteConnected) - Usb.Task(); -#endif - - - timer = micros(); - - - if ((layingDown && (pitch < cfg.targetAngle - 10 || pitch > cfg.targetAngle + 10)) || (!layingDown && (pitch < cfg.targetAngle - 45 || pitch > cfg.targetAngle + 45))) { - layingDown = true; - stopAndReset(); - } else { - layingDown = false; - updatePID(cfg.targetAngle, targetOffset, turningOffset, (double)(timer - pidTimer) / 1000000.0); - } - pidTimer = timer; - - - timer = micros(); - if (timer - encoderTimer >= 100000) { - encoderTimer = timer; - int32_t wheelPosition = getWheelsPosition(); - wheelVelocity = wheelPosition - lastWheelPosition; - lastWheelPosition = wheelPosition; - - if (abs(wheelVelocity) <= 40 && !stopped) { - targetPosition = wheelPosition; - stopped = true; - } - - batteryCounter++; - if (batteryCounter > 10) { - batteryCounter = 0; - batteryVoltage = (double)analogRead(VBAT) / 63.050847458; - if (batteryVoltage < 10.2 && batteryVoltage > 5) - digitalWrite(buzzer, HIGH); - else - digitalWrite(buzzer, LOW); - } - } - - -#ifdef ENABLE_USB - readUsb(); -#endif -#ifdef ENABLE_TOOLS - checkSerialData(); -#endif -#if defined(ENABLE_TOOLS) || defined(ENABLE_SPP) - printValues(); -#endif - -#if defined(ENABLE_SPP) || defined(ENABLE_PS3) || defined(ENABLE_WII) - if (Btd.isReady()) { - timer = millis(); - if ((Btd.watingForConnection && timer - blinkTimer > 1000) || (!Btd.watingForConnection && timer - blinkTimer > 100)) { - blinkTimer = timer; - ledState = !ledState; - digitalWrite(LED_BUILTIN, ledState); - } - } else if (ledState) { - ledState = !ledState; - digitalWrite(LED_BUILTIN, ledState); - } -#endif -} - diff --git a/app/test/processing/app/preproc/Baladuino.stripped.ino b/app/test/processing/app/preproc/Baladuino.stripped.ino deleted file mode 100644 index 168eedd37..000000000 --- a/app/test/processing/app/preproc/Baladuino.stripped.ino +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Kalman kalman; - - - -USB Usb; - - - - -ADK adk(&Usb, , - , - , - , - , - ); - - - -XBOXRECV Xbox(&Usb); - - - -USBHub Hub(&Usb); -BTD Btd(&Usb); - - - -SPP SerialBT(&Btd, , ); - - - -PS3BT PS3(&Btd); - - - -WII Wii(&Btd); - - - - - - -void setup() { - - Serial.begin(115200); - - - if (!checkInitializationFlags()) - readEEPROMValues(); - - - pinMode(leftEncoder1, INPUT); - pinMode(leftEncoder2, INPUT); - pinMode(rightEncoder1, INPUT); - pinMode(rightEncoder2, INPUT); - attachInterrupt(0, leftEncoder, CHANGE); - attachInterrupt(1, rightEncoder, CHANGE); - - - pinMode(leftEnable, OUTPUT); - pinMode(rightEnable, OUTPUT); - digitalWrite(leftEnable, HIGH); - digitalWrite(rightEnable, HIGH); - - - sbi(pwmPortDirection, leftPWM); - sbi(leftPortDirection, leftA); - sbi(leftPortDirection, leftB); - sbi(pwmPortDirection, rightPWM); - sbi(rightPortDirection, rightA); - sbi(rightPortDirection, rightB); - - - - TCCR1B = _BV(WGM13) | _BV(CS10); - ICR1 = PWMVALUE; - - - - - TCCR1A = _BV(COM1A1) | _BV(COM1B1); - setPWM(leftPWM, 0); - setPWM(rightPWM, 0); - - - pinMode(buzzer, OUTPUT); - - - if (Usb.Init() == -1) { - Serial.print(F( )); - digitalWrite(buzzer, HIGH); - while (1); - } - - - - - - PS3.attachOnInit(onInit); - - - Wii.attachOnInit(onInit); - - - Xbox.attachOnInit(onInit); - - - - Wire.begin(); - - while (i2cRead(0x75, i2cBuffer, 1)); - if (i2cBuffer[0] != 0x68) { - Serial.print(F( )); - digitalWrite(buzzer, HIGH); - while (1); - } - - i2cBuffer[0] = 19; - i2cBuffer[1] = 0x00; - i2cBuffer[2] = 0x00; - i2cBuffer[3] = 0x00; - while (i2cWrite(0x19, i2cBuffer, 4, false)); - while (i2cWrite(0x6B, 0x09, true)); - - delay(100); - - - while (i2cRead(0x3D, i2cBuffer, 4)); - accY = ((i2cBuffer[0] << 8) | i2cBuffer[1]); - accZ = ((i2cBuffer[2] << 8) | i2cBuffer[3]); - - - accAngle = (atan2((double)accY - cfg.accYzero, (double)accZ - cfg.accZzero) + PI) * RAD_TO_DEG; - - kalman.setAngle(accAngle); - pitch = accAngle; - gyroAngle = accAngle; - - - calibrateGyro(); - - pinMode(LED_BUILTIN, OUTPUT); - - - digitalWrite(buzzer, HIGH); - delay(100); - digitalWrite(buzzer, LOW); - - - kalmanTimer = micros(); - pidTimer = kalmanTimer; - encoderTimer = kalmanTimer; - imuTimer = millis(); - reportTimer = imuTimer; - ledTimer = imuTimer; - blinkTimer = imuTimer; -} - -void loop() { - - if (Wii.wiimoteConnected) - Usb.Task(); - - - - while (i2cRead(0x3D, i2cBuffer, 8)); - accY = ((i2cBuffer[0] << 8) | i2cBuffer[1]); - accZ = ((i2cBuffer[2] << 8) | i2cBuffer[3]); - gyroX = ((i2cBuffer[6] << 8) | i2cBuffer[7]); - - - - accAngle = (atan2((double)accY - cfg.accYzero, (double)accZ - cfg.accZzero) + PI) * RAD_TO_DEG; - - uint32_t timer = micros(); - - if ((accAngle < 90 && pitch > 270) || (accAngle > 270 && pitch < 90)) { - kalman.setAngle(accAngle); - pitch = accAngle; - gyroAngle = accAngle; - } else { - gyroRate = ((double)gyroX - gyroXzero) / 131.0; - double dt = (double)(timer - kalmanTimer) / 1000000.0; - gyroAngle += gyroRate * dt; - if (gyroAngle < 0 || gyroAngle > 360) - gyroAngle = pitch; - pitch = kalman.getAngle(accAngle, gyroRate, dt); - } - kalmanTimer = timer; - - - - if (Wii.wiimoteConnected) - Usb.Task(); - - - - timer = micros(); - - - if ((layingDown && (pitch < cfg.targetAngle - 10 || pitch > cfg.targetAngle + 10)) || (!layingDown && (pitch < cfg.targetAngle - 45 || pitch > cfg.targetAngle + 45))) { - layingDown = true; - stopAndReset(); - } else { - layingDown = false; - updatePID(cfg.targetAngle, targetOffset, turningOffset, (double)(timer - pidTimer) / 1000000.0); - } - pidTimer = timer; - - - timer = micros(); - if (timer - encoderTimer >= 100000) { - encoderTimer = timer; - int32_t wheelPosition = getWheelsPosition(); - wheelVelocity = wheelPosition - lastWheelPosition; - lastWheelPosition = wheelPosition; - - if (abs(wheelVelocity) <= 40 && !stopped) { - targetPosition = wheelPosition; - stopped = true; - } - - batteryCounter++; - if (batteryCounter > 10) { - batteryCounter = 0; - batteryVoltage = (double)analogRead(VBAT) / 63.050847458; - if (batteryVoltage < 10.2 && batteryVoltage > 5) - digitalWrite(buzzer, HIGH); - else - digitalWrite(buzzer, LOW); - } - } - - - - readUsb(); - - - checkSerialData(); - - - printValues(); - - - - if (Btd.isReady()) { - timer = millis(); - if ((Btd.watingForConnection && timer - blinkTimer > 1000) || (!Btd.watingForConnection && timer - blinkTimer > 100)) { - blinkTimer = timer; - ledState = !ledState; - digitalWrite(LED_BUILTIN, ledState); - } - } else if (ledState) { - ledState = !ledState; - digitalWrite(LED_BUILTIN, ledState); - } - -} diff --git a/app/test/processing/app/preproc/CharWithEscapedDoubleQuote.ino b/app/test/processing/app/preproc/CharWithEscapedDoubleQuote.ino deleted file mode 100644 index 35c1d6eeb..000000000 --- a/app/test/processing/app/preproc/CharWithEscapedDoubleQuote.ino +++ /dev/null @@ -1,338 +0,0 @@ -#include // required to send and receive AT commands from the GPRS Shield -#include // required for I2C communication with the RTC - -// pin numbers for RTC -#define DS3231_I2C_ADDRESS 104 // 0x68 // Address for RTC -#define DS3231_TIME_CAL_ADDR 0 // 0x00 -#define DS3231_ALARM1_ADDR 7 // 0x07 -#define DS3231_ALARM2_ADDR 11 // 0x0B -#define DS3231_CONTROL_ADDR 14 // 0x0E -#define DS3231_STATUS_ADDR 15 // 0x0F -//#define DS3231_AGING_OFFSET_ADDR 16 // 0x10 -#define DS3231_TEMPERATURE_ADDR 17 // 0x11 - -// Declarations for GPRS shield -SoftwareSerial GPRS( 7, 8 ); // A softwareSerial line is defined for the GPRS Shield -byte buffer[ 64 ]; // Buffer is used to transfer data from the GPRS line to the serial line -int count = 0, e = 0, count2 = 0, t = 0, q; -char temp, lastCaller[13] = "blank"; -boolean callIncoming = false, done; - -// Declarations for RTC -byte time[ 7 ]; // second, minute, hour, dow, day, month, year -byte time_A1[ 5 ]; // second_A1, minute_A1, hour_A1, day_A1, DY/DT -byte time_A2[ 4 ]; // minute_A2, hour_A2, day_A2, DY/DT -byte received[1]; // used to catch bytes sent from the clock -float temperature; // clock temperature is updated every 64 s - -// Declarations for RemoteCallLogger -char telescopeNames[6][4]; - -/* -Code Exclusively for GPRS shield: -*/ - -// -// Default set of instructions for GPRS Shield power control -// - -void setPowerStateTo( int newState ) -{ - if( newState != 1 && newState != 0 ) { // tests for an invalid state. In this case no change is made to powerstate - Serial.print( "Error: Invalid powerstate. Current powerstate = " ); - Serial.print( getPowerState() ); - Serial.print( "\n" ); - } - else { - if( newState == getPowerState() ) { // if the requested powerstate is already in effect, no action is taken - Serial.print( "Powerstate = " ); - Serial.print( newState ); - Serial.print( " remains unchanged.\n" ); - } - else { - powerUpOrDown(); // This is the only case where the powerstate is changed - Serial.print( "Powerstate changed from " ); - Serial.print( 1 - newState ); - Serial.print( " to " ); - Serial.print( newState ); - Serial.print( "\n" ); - } - } - delay( 5000 ); // for startup -} - -int getPowerState() // returns 0 if GPRS Shield is off, and 1 if GPRS Shield is on. This corresponds to the constant HIGH LOW enumeration -{ - int ret; - if ( digitalRead(18) == 0 && digitalRead(19) == 0 ) // tests pins 18 and 19 for activity. See ExFoundImportantPins sketch to find out why - ret = 1; - else - ret = 0; - - return ret; -} - -void powerUpOrDown() // toggle the power of the shield -{ - pinMode( 9, OUTPUT ); - digitalWrite( 9, LOW ); - delay( 1000 ); - digitalWrite( 9, HIGH ); - delay( 2000 ); - digitalWrite( 9, LOW ); - delay( 3000 ); -} - -// -// End of default power control -// - -void clearBufferArray() // gives each element in the buffer array a null value -{ - for( int i = 0; i < count; i++ ) - buffer[ i ] = NULL; -} - -void makeMissedCall( char num[] ) -{ - int i; - char in[ 18 ] = "ATD"; - for( i = 3; i <= 14; i++ ) // AT command string containing telephone number is prepared - in[ i ] = num[ i - 3] ; - in[ 15 ] = ';'; - in[ 16 ] = '\r'; - in[ 17 ] = '\0'; - GPRS.write( in ); // AT command requesting call is sent - delay( 10000 ); // enough time is given for GSM connection, and at least one ring. - GPRS.write( "ATH\r\0" ); // AT command requesting hangup is sent - delay( 1000 ); -} - -void sendTextMessage( char number[], char messg[] ) -{ - char temp[ 27 ] = "AT + CMGS = \""; - for( q = 0; q < 12; q++ ) // for-loop is used to prepare the AT command string containing the telephone number - temp[ q + 13 ] = number[ q ]; - temp[ 25 ] = '\"'; - temp[ 26 ] = '\0'; - - GPRS.println( "AT+CMGF=1\r" ); // AT command requesting SMS in text mode is sent - delay( 1000 ); - GPRS.println( temp ); // AT command containing telephone number is sent - delay( 1000 ); - GPRS.println( messg ); //the content of the message - delay( 1000 ); - GPRS.println( (char) 26 ); //the ASCII code of the ctrl+z is 26. This character indicates the end of the message. - delay( 1000 ); -} - -void analise(byte incoming[], int length) // this function receives and analyses all text sent from the GPRS Shield to the serial line. It stores the cell number of the last caller. -{ - e = 0; // Counter that represents a letter in the buffer - done = false; // Boolean that prevents unneccessary loop revolutions - while( e < length && !done){ // while e does not surpass the last letter index of the buffer... - temp = char( incoming[e] ); // store the character at index e in a temporary char - switch( temp ){ // inspect temp - case 'R': - { - if( length > e + 3 && !callIncoming ) { // This case responds to "RING" - if(char( incoming[e + 1] ) == 'I' - && char( incoming[e + 2] ) == 'N' - && char( incoming[e + 3] ) == 'G'){ - GPRS.write("AT+CLCC\r"); // call information is requested - delay(500); // time is given for processing - GPRS.write("ATH\r"); // GPRS shield hangs up - callIncoming = true; // this ensures that a number cannot be stored in any other case than a missed call - done = true; // prevents the further operation of this while loop - } - } - } - break; - case '+': - { - if(char( buffer[ e + 1]) == '2' && length > e + 11 && callIncoming){ // this case responds to "+2", but only if the buffer contains enough characters for a valid cell number - for(t = 0; t < 12; t++) // and only if the callIncoming boolean had been triggered by a previous instance of this function - lastCaller[t] = char( buffer[ e + t ]); // the number of this caller is stored in lastCaller - lastCaller[12] = '\0'; - callIncoming = false; // now we are ready for the next call - done = true; // prevents the further operation of this while loop - } - } - break; - case 'l': - Serial.println(lastCaller); // an easy way to test this function. Simply type "l" to see the value of lastCaller (default "blank") - break; - } - e++; // buffer index is incremented - } -} - -/* -End of GPRS Shield code -*/ - - -/* -Code exclusively for RTC -*/ - -byte decToBcd( byte b ) // converts a byte from a decimal format to a binary-coded decimal -{ - return ( b / 10 << 4 ) + b % 10; -} - -boolean getBit( byte addr, int pos ) // returns a single bit from a determined location in the RTC register -{ - byte temp = getByte( addr ); - return boolean( (temp >> pos) & B00000001 ); -} - -void setBit( byte addr, int pos, boolean newBit ) // ensures that a single bit from a determined location in the RTC register is a determined value -{ - boolean oldBit = getBit( addr, pos ); // bits' current state is retrieved - byte temp = received[ 0 ]; // complete byte is retrieved. it is still left in received from the previous command - if ( oldBit != newBit ) // change is only made if the bit isnt already the correct value - { - if( newBit ) // if newBit is 1, then old bit must be 0, thus we must add an amount - temp += (B00000001 << pos); // 2 to the power of the bit position is added to the byte - else - temp -= (B00000001 << pos); // 2 to the power of the bit position is subtracted from the byte - } - setByte( addr, temp ); // the register is updated with the new byte -} - -byte getByte( byte addr ) // returns a single byte from the given address in the RTC register -{ - byte temp; - if( getBytes( addr, 1) ) // If one byte was read from the address: - temp = received[ 0 ]; // get that byte - else temp = -1; // -1 is returned as an error - return temp; -} - -boolean getBytes( byte addr, int amount ) // updates the byte array "received" with the given amount of bytes, read from the given address -{ // ^ returns false if reading failed - boolean wireWorked = false; - Wire.beginTransmission( DS3231_I2C_ADDRESS ); // We transmit to the RTC - Wire.write( addr ); // We want to read from the given address - Wire.endTransmission(); // We want to receive, so we stop transmitting - Wire.requestFrom( DS3231_I2C_ADDRESS, amount ); // we request the given amount of bytes from the RTC - if( Wire.available() ){ - received[amount]; // prepare the array for the amount of incoming bytes - for( int i = 0; i < amount; i++){ - received[ i ] = Wire.read(); // we read the given amount of bytes - } - wireWorked = true; // everything went as planned - } - return wireWorked; -} - -void setByte( byte addr, byte newByte ) // writes a given byte to a given address in the RTCs register. convenient -{ - setBytes( addr, &newByte, 1); // call the setBytes function with the default amount = 1 -} - -void setBytes( byte addr, byte newBytes[], int amount ) // writes a given amount of bytes in a sequence starting from a given address -{ - Wire.beginTransmission( DS3231_I2C_ADDRESS ); // We transmit to the RTC - Wire.write( addr ); // We want to start writing from the given address - for( int i = 0; i < amount; i++ ) - Wire.write( newBytes[ i ] ); // we write each byte in sequence - Wire.endTransmission(); // we're done here -} - -void getTime() // reads the current time from the register and updates the byte array containing the current time -{ - if( getBytes( DS3231_TIME_CAL_ADDR, 7) ) // if 7 bytes were read in from the time address: - { - for(int i = 0; i < 7; i++) // place each byte in it's place - time[ i ] = received[ i ]; - // The following conversions convert the values from binary-coded decimal format to regular binary: - time[ 0 ] = ( ( time[ 0 ] & B01110000 ) >> 4 ) * 10 + ( time[ 0 ] & B00001111 ); // second - time[ 1 ] = ( ( time[ 1 ] & B01110000 ) >> 4 ) * 10 + ( time[ 1 ] & B00001111 ); // minute - time[ 2 ] = ( ( time[ 2 ] & B00110000 ) >> 4 ) * 10 + ( time[ 2 ] & B00001111 ); // hour - time[ 4 ] = ( ( time[ 4 ] & B00110000 ) >> 4 ) * 10 + ( time[ 4 ] & B00001111 ); // day of month - time[ 5 ] = ( ( time[ 5 ] & B00010000 ) >> 4 ) * 10 + ( time[ 5 ] & B00001111 ); // month - time[ 6 ] = ( ( time[ 6 ] & B11110000 ) >> 4 ) * 10 + ( time[ 6 ] & B00001111 ); // year - } -} - -void setTime( byte newTime[ 7 ] ) // sets the time in the RTC register to the given values -{ - for(int i = 0; i < 7; i++) - newTime[i] = decToBcd(newTime[i]); // the time consists of 7 bytes, each which must be converted to binary-coded decimal - setBytes( DS3231_TIME_CAL_ADDR, newTime, 7 ); // bytes are sent to be written -} - -void getRTCTemperature() // reads the temperature from the register and updates the global temperature float -{ - //temp registers (11h-12h) get updated automatically every 64s - if( getBytes( DS3231_TEMPERATURE_ADDR, 2 ) ) // if 2 bytes were read from the temperature addresss - { - temperature = ( received[ 0 ] & B01111111 ); // assign the integer part of the integer - temperature += ( ( received[ 1 ] >> 6 ) * 0.25 ); // assign the fractional part of the temperature - } -} - -void gprsListen() -{ - if( GPRS.available() ) { // If the GPRS Shield is transmitting data to the Stalker... - while( GPRS.available() ) { // While there is still data left... - buffer[ count++ ] = GPRS.read(); // get the next byte of data - if ( count == 64 ) // we only handle a maximum of 64 bytes of data at a time - break; - } - Serial.write( buffer, count ); // Send the data to the serial line - analise( buffer, count ); - clearBufferArray(); // clear the buffer - count = 0; // reset counter - } - if (Serial.available()) // if the Stalker is transmitting data.... - GPRS.write(Serial.read()); // send the data to the GPRS Shield. -} - -void printTime() // updates time, and prints it in a convenient format -{ - getTime(); - Serial.print( int( time[ 3 ] ) ); // dow - Serial.print( ' ' ); - Serial.print( int( time[ 2 ] ) ); // hour - Serial.print( ':' ); - Serial.print( int( time[ 1 ] ) ); // minute - Serial.print( ':' ); - Serial.print( int( time[ 0 ] ) ); // second - Serial.print( ' ' ); - Serial.print( int( time[ 4 ] ) ); // day - Serial.print( '/' ); - Serial.print( int( time[ 5 ] ) ); // month - Serial.print( "/20" ); - Serial.print( int( time[ 6 ] ) ); // year - Serial.println(); -} - -/* -End of RTC code -*/ - -void setup() -{ - // GPRS Shield startup code - GPRS.begin( 9600 ); - delay(1000); - setPowerStateTo(1); - delay(1000); - - // RTC Startup code - Wire.begin(); - delay(1000); - - Serial.begin(9600); - delay(1000); - -} - -void loop() -{ - gprsListen(); // GPRS Shield listener. Todo: replace w interrupt - getTime(); // Updates the time. Todo: replace w interrupt -} diff --git a/app/test/processing/app/preproc/CharWithEscapedDoubleQuote.nocomments.ino b/app/test/processing/app/preproc/CharWithEscapedDoubleQuote.nocomments.ino deleted file mode 100644 index 0b2af8b5f..000000000 --- a/app/test/processing/app/preproc/CharWithEscapedDoubleQuote.nocomments.ino +++ /dev/null @@ -1,339 +0,0 @@ -#include -#include - - -#define DS3231_I2C_ADDRESS 104 -#define DS3231_TIME_CAL_ADDR 0 -#define DS3231_ALARM1_ADDR 7 -#define DS3231_ALARM2_ADDR 11 -#define DS3231_CONTROL_ADDR 14 -#define DS3231_STATUS_ADDR 15 - -#define DS3231_TEMPERATURE_ADDR 17 - - -SoftwareSerial GPRS( 7, 8 ); -byte buffer[ 64 ]; -int count = 0, e = 0, count2 = 0, t = 0, q; -char temp, lastCaller[13] = "blank"; -boolean callIncoming = false, done; - - -byte time[ 7 ]; -byte time_A1[ 5 ]; -byte time_A2[ 4 ]; -byte received[1]; -float temperature; - - -char telescopeNames[6][4]; - - - - - - - - - -void setPowerStateTo( int newState ) -{ - if( newState != 1 && newState != 0 ) { - Serial.print( "Error: Invalid powerstate. Current powerstate = " ); - Serial.print( getPowerState() ); - Serial.print( "\n" ); - } - else { - if( newState == getPowerState() ) { - Serial.print( "Powerstate = " ); - Serial.print( newState ); - Serial.print( " remains unchanged.\n" ); - } - else { - powerUpOrDown(); - Serial.print( "Powerstate changed from " ); - Serial.print( 1 - newState ); - Serial.print( " to " ); - Serial.print( newState ); - Serial.print( "\n" ); - } - } - delay( 5000 ); -} - -int getPowerState() -{ - int ret; - if ( digitalRead(18) == 0 && digitalRead(19) == 0 ) - ret = 1; - else - ret = 0; - - return ret; -} - -void powerUpOrDown() -{ - pinMode( 9, OUTPUT ); - digitalWrite( 9, LOW ); - delay( 1000 ); - digitalWrite( 9, HIGH ); - delay( 2000 ); - digitalWrite( 9, LOW ); - delay( 3000 ); -} - - - - - -void clearBufferArray() -{ - for( int i = 0; i < count; i++ ) - buffer[ i ] = NULL; -} - -void makeMissedCall( char num[] ) -{ - int i; - char in[ 18 ] = "ATD"; - for( i = 3; i <= 14; i++ ) - in[ i ] = num[ i - 3] ; - in[ 15 ] = ';'; - in[ 16 ] = '\r'; - in[ 17 ] = '\0'; - GPRS.write( in ); - delay( 10000 ); - GPRS.write( "ATH\r\0" ); - delay( 1000 ); -} - -void sendTextMessage( char number[], char messg[] ) -{ - char temp[ 27 ] = "AT + CMGS = \""; - for( q = 0; q < 12; q++ ) - temp[ q + 13 ] = number[ q ]; - temp[ 25 ] = '\"'; - temp[ 26 ] = '\0'; - - GPRS.println( "AT+CMGF=1\r" ); - delay( 1000 ); - GPRS.println( temp ); - delay( 1000 ); - GPRS.println( messg ); - delay( 1000 ); - GPRS.println( (char) 26 ); - delay( 1000 ); -} - -void analise(byte incoming[], int length) -{ - e = 0; - done = false; - while( e < length && !done){ - temp = char( incoming[e] ); - switch( temp ){ - case 'R': - { - if( length > e + 3 && !callIncoming ) { - if(char( incoming[e + 1] ) == 'I' - && char( incoming[e + 2] ) == 'N' - && char( incoming[e + 3] ) == 'G'){ - GPRS.write("AT+CLCC\r"); - delay(500); - GPRS.write("ATH\r"); - callIncoming = true; - done = true; - } - } - } - break; - case '+': - { - if(char( buffer[ e + 1]) == '2' && length > e + 11 && callIncoming){ - for(t = 0; t < 12; t++) - lastCaller[t] = char( buffer[ e + t ]); - lastCaller[12] = '\0'; - callIncoming = false; - done = true; - } - } - break; - case 'l': - Serial.println(lastCaller); - break; - } - e++; - } -} - - - - - - - - - - -byte decToBcd( byte b ) -{ - return ( b / 10 << 4 ) + b % 10; -} - -boolean getBit( byte addr, int pos ) -{ - byte temp = getByte( addr ); - return boolean( (temp >> pos) & B00000001 ); -} - -void setBit( byte addr, int pos, boolean newBit ) -{ - boolean oldBit = getBit( addr, pos ); - byte temp = received[ 0 ]; - if ( oldBit != newBit ) - { - if( newBit ) - temp += (B00000001 << pos); - else - temp -= (B00000001 << pos); - } - setByte( addr, temp ); -} - -byte getByte( byte addr ) -{ - byte temp; - if( getBytes( addr, 1) ) - temp = received[ 0 ]; - else temp = -1; - return temp; -} - -boolean getBytes( byte addr, int amount ) -{ - boolean wireWorked = false; - Wire.beginTransmission( DS3231_I2C_ADDRESS ); - Wire.write( addr ); - Wire.endTransmission(); - Wire.requestFrom( DS3231_I2C_ADDRESS, amount ); - if( Wire.available() ){ - received[amount]; - for( int i = 0; i < amount; i++){ - received[ i ] = Wire.read(); - } - wireWorked = true; - } - return wireWorked; -} - -void setByte( byte addr, byte newByte ) -{ - setBytes( addr, &newByte, 1); -} - -void setBytes( byte addr, byte newBytes[], int amount ) -{ - Wire.beginTransmission( DS3231_I2C_ADDRESS ); - Wire.write( addr ); - for( int i = 0; i < amount; i++ ) - Wire.write( newBytes[ i ] ); - Wire.endTransmission(); -} - -void getTime() -{ - if( getBytes( DS3231_TIME_CAL_ADDR, 7) ) - { - for(int i = 0; i < 7; i++) - time[ i ] = received[ i ]; - - time[ 0 ] = ( ( time[ 0 ] & B01110000 ) >> 4 ) * 10 + ( time[ 0 ] & B00001111 ); - time[ 1 ] = ( ( time[ 1 ] & B01110000 ) >> 4 ) * 10 + ( time[ 1 ] & B00001111 ); - time[ 2 ] = ( ( time[ 2 ] & B00110000 ) >> 4 ) * 10 + ( time[ 2 ] & B00001111 ); - time[ 4 ] = ( ( time[ 4 ] & B00110000 ) >> 4 ) * 10 + ( time[ 4 ] & B00001111 ); - time[ 5 ] = ( ( time[ 5 ] & B00010000 ) >> 4 ) * 10 + ( time[ 5 ] & B00001111 ); - time[ 6 ] = ( ( time[ 6 ] & B11110000 ) >> 4 ) * 10 + ( time[ 6 ] & B00001111 ); - } -} - -void setTime( byte newTime[ 7 ] ) -{ - for(int i = 0; i < 7; i++) - newTime[i] = decToBcd(newTime[i]); - setBytes( DS3231_TIME_CAL_ADDR, newTime, 7 ); -} - -void getRTCTemperature() -{ - - if( getBytes( DS3231_TEMPERATURE_ADDR, 2 ) ) - { - temperature = ( received[ 0 ] & B01111111 ); - temperature += ( ( received[ 1 ] >> 6 ) * 0.25 ); - } -} - -void gprsListen() -{ - if( GPRS.available() ) { - while( GPRS.available() ) { - buffer[ count++ ] = GPRS.read(); - if ( count == 64 ) - break; - } - Serial.write( buffer, count ); - analise( buffer, count ); - clearBufferArray(); - count = 0; - } - if (Serial.available()) - GPRS.write(Serial.read()); -} - -void printTime() -{ - getTime(); - Serial.print( int( time[ 3 ] ) ); - Serial.print( ' ' ); - Serial.print( int( time[ 2 ] ) ); - Serial.print( ':' ); - Serial.print( int( time[ 1 ] ) ); - Serial.print( ':' ); - Serial.print( int( time[ 0 ] ) ); - Serial.print( ' ' ); - Serial.print( int( time[ 4 ] ) ); - Serial.print( '/' ); - Serial.print( int( time[ 5 ] ) ); - Serial.print( "/20" ); - Serial.print( int( time[ 6 ] ) ); - Serial.println(); -} - - - - - -void setup() -{ - - GPRS.begin( 9600 ); - delay(1000); - setPowerStateTo(1); - delay(1000); - - - Wire.begin(); - delay(1000); - - Serial.begin(9600); - delay(1000); - -} - -void loop() -{ - gprsListen(); - getTime(); -} - diff --git a/app/test/processing/app/preproc/CharWithEscapedDoubleQuote.stripped.ino b/app/test/processing/app/preproc/CharWithEscapedDoubleQuote.stripped.ino deleted file mode 100644 index 1579c0907..000000000 --- a/app/test/processing/app/preproc/CharWithEscapedDoubleQuote.stripped.ino +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - - - - -SoftwareSerial GPRS( 7, 8 ); -byte buffer[ 64 ]; -int count = 0, e = 0, count2 = 0, t = 0, q; -char temp, lastCaller[13] = ; -boolean callIncoming = false, done; - - -byte time[ 7 ]; -byte time_A1[ 5 ]; -byte time_A2[ 4 ]; -byte received[1]; -float temperature; - - -char telescopeNames[6][4]; - - - - - - - - - -void setPowerStateTo( int newState ) -{ - if( newState != 1 && newState != 0 ) { - Serial.print( ); - Serial.print( getPowerState() ); - Serial.print( ); - } - else { - if( newState == getPowerState() ) { - Serial.print( ); - Serial.print( newState ); - Serial.print( ); - } - else { - powerUpOrDown(); - Serial.print( ); - Serial.print( 1 - newState ); - Serial.print( ); - Serial.print( newState ); - Serial.print( ); - } - } - delay( 5000 ); -} - -int getPowerState() -{ - int ret; - if ( digitalRead(18) == 0 && digitalRead(19) == 0 ) - ret = 1; - else - ret = 0; - - return ret; -} - -void powerUpOrDown() -{ - pinMode( 9, OUTPUT ); - digitalWrite( 9, LOW ); - delay( 1000 ); - digitalWrite( 9, HIGH ); - delay( 2000 ); - digitalWrite( 9, LOW ); - delay( 3000 ); -} - - - - - -void clearBufferArray() -{ - for( int i = 0; i < count; i++ ) - buffer[ i ] = NULL; -} - -void makeMissedCall( char num[] ) -{ - int i; - char in[ 18 ] = ; - for( i = 3; i <= 14; i++ ) - in[ i ] = num[ i - 3] ; - in[ 15 ] = ; - in[ 16 ] = '\r'; - in[ 17 ] = '\0'; - GPRS.write( in ); - delay( 10000 ); - GPRS.write( ); - delay( 1000 ); -} - -void sendTextMessage( char number[], char messg[] ) -{ - char temp[ 27 ] = ; - for( q = 0; q < 12; q++ ) - temp[ q + 13 ] = number[ q ]; - temp[ 25 ] = ; - temp[ 26 ] = '\0'; - - GPRS.println( ); - delay( 1000 ); - GPRS.println( temp ); - delay( 1000 ); - GPRS.println( messg ); - delay( 1000 ); - GPRS.println( (char) 26 ); - delay( 1000 ); -} - -void analise(byte incoming[], int length) -{ - e = 0; - done = false; - while( e < length && !done){ - temp = char( incoming[e] ); - switch( temp ){ - case : - { - if( length > e + 3 && !callIncoming ) { - if(char( incoming[e + 1] ) == - && char( incoming[e + 2] ) == - && char( incoming[e + 3] ) == ){ - GPRS.write( ); - delay(500); - GPRS.write( ); - callIncoming = true; - done = true; - } - } - } - break; - case : - { - if(char( buffer[ e + 1]) == && length > e + 11 && callIncoming){ - for(t = 0; t < 12; t++) - lastCaller[t] = char( buffer[ e + t ]); - lastCaller[12] = '\0'; - callIncoming = false; - done = true; - } - } - break; - case : - Serial.println(lastCaller); - break; - } - e++; - } -} - - - - - - - - - - -byte decToBcd( byte b ) -{ - return ( b / 10 << 4 ) + b % 10; -} - -boolean getBit( byte addr, int pos ) -{ - byte temp = getByte( addr ); - return boolean( (temp >> pos) & B00000001 ); -} - -void setBit( byte addr, int pos, boolean newBit ) -{ - boolean oldBit = getBit( addr, pos ); - byte temp = received[ 0 ]; - if ( oldBit != newBit ) - { - if( newBit ) - temp += (B00000001 << pos); - else - temp -= (B00000001 << pos); - } - setByte( addr, temp ); -} - -byte getByte( byte addr ) -{ - byte temp; - if( getBytes( addr, 1) ) - temp = received[ 0 ]; - else temp = -1; - return temp; -} - -boolean getBytes( byte addr, int amount ) -{ - boolean wireWorked = false; - Wire.beginTransmission( DS3231_I2C_ADDRESS ); - Wire.write( addr ); - Wire.endTransmission(); - Wire.requestFrom( DS3231_I2C_ADDRESS, amount ); - if( Wire.available() ){ - received[amount]; - for( int i = 0; i < amount; i++){ - received[ i ] = Wire.read(); - } - wireWorked = true; - } - return wireWorked; -} - -void setByte( byte addr, byte newByte ) -{ - setBytes( addr, &newByte, 1); -} - -void setBytes( byte addr, byte newBytes[], int amount ) -{ - Wire.beginTransmission( DS3231_I2C_ADDRESS ); - Wire.write( addr ); - for( int i = 0; i < amount; i++ ) - Wire.write( newBytes[ i ] ); - Wire.endTransmission(); -} - -void getTime() -{ - if( getBytes( DS3231_TIME_CAL_ADDR, 7) ) - { - for(int i = 0; i < 7; i++) - time[ i ] = received[ i ]; - - time[ 0 ] = ( ( time[ 0 ] & B01110000 ) >> 4 ) * 10 + ( time[ 0 ] & B00001111 ); - time[ 1 ] = ( ( time[ 1 ] & B01110000 ) >> 4 ) * 10 + ( time[ 1 ] & B00001111 ); - time[ 2 ] = ( ( time[ 2 ] & B00110000 ) >> 4 ) * 10 + ( time[ 2 ] & B00001111 ); - time[ 4 ] = ( ( time[ 4 ] & B00110000 ) >> 4 ) * 10 + ( time[ 4 ] & B00001111 ); - time[ 5 ] = ( ( time[ 5 ] & B00010000 ) >> 4 ) * 10 + ( time[ 5 ] & B00001111 ); - time[ 6 ] = ( ( time[ 6 ] & B11110000 ) >> 4 ) * 10 + ( time[ 6 ] & B00001111 ); - } -} - -void setTime( byte newTime[ 7 ] ) -{ - for(int i = 0; i < 7; i++) - newTime[i] = decToBcd(newTime[i]); - setBytes( DS3231_TIME_CAL_ADDR, newTime, 7 ); -} - -void getRTCTemperature() -{ - - if( getBytes( DS3231_TEMPERATURE_ADDR, 2 ) ) - { - temperature = ( received[ 0 ] & B01111111 ); - temperature += ( ( received[ 1 ] >> 6 ) * 0.25 ); - } -} - -void gprsListen() -{ - if( GPRS.available() ) { - while( GPRS.available() ) { - buffer[ count++ ] = GPRS.read(); - if ( count == 64 ) - break; - } - Serial.write( buffer, count ); - analise( buffer, count ); - clearBufferArray(); - count = 0; - } - if (Serial.available()) - GPRS.write(Serial.read()); -} - -void printTime() -{ - getTime(); - Serial.print( int( time[ 3 ] ) ); - Serial.print( ); - Serial.print( int( time[ 2 ] ) ); - Serial.print( ); - Serial.print( int( time[ 1 ] ) ); - Serial.print( ); - Serial.print( int( time[ 0 ] ) ); - Serial.print( ); - Serial.print( int( time[ 4 ] ) ); - Serial.print( ); - Serial.print( int( time[ 5 ] ) ); - Serial.print( ); - Serial.print( int( time[ 6 ] ) ); - Serial.println(); -} - - - - - -void setup() -{ - - GPRS.begin( 9600 ); - delay(1000); - setPowerStateTo(1); - delay(1000); - - - Wire.begin(); - delay(1000); - - Serial.begin(9600); - delay(1000); - -} - -void loop() -{ - gprsListen(); - getTime(); -} diff --git a/app/test/processing/app/preproc/IncludeBetweenMultilineComment.ino b/app/test/processing/app/preproc/IncludeBetweenMultilineComment.ino deleted file mode 100644 index 1c22729a8..000000000 --- a/app/test/processing/app/preproc/IncludeBetweenMultilineComment.ino +++ /dev/null @@ -1,15 +0,0 @@ -#include -/* -#include -*/ -CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8); -void setup() -{ - Serial.begin(9600); -} -void loop() -{ - long total1 = cs_13_8.read(30); - Serial.println(total1); - delay(100); -} \ No newline at end of file diff --git a/app/test/processing/app/preproc/IncludeBetweenMultilineComment.nocomments.ino b/app/test/processing/app/preproc/IncludeBetweenMultilineComment.nocomments.ino deleted file mode 100644 index 9981e5806..000000000 --- a/app/test/processing/app/preproc/IncludeBetweenMultilineComment.nocomments.ino +++ /dev/null @@ -1,16 +0,0 @@ -#include - - - -CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8); -void setup() -{ - Serial.begin(9600); -} -void loop() -{ - long total1 = cs_13_8.read(30); - Serial.println(total1); - delay(100); -} - diff --git a/app/test/processing/app/preproc/IncludeBetweenMultilineComment.stripped.ino b/app/test/processing/app/preproc/IncludeBetweenMultilineComment.stripped.ino deleted file mode 100644 index aeb99c235..000000000 --- a/app/test/processing/app/preproc/IncludeBetweenMultilineComment.stripped.ino +++ /dev/null @@ -1,15 +0,0 @@ - - - - -CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8); -void setup() -{ - Serial.begin(9600); -} -void loop() -{ - long total1 = cs_13_8.read(30); - Serial.println(total1); - delay(100); -} diff --git a/app/test/processing/app/preproc/LineContinuations.ino b/app/test/processing/app/preproc/LineContinuations.ino deleted file mode 100644 index 8611603e0..000000000 --- a/app/test/processing/app/preproc/LineContinuations.ino +++ /dev/null @@ -1,34 +0,0 @@ -const char *foo = "\ -hello \ -world\n"; - -//" delete this comment line and the IDE parser will crash - -void setup() -{ -} - -void loop() -{ -} -/* -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -*/ diff --git a/app/test/processing/app/preproc/LineContinuations.nocomments.ino b/app/test/processing/app/preproc/LineContinuations.nocomments.ino deleted file mode 100644 index 1f220926a..000000000 --- a/app/test/processing/app/preproc/LineContinuations.nocomments.ino +++ /dev/null @@ -1,35 +0,0 @@ -const char *foo = "\ -hello \ -world\n"; - - - -void setup() -{ -} - -void loop() -{ -} - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/test/processing/app/preproc/LineContinuations.stripped.ino b/app/test/processing/app/preproc/LineContinuations.stripped.ino deleted file mode 100644 index 622928751..000000000 --- a/app/test/processing/app/preproc/LineContinuations.stripped.ino +++ /dev/null @@ -1,34 +0,0 @@ -const char *foo = - - ; - - - -void setup() -{ -} - -void loop() -{ -} - - - - - - - - - - - - - - - - - - - - - diff --git a/app/test/processing/app/preproc/PdePreprocessorTest.java b/app/test/processing/app/preproc/PdePreprocessorTest.java deleted file mode 100644 index ef2f916c1..000000000 --- a/app/test/processing/app/preproc/PdePreprocessorTest.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * This file is part of Arduino. - * - * Copyright 2015 Arduino LLC (http://www.arduino.cc/) - * - * Arduino is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * As a special exception, you may use this file as part of a free software - * library without restriction. Specifically, if other files instantiate - * templates or use macros or inline functions from this file, or you compile - * this file and link it with other files to produce an executable, this - * file does not by itself cause the resulting executable to be covered by - * the GNU General Public License. This exception does not however - * invalidate any other reasons why the executable file might be covered by - * the GNU General Public License. - */ - -package processing.app.preproc; - -import org.junit.Test; -import processing.app.helpers.FileUtils; - -import java.io.File; - -import static org.junit.Assert.assertEquals; - -public class PdePreprocessorTest { - - @Test - public void testSourceWithQuoteAndDoubleQuotesEscapedAndFinalQuoteShouldNotRaiseException() throws Exception { - String s = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("RemoteCallLogger_v1e0.ino").getFile())); - - PdePreprocessor pdePreprocessor = new PdePreprocessor(); - String strippedOutput = pdePreprocessor.strip(s); - String expectedStrippedOutput = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("RemoteCallLogger_v1e0.stripped.ino").getFile())); - - assertEquals(expectedStrippedOutput, strippedOutput); - - pdePreprocessor.writePrefix(s); - - String actualCodeWithoutComments = pdePreprocessor.program; - String expectedCodeWithoutComments = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("RemoteCallLogger_v1e0.nocomments.ino").getFile())); - - assertEquals(expectedCodeWithoutComments, actualCodeWithoutComments); - - assertEquals(2, pdePreprocessor.getExtraImports().size()); - assertEquals("SoftwareSerial.h", pdePreprocessor.getExtraImports().get(0)); - assertEquals("Wire.h", pdePreprocessor.getExtraImports().get(1)); - } - - @Test - public void testIncludeInsideMultilineComment() throws Exception { - String s = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("IncludeBetweenMultilineComment.ino").getFile())); - - PdePreprocessor pdePreprocessor = new PdePreprocessor(); - String strippedOutput = pdePreprocessor.strip(s); - String expectedStrippedOutput = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("IncludeBetweenMultilineComment.stripped.ino").getFile())); - - assertEquals(expectedStrippedOutput, strippedOutput); - - pdePreprocessor.writePrefix(s); - - String actualCodeWithoutComments = pdePreprocessor.program; - String expectedCodeWithoutComments = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("IncludeBetweenMultilineComment.nocomments.ino").getFile())); - - assertEquals(expectedCodeWithoutComments, actualCodeWithoutComments); - - assertEquals(1, pdePreprocessor.getExtraImports().size()); - assertEquals("CapacitiveSensorDue.h", pdePreprocessor.getExtraImports().get(0)); - } - - @Test - public void testPdePreprocessorRegressionBaladuino() throws Exception { - String s = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("Baladuino.ino").getFile())); - - PdePreprocessor pdePreprocessor = new PdePreprocessor(); - String strippedOutput = pdePreprocessor.strip(s); - String expectedStrippedOutput = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("Baladuino.stripped.ino").getFile())); - - assertEquals(expectedStrippedOutput, strippedOutput); - - pdePreprocessor.writePrefix(s); - - String actualCodeWithoutComments = pdePreprocessor.program; - String expectedCodeWithoutComments = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("Baladuino.nocomments.ino").getFile())); - - assertEquals(expectedCodeWithoutComments, actualCodeWithoutComments); - - assertEquals(9, pdePreprocessor.getExtraImports().size()); - assertEquals("Balanduino.h", pdePreprocessor.getExtraImports().get(0)); - assertEquals("Wire.h", pdePreprocessor.getExtraImports().get(1)); - assertEquals("usbhub.h", pdePreprocessor.getExtraImports().get(2)); - assertEquals("adk.h", pdePreprocessor.getExtraImports().get(3)); - assertEquals("Kalman.h", pdePreprocessor.getExtraImports().get(4)); - assertEquals("XBOXRECV.h", pdePreprocessor.getExtraImports().get(5)); - assertEquals("SPP.h", pdePreprocessor.getExtraImports().get(6)); - assertEquals("PS3BT.h", pdePreprocessor.getExtraImports().get(7)); - assertEquals("Wii.h", pdePreprocessor.getExtraImports().get(8)); - } - - @Test - public void testStringWithCcomment() throws Exception { - String s = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("StringWithCcomment.ino").getFile())); - - PdePreprocessor pdePreprocessor = new PdePreprocessor(); - String strippedOutput = pdePreprocessor.strip(s); - String expectedStrippedOutput = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("StringWithCcomment.stripped.ino").getFile())); - - assertEquals(expectedStrippedOutput, strippedOutput); - - pdePreprocessor.writePrefix(s); - - String actualCodeWithoutComments = pdePreprocessor.program; - String expectedCodeWithoutComments = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("StringWithCcomment.nocomments.ino").getFile())); - - assertEquals(expectedCodeWithoutComments, actualCodeWithoutComments); - - assertEquals(0, pdePreprocessor.getExtraImports().size()); - } - - @Test - public void testCharWithEscapedDoubleQuote() throws Exception { - String s = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("CharWithEscapedDoubleQuote.ino").getFile())); - - PdePreprocessor pdePreprocessor = new PdePreprocessor(); - String strippedOutput = pdePreprocessor.strip(s); - String expectedStrippedOutput = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("CharWithEscapedDoubleQuote.stripped.ino").getFile())); - - assertEquals(expectedStrippedOutput, strippedOutput); - - pdePreprocessor.writePrefix(s); - - String actualCodeWithoutComments = pdePreprocessor.program; - String expectedCodeWithoutComments = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("CharWithEscapedDoubleQuote.nocomments.ino").getFile())); - - assertEquals(expectedCodeWithoutComments, actualCodeWithoutComments); - - assertEquals(2, pdePreprocessor.getExtraImports().size()); - assertEquals("SoftwareSerial.h", pdePreprocessor.getExtraImports().get(0)); - assertEquals("Wire.h", pdePreprocessor.getExtraImports().get(1)); - } - - @Test - public void testLineContinuations() throws Exception { - String s = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("LineContinuations.ino").getFile())); - - PdePreprocessor pdePreprocessor = new PdePreprocessor(); - String strippedOutput = pdePreprocessor.strip(s); - String expectedStrippedOutput = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("LineContinuations.stripped.ino").getFile())); - - assertEquals(expectedStrippedOutput, strippedOutput); - - pdePreprocessor.writePrefix(s); - - String actualCodeWithoutComments = pdePreprocessor.program; - String expectedCodeWithoutComments = FileUtils.readFileToString(new File(PdePreprocessorTest.class.getResource("LineContinuations.nocomments.ino").getFile())); - - assertEquals(expectedCodeWithoutComments, actualCodeWithoutComments); - - assertEquals(0, pdePreprocessor.getExtraImports().size()); - } - -} \ No newline at end of file diff --git a/app/test/processing/app/preproc/RemoteCallLogger_v1e0.ino b/app/test/processing/app/preproc/RemoteCallLogger_v1e0.ino deleted file mode 100644 index 36e6e6397..000000000 --- a/app/test/processing/app/preproc/RemoteCallLogger_v1e0.ino +++ /dev/null @@ -1,343 +0,0 @@ - -#include // required to send and receive AT commands from the GPRS Shield -#include // required for I2C communication with the RTC - -// pin numbers for RTC -#define DS3231_I2C_ADDRESS 104 // 0x68 // Address for RTC -#define DS3231_TIME_CAL_ADDR 0 // 0x00 -#define DS3231_ALARM1_ADDR 7 // 0x07 -#define DS3231_ALARM2_ADDR 11 // 0x0B -#define DS3231_CONTROL_ADDR 14 // 0x0E -#define DS3231_STATUS_ADDR 15 // 0x0F -//#define DS3231_AGING_OFFSET_ADDR 16 // 0x10 -#define DS3231_TEMPERATURE_ADDR 17 // 0x11 - -// Declarations for GPRS shield -SoftwareSerial GPRS( 7, 8 ); // A softwareSerial line is defined for the GPRS Shield -byte buffer[ 64 ]; // Buffer is used to transfer data from the GPRS line to the serial line -int count = 0, e = 0, count2 = 0, t = 0, q; -char temp, lastCaller[13] = "blank"; -boolean callIncoming = false, done; - -// Declarations for RTC -byte time[ 7 ]; // second, minute, hour, dow, day, month, year -byte time_A1[ 5 ]; // second_A1, minute_A1, hour_A1, day_A1, DY/DT -byte time_A2[ 4 ]; // minute_A2, hour_A2, day_A2, DY/DT -byte received[1]; // used to catch bytes sent from the clock -float temperature; // clock temperature is updated every 64 s - -// Declarations for RemoteCallLogger -char telescopeNames[6][4]; - -/* -Code Exclusively for GPRS shield: -*/ - -// -// Default set of instructions for GPRS Shield power control -// - -void setPowerStateTo( int newState ) -{ - if( newState != 1 && newState != 0 ) { // tests for an invalid state. In this case no change is made to powerstate - Serial.print( "Error: Invalid powerstate. Current powerstate = " ); - Serial.print( getPowerState() ); - Serial.print( "\n" ); - } - else { - if( newState == getPowerState() ) { // if the requested powerstate is already in effect, no action is taken - Serial.print( "Powerstate = " ); - Serial.print( newState ); - Serial.print( " remains unchanged.\n" ); - } - else { - powerUpOrDown(); // This is the only case where the powerstate is changed - Serial.print( "Powerstate changed from " ); - Serial.print( 1 - newState ); - Serial.print( " to " ); - Serial.print( newState ); - Serial.print( "\n" ); - } - } - delay( 5000 ); // for startup -} - -int getPowerState() // returns 0 if GPRS Shield is off, and 1 if GPRS Shield is on. This corresponds to the constant HIGH LOW enumeration -{ - int ret; - if ( digitalRead(18) == 0 && digitalRead(19) == 0 ) // tests pins 18 and 19 for activity. See ExFoundImportantPins sketch to find out why - ret = 1; - else - ret = 0; - - return ret; -} - -void powerUpOrDown() // toggle the power of the shield -{ - pinMode( 9, OUTPUT ); - digitalWrite( 9, LOW ); - delay( 1000 ); - digitalWrite( 9, HIGH ); - delay( 2000 ); - digitalWrite( 9, LOW ); - delay( 3000 ); -} - -// -// End of default power control -// - -void clearBufferArray() // gives each element in the buffer array a null value -{ - for( int i = 0; i < count; i++ ) - buffer[ i ] = NULL; -} - -void makeMissedCall( char num[] ) -{ - int i; - char in[ 18 ] = "ATD"; - for( i = 3; i <= 14; i++ ) // AT command string containing telephone number is prepared - in[ i ] = num[ i - 3] ; - in[ 15 ] = ';'; - in[ 16 ] = '\r'; - in[ 17 ] = '\0'; - GPRS.write( in ); // AT command requesting call is sent - delay( 10000 ); // enough time is given for GSM connection, and at least one ring. - GPRS.write( "ATH\r\0" ); // AT command requesting hangup is sent - delay( 1000 ); -} - -void sendTextMessage( char number[], char messg[] ) -{ - char temp[ 27 ] = "AT + CMGS = \""; - for( q = 0; q < 12; q++ ) // for-loop is used to prepare the AT command string containing the telephone number - temp[ q + 13 ] = number[ q ]; - temp[ 25 ] = '\"'; - temp[ 26 ] = '\0'; - - GPRS.println( "AT+CMGF=1\r" ); // AT command requesting SMS in text mode is sent - delay( 1000 ); - GPRS.println( temp ); // AT command containing telephone number is sent - delay( 1000 ); - GPRS.println( messg ); //the content of the message - delay( 1000 ); - GPRS.println( (char) 26 ); //the ASCII code of the ctrl+z is 26. This character indicates the end of the message. - delay( 1000 ); -} - -void analise(byte incoming[], int length) // this function receives and analyses all text sent from the GPRS Shield to the serial line. It stores the cell number of the last caller. -{ - e = 0; // Counter that represents a letter in the buffer - done = false; // Boolean that prevents unneccessary loop revolutions - while( e < length && !done){ // while e does not surpass the last letter index of the buffer... - temp = char( incoming[e] ); // store the character at index e in a temporary char - switch( temp ){ // inspect temp - case 'R': - { - if( length > e + 3 && !callIncoming ) { // This case responds to "RING" - if(char( incoming[e + 1] ) == 'I' - && char( incoming[e + 2] ) == 'N' - && char( incoming[e + 3] ) == 'G'){ - GPRS.write("AT+CLCC\r"); // call information is requested - delay(500); // time is given for processing - GPRS.write("ATH\r"); // GPRS shield hangs up - callIncoming = true; // this ensures that a number cannot be stored in any other case than a missed call - done = true; // prevents the further operation of this while loop - } - } - } - break; - case '+': - { - if(char( buffer[ e + 1]) == '2' && length > e + 11 && callIncoming){ // this case responds to "+2", but only if the buffer contains enough characters for a valid cell number - for(t = 0; t < 12; t++) // and only if the callIncoming boolean had been triggered by a previous instance of this function - lastCaller[t] = char( buffer[ e + t ]); // the number of this caller is stored in lastCaller - lastCaller[12] = '\0'; - callIncoming = false; // now we are ready for the next call - done = true; // prevents the further operation of this while loop - } - } - break; - case 'l': - Serial.println(lastCaller); // an easy way to test this function. Simply type "l" to see the value of lastCaller (default "blank") - break; - } - e++; // buffer index is incremented - } -} - -/* -End of GPRS Shield code -*/ - - -/* -Code exclusively for RTC -*/ - -byte decToBcd( byte b ) // converts a byte from a decimal format to a binary-coded decimal -{ - return ( b / 10 << 4 ) + b % 10; -} - -boolean getBit( byte addr, int pos ) // returns a single bit from a determined location in the RTC register -{ - byte temp = getByte( addr ); - return boolean( (temp >> pos) & B00000001 ); -} - -void setBit( byte addr, int pos, boolean newBit ) // ensures that a single bit from a determined location in the RTC register is a determined value -{ - boolean oldBit = getBit( addr, pos ); // bits' current state is retrieved - byte temp = received[ 0 ]; // complete byte is retrieved. it is still left in received from the previous command - if ( oldBit != newBit ) // change is only made if the bit isnt already the correct value - { - if( newBit ) // if newBit is 1, then old bit must be 0, thus we must add an amount - temp += (B00000001 << pos); // 2 to the power of the bit position is added to the byte - else - temp -= (B00000001 << pos); // 2 to the power of the bit position is subtracted from the byte - } - setByte( addr, temp ); // the register is updated with the new byte -} - -byte getByte( byte addr ) // returns a single byte from the given address in the RTC register -{ - byte temp; - if( getBytes( addr, 1) ) // If one byte was read from the address: - temp = received[ 0 ]; // get that byte - else temp = -1; // -1 is returned as an error - return temp; -} - -boolean getBytes( byte addr, int amount ) // updates the byte array "received" with the given amount of bytes, read from the given address -{ // ^ returns false if reading failed - boolean wireWorked = false; - Wire.beginTransmission( DS3231_I2C_ADDRESS ); // We transmit to the RTC - Wire.write( addr ); // We want to read from the given address - Wire.endTransmission(); // We want to receive, so we stop transmitting - Wire.requestFrom( DS3231_I2C_ADDRESS, amount ); // we request the given amount of bytes from the RTC - if( Wire.available() ){ - received[amount]; // prepare the array for the amount of incoming bytes - for( int i = 0; i < amount; i++){ - received[ i ] = Wire.read(); // we read the given amount of bytes - } - wireWorked = true; // everything went as planned - } - return wireWorked; -} - -void setByte( byte addr, byte newByte ) // writes a given byte to a given address in the RTCs register. convenient -{ - setBytes( addr, &newByte, 1); // call the setBytes function with the default amount = 1 -} - -void setBytes( byte addr, byte newBytes[], int amount ) // writes a given amount of bytes in a sequence starting from a given address -{ - Wire.beginTransmission( DS3231_I2C_ADDRESS ); // We transmit to the RTC - Wire.write( addr ); // We want to start writing from the given address - for( int i = 0; i < amount; i++ ) - Wire.write( newBytes[ i ] ); // we write each byte in sequence - Wire.endTransmission(); // we're done here -} - -void getTime() // reads the current time from the register and updates the byte array containing the current time -{ - if( getBytes( DS3231_TIME_CAL_ADDR, 7) ) // if 7 bytes were read in from the time address: - { - for(int i = 0; i < 7; i++) // place each byte in it's place - time[ i ] = received[ i ]; - // The following conversions convert the values from binary-coded decimal format to regular binary: - time[ 0 ] = ( ( time[ 0 ] & B01110000 ) >> 4 ) * 10 + ( time[ 0 ] & B00001111 ); // second - time[ 1 ] = ( ( time[ 1 ] & B01110000 ) >> 4 ) * 10 + ( time[ 1 ] & B00001111 ); // minute - time[ 2 ] = ( ( time[ 2 ] & B00110000 ) >> 4 ) * 10 + ( time[ 2 ] & B00001111 ); // hour - time[ 4 ] = ( ( time[ 4 ] & B00110000 ) >> 4 ) * 10 + ( time[ 4 ] & B00001111 ); // day of month - time[ 5 ] = ( ( time[ 5 ] & B00010000 ) >> 4 ) * 10 + ( time[ 5 ] & B00001111 ); // month - time[ 6 ] = ( ( time[ 6 ] & B11110000 ) >> 4 ) * 10 + ( time[ 6 ] & B00001111 ); // year - } -} - -void setTime( byte newTime[ 7 ] ) // sets the time in the RTC register to the given values -{ - for(int i = 0; i < 7; i++) - newTime[i] = decToBcd(newTime[i]); // the time consists of 7 bytes, each which must be converted to binary-coded decimal - setBytes( DS3231_TIME_CAL_ADDR, newTime, 7 ); // bytes are sent to be written -} - -void getRTCTemperature() // reads the temperature from the register and updates the global temperature float -{ - //temp registers (11h-12h) get updated automatically every 64s - if( getBytes( DS3231_TEMPERATURE_ADDR, 2 ) ) // if 2 bytes were read from the temperature addresss - { - temperature = ( received[ 0 ] & B01111111 ); // assign the integer part of the integer - temperature += ( ( received[ 1 ] >> 6 ) * 0.25 ); // assign the fractional part of the temperature - } -} - -void gprsListen() -{ - if( GPRS.available() ) { // If the GPRS Shield is transmitting data to the Stalker... - while( GPRS.available() ) { // While there is still data left... - buffer[ count++ ] = GPRS.read(); // get the next byte of data - if ( count == 64 ) // we only handle a maximum of 64 bytes of data at a time - break; - } - Serial.write( buffer, count ); // Send the data to the serial line - analise( buffer, count ); - clearBufferArray(); // clear the buffer - count = 0; // reset counter - } - if (Serial.available()) // if the Stalker is transmitting data.... - GPRS.write(Serial.read()); // send the data to the GPRS Shield. -} - -void printTime() // updates time, and prints it in a convenient format -{ - getTime(); - Serial.print( int( time[ 3 ] ) ); // dow - Serial.print( ' ' ); - Serial.print( int( time[ 2 ] ) ); // hour - Serial.print( ':' ); - Serial.print( int( time[ 1 ] ) ); // minute - Serial.print( ':' ); - Serial.print( int( time[ 0 ] ) ); // second - Serial.print( ' ' ); - Serial.print( int( time[ 4 ] ) ); // day - Serial.print( '/' ); - Serial.print( int( time[ 5 ] ) ); // month - Serial.print( "/20" ); - Serial.print( int( time[ 6 ] ) ); // year - Serial.println(); -} - -/* -End of RTC code -*/ - -void setup() -{ - // GPRS Shield startup code - GPRS.begin( 9600 ); - delay(1000); - setPowerStateTo(1); - delay(1000); - - // RTC Startup code - Wire.begin(); - delay(1000); - - Serial.begin(9600); - delay(1000); - -} - -void loop() -{ - gprsListen(); // GPRS Shield listener. Todo: replace w interrupt - getTime(); // Updates the time. Todo: replace w interrupt -} - - - - diff --git a/app/test/processing/app/preproc/RemoteCallLogger_v1e0.nocomments.ino b/app/test/processing/app/preproc/RemoteCallLogger_v1e0.nocomments.ino deleted file mode 100644 index bbf15560e..000000000 --- a/app/test/processing/app/preproc/RemoteCallLogger_v1e0.nocomments.ino +++ /dev/null @@ -1,344 +0,0 @@ - -#include -#include - - -#define DS3231_I2C_ADDRESS 104 -#define DS3231_TIME_CAL_ADDR 0 -#define DS3231_ALARM1_ADDR 7 -#define DS3231_ALARM2_ADDR 11 -#define DS3231_CONTROL_ADDR 14 -#define DS3231_STATUS_ADDR 15 - -#define DS3231_TEMPERATURE_ADDR 17 - - -SoftwareSerial GPRS( 7, 8 ); -byte buffer[ 64 ]; -int count = 0, e = 0, count2 = 0, t = 0, q; -char temp, lastCaller[13] = "blank"; -boolean callIncoming = false, done; - - -byte time[ 7 ]; -byte time_A1[ 5 ]; -byte time_A2[ 4 ]; -byte received[1]; -float temperature; - - -char telescopeNames[6][4]; - - - - - - - - - -void setPowerStateTo( int newState ) -{ - if( newState != 1 && newState != 0 ) { - Serial.print( "Error: Invalid powerstate. Current powerstate = " ); - Serial.print( getPowerState() ); - Serial.print( "\n" ); - } - else { - if( newState == getPowerState() ) { - Serial.print( "Powerstate = " ); - Serial.print( newState ); - Serial.print( " remains unchanged.\n" ); - } - else { - powerUpOrDown(); - Serial.print( "Powerstate changed from " ); - Serial.print( 1 - newState ); - Serial.print( " to " ); - Serial.print( newState ); - Serial.print( "\n" ); - } - } - delay( 5000 ); -} - -int getPowerState() -{ - int ret; - if ( digitalRead(18) == 0 && digitalRead(19) == 0 ) - ret = 1; - else - ret = 0; - - return ret; -} - -void powerUpOrDown() -{ - pinMode( 9, OUTPUT ); - digitalWrite( 9, LOW ); - delay( 1000 ); - digitalWrite( 9, HIGH ); - delay( 2000 ); - digitalWrite( 9, LOW ); - delay( 3000 ); -} - - - - - -void clearBufferArray() -{ - for( int i = 0; i < count; i++ ) - buffer[ i ] = NULL; -} - -void makeMissedCall( char num[] ) -{ - int i; - char in[ 18 ] = "ATD"; - for( i = 3; i <= 14; i++ ) - in[ i ] = num[ i - 3] ; - in[ 15 ] = ';'; - in[ 16 ] = '\r'; - in[ 17 ] = '\0'; - GPRS.write( in ); - delay( 10000 ); - GPRS.write( "ATH\r\0" ); - delay( 1000 ); -} - -void sendTextMessage( char number[], char messg[] ) -{ - char temp[ 27 ] = "AT + CMGS = \""; - for( q = 0; q < 12; q++ ) - temp[ q + 13 ] = number[ q ]; - temp[ 25 ] = '\"'; - temp[ 26 ] = '\0'; - - GPRS.println( "AT+CMGF=1\r" ); - delay( 1000 ); - GPRS.println( temp ); - delay( 1000 ); - GPRS.println( messg ); - delay( 1000 ); - GPRS.println( (char) 26 ); - delay( 1000 ); -} - -void analise(byte incoming[], int length) -{ - e = 0; - done = false; - while( e < length && !done){ - temp = char( incoming[e] ); - switch( temp ){ - case 'R': - { - if( length > e + 3 && !callIncoming ) { - if(char( incoming[e + 1] ) == 'I' - && char( incoming[e + 2] ) == 'N' - && char( incoming[e + 3] ) == 'G'){ - GPRS.write("AT+CLCC\r"); - delay(500); - GPRS.write("ATH\r"); - callIncoming = true; - done = true; - } - } - } - break; - case '+': - { - if(char( buffer[ e + 1]) == '2' && length > e + 11 && callIncoming){ - for(t = 0; t < 12; t++) - lastCaller[t] = char( buffer[ e + t ]); - lastCaller[12] = '\0'; - callIncoming = false; - done = true; - } - } - break; - case 'l': - Serial.println(lastCaller); - break; - } - e++; - } -} - - - - - - - - - - -byte decToBcd( byte b ) -{ - return ( b / 10 << 4 ) + b % 10; -} - -boolean getBit( byte addr, int pos ) -{ - byte temp = getByte( addr ); - return boolean( (temp >> pos) & B00000001 ); -} - -void setBit( byte addr, int pos, boolean newBit ) -{ - boolean oldBit = getBit( addr, pos ); - byte temp = received[ 0 ]; - if ( oldBit != newBit ) - { - if( newBit ) - temp += (B00000001 << pos); - else - temp -= (B00000001 << pos); - } - setByte( addr, temp ); -} - -byte getByte( byte addr ) -{ - byte temp; - if( getBytes( addr, 1) ) - temp = received[ 0 ]; - else temp = -1; - return temp; -} - -boolean getBytes( byte addr, int amount ) -{ - boolean wireWorked = false; - Wire.beginTransmission( DS3231_I2C_ADDRESS ); - Wire.write( addr ); - Wire.endTransmission(); - Wire.requestFrom( DS3231_I2C_ADDRESS, amount ); - if( Wire.available() ){ - received[amount]; - for( int i = 0; i < amount; i++){ - received[ i ] = Wire.read(); - } - wireWorked = true; - } - return wireWorked; -} - -void setByte( byte addr, byte newByte ) -{ - setBytes( addr, &newByte, 1); -} - -void setBytes( byte addr, byte newBytes[], int amount ) -{ - Wire.beginTransmission( DS3231_I2C_ADDRESS ); - Wire.write( addr ); - for( int i = 0; i < amount; i++ ) - Wire.write( newBytes[ i ] ); - Wire.endTransmission(); -} - -void getTime() -{ - if( getBytes( DS3231_TIME_CAL_ADDR, 7) ) - { - for(int i = 0; i < 7; i++) - time[ i ] = received[ i ]; - - time[ 0 ] = ( ( time[ 0 ] & B01110000 ) >> 4 ) * 10 + ( time[ 0 ] & B00001111 ); - time[ 1 ] = ( ( time[ 1 ] & B01110000 ) >> 4 ) * 10 + ( time[ 1 ] & B00001111 ); - time[ 2 ] = ( ( time[ 2 ] & B00110000 ) >> 4 ) * 10 + ( time[ 2 ] & B00001111 ); - time[ 4 ] = ( ( time[ 4 ] & B00110000 ) >> 4 ) * 10 + ( time[ 4 ] & B00001111 ); - time[ 5 ] = ( ( time[ 5 ] & B00010000 ) >> 4 ) * 10 + ( time[ 5 ] & B00001111 ); - time[ 6 ] = ( ( time[ 6 ] & B11110000 ) >> 4 ) * 10 + ( time[ 6 ] & B00001111 ); - } -} - -void setTime( byte newTime[ 7 ] ) -{ - for(int i = 0; i < 7; i++) - newTime[i] = decToBcd(newTime[i]); - setBytes( DS3231_TIME_CAL_ADDR, newTime, 7 ); -} - -void getRTCTemperature() -{ - - if( getBytes( DS3231_TEMPERATURE_ADDR, 2 ) ) - { - temperature = ( received[ 0 ] & B01111111 ); - temperature += ( ( received[ 1 ] >> 6 ) * 0.25 ); - } -} - -void gprsListen() -{ - if( GPRS.available() ) { - while( GPRS.available() ) { - buffer[ count++ ] = GPRS.read(); - if ( count == 64 ) - break; - } - Serial.write( buffer, count ); - analise( buffer, count ); - clearBufferArray(); - count = 0; - } - if (Serial.available()) - GPRS.write(Serial.read()); -} - -void printTime() -{ - getTime(); - Serial.print( int( time[ 3 ] ) ); - Serial.print( ' ' ); - Serial.print( int( time[ 2 ] ) ); - Serial.print( ':' ); - Serial.print( int( time[ 1 ] ) ); - Serial.print( ':' ); - Serial.print( int( time[ 0 ] ) ); - Serial.print( ' ' ); - Serial.print( int( time[ 4 ] ) ); - Serial.print( '/' ); - Serial.print( int( time[ 5 ] ) ); - Serial.print( "/20" ); - Serial.print( int( time[ 6 ] ) ); - Serial.println(); -} - - - - - -void setup() -{ - - GPRS.begin( 9600 ); - delay(1000); - setPowerStateTo(1); - delay(1000); - - - Wire.begin(); - delay(1000); - - Serial.begin(9600); - delay(1000); - -} - -void loop() -{ - gprsListen(); - getTime(); -} - - - - - diff --git a/app/test/processing/app/preproc/RemoteCallLogger_v1e0.stripped.ino b/app/test/processing/app/preproc/RemoteCallLogger_v1e0.stripped.ino deleted file mode 100644 index 75b4393ff..000000000 --- a/app/test/processing/app/preproc/RemoteCallLogger_v1e0.stripped.ino +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - - - - - - - - -SoftwareSerial GPRS( 7, 8 ); -byte buffer[ 64 ]; -int count = 0, e = 0, count2 = 0, t = 0, q; -char temp, lastCaller[13] = ; -boolean callIncoming = false, done; - - -byte time[ 7 ]; -byte time_A1[ 5 ]; -byte time_A2[ 4 ]; -byte received[1]; -float temperature; - - -char telescopeNames[6][4]; - - - - - - - - - -void setPowerStateTo( int newState ) -{ - if( newState != 1 && newState != 0 ) { - Serial.print( ); - Serial.print( getPowerState() ); - Serial.print( ); - } - else { - if( newState == getPowerState() ) { - Serial.print( ); - Serial.print( newState ); - Serial.print( ); - } - else { - powerUpOrDown(); - Serial.print( ); - Serial.print( 1 - newState ); - Serial.print( ); - Serial.print( newState ); - Serial.print( ); - } - } - delay( 5000 ); -} - -int getPowerState() -{ - int ret; - if ( digitalRead(18) == 0 && digitalRead(19) == 0 ) - ret = 1; - else - ret = 0; - - return ret; -} - -void powerUpOrDown() -{ - pinMode( 9, OUTPUT ); - digitalWrite( 9, LOW ); - delay( 1000 ); - digitalWrite( 9, HIGH ); - delay( 2000 ); - digitalWrite( 9, LOW ); - delay( 3000 ); -} - - - - - -void clearBufferArray() -{ - for( int i = 0; i < count; i++ ) - buffer[ i ] = NULL; -} - -void makeMissedCall( char num[] ) -{ - int i; - char in[ 18 ] = ; - for( i = 3; i <= 14; i++ ) - in[ i ] = num[ i - 3] ; - in[ 15 ] = ; - in[ 16 ] = '\r'; - in[ 17 ] = '\0'; - GPRS.write( in ); - delay( 10000 ); - GPRS.write( ); - delay( 1000 ); -} - -void sendTextMessage( char number[], char messg[] ) -{ - char temp[ 27 ] = ; - for( q = 0; q < 12; q++ ) - temp[ q + 13 ] = number[ q ]; - temp[ 25 ] = ; - temp[ 26 ] = '\0'; - - GPRS.println( ); - delay( 1000 ); - GPRS.println( temp ); - delay( 1000 ); - GPRS.println( messg ); - delay( 1000 ); - GPRS.println( (char) 26 ); - delay( 1000 ); -} - -void analise(byte incoming[], int length) -{ - e = 0; - done = false; - while( e < length && !done){ - temp = char( incoming[e] ); - switch( temp ){ - case : - { - if( length > e + 3 && !callIncoming ) { - if(char( incoming[e + 1] ) == - && char( incoming[e + 2] ) == - && char( incoming[e + 3] ) == ){ - GPRS.write( ); - delay(500); - GPRS.write( ); - callIncoming = true; - done = true; - } - } - } - break; - case : - { - if(char( buffer[ e + 1]) == && length > e + 11 && callIncoming){ - for(t = 0; t < 12; t++) - lastCaller[t] = char( buffer[ e + t ]); - lastCaller[12] = '\0'; - callIncoming = false; - done = true; - } - } - break; - case : - Serial.println(lastCaller); - break; - } - e++; - } -} - - - - - - - - - - -byte decToBcd( byte b ) -{ - return ( b / 10 << 4 ) + b % 10; -} - -boolean getBit( byte addr, int pos ) -{ - byte temp = getByte( addr ); - return boolean( (temp >> pos) & B00000001 ); -} - -void setBit( byte addr, int pos, boolean newBit ) -{ - boolean oldBit = getBit( addr, pos ); - byte temp = received[ 0 ]; - if ( oldBit != newBit ) - { - if( newBit ) - temp += (B00000001 << pos); - else - temp -= (B00000001 << pos); - } - setByte( addr, temp ); -} - -byte getByte( byte addr ) -{ - byte temp; - if( getBytes( addr, 1) ) - temp = received[ 0 ]; - else temp = -1; - return temp; -} - -boolean getBytes( byte addr, int amount ) -{ - boolean wireWorked = false; - Wire.beginTransmission( DS3231_I2C_ADDRESS ); - Wire.write( addr ); - Wire.endTransmission(); - Wire.requestFrom( DS3231_I2C_ADDRESS, amount ); - if( Wire.available() ){ - received[amount]; - for( int i = 0; i < amount; i++){ - received[ i ] = Wire.read(); - } - wireWorked = true; - } - return wireWorked; -} - -void setByte( byte addr, byte newByte ) -{ - setBytes( addr, &newByte, 1); -} - -void setBytes( byte addr, byte newBytes[], int amount ) -{ - Wire.beginTransmission( DS3231_I2C_ADDRESS ); - Wire.write( addr ); - for( int i = 0; i < amount; i++ ) - Wire.write( newBytes[ i ] ); - Wire.endTransmission(); -} - -void getTime() -{ - if( getBytes( DS3231_TIME_CAL_ADDR, 7) ) - { - for(int i = 0; i < 7; i++) - time[ i ] = received[ i ]; - - time[ 0 ] = ( ( time[ 0 ] & B01110000 ) >> 4 ) * 10 + ( time[ 0 ] & B00001111 ); - time[ 1 ] = ( ( time[ 1 ] & B01110000 ) >> 4 ) * 10 + ( time[ 1 ] & B00001111 ); - time[ 2 ] = ( ( time[ 2 ] & B00110000 ) >> 4 ) * 10 + ( time[ 2 ] & B00001111 ); - time[ 4 ] = ( ( time[ 4 ] & B00110000 ) >> 4 ) * 10 + ( time[ 4 ] & B00001111 ); - time[ 5 ] = ( ( time[ 5 ] & B00010000 ) >> 4 ) * 10 + ( time[ 5 ] & B00001111 ); - time[ 6 ] = ( ( time[ 6 ] & B11110000 ) >> 4 ) * 10 + ( time[ 6 ] & B00001111 ); - } -} - -void setTime( byte newTime[ 7 ] ) -{ - for(int i = 0; i < 7; i++) - newTime[i] = decToBcd(newTime[i]); - setBytes( DS3231_TIME_CAL_ADDR, newTime, 7 ); -} - -void getRTCTemperature() -{ - - if( getBytes( DS3231_TEMPERATURE_ADDR, 2 ) ) - { - temperature = ( received[ 0 ] & B01111111 ); - temperature += ( ( received[ 1 ] >> 6 ) * 0.25 ); - } -} - -void gprsListen() -{ - if( GPRS.available() ) { - while( GPRS.available() ) { - buffer[ count++ ] = GPRS.read(); - if ( count == 64 ) - break; - } - Serial.write( buffer, count ); - analise( buffer, count ); - clearBufferArray(); - count = 0; - } - if (Serial.available()) - GPRS.write(Serial.read()); -} - -void printTime() -{ - getTime(); - Serial.print( int( time[ 3 ] ) ); - Serial.print( ); - Serial.print( int( time[ 2 ] ) ); - Serial.print( ); - Serial.print( int( time[ 1 ] ) ); - Serial.print( ); - Serial.print( int( time[ 0 ] ) ); - Serial.print( ); - Serial.print( int( time[ 4 ] ) ); - Serial.print( ); - Serial.print( int( time[ 5 ] ) ); - Serial.print( ); - Serial.print( int( time[ 6 ] ) ); - Serial.println(); -} - - - - - -void setup() -{ - - GPRS.begin( 9600 ); - delay(1000); - setPowerStateTo(1); - delay(1000); - - - Wire.begin(); - delay(1000); - - Serial.begin(9600); - delay(1000); - -} - -void loop() -{ - gprsListen(); - getTime(); -} - - - - diff --git a/app/test/processing/app/preproc/StringWithCcomment.ino b/app/test/processing/app/preproc/StringWithCcomment.ino deleted file mode 100644 index 88b94e1d0..000000000 --- a/app/test/processing/app/preproc/StringWithCcomment.ino +++ /dev/null @@ -1,13 +0,0 @@ -void setup() { - // put your setup code here, to run once: - // "comment with a double quote - /* \" other comment with double quote */ - Serial.println("Accept: */*"); - Serial.println("Accept: \" */*"); - Serial.println("Accept: \\"); // */*"); -} - -void loop() { - // put your main code here, to run repeatedly: - -} \ No newline at end of file diff --git a/app/test/processing/app/preproc/StringWithCcomment.nocomments.ino b/app/test/processing/app/preproc/StringWithCcomment.nocomments.ino deleted file mode 100644 index 9655c4ad4..000000000 --- a/app/test/processing/app/preproc/StringWithCcomment.nocomments.ino +++ /dev/null @@ -1,14 +0,0 @@ -void setup() { - - - - Serial.println("Accept: */*"); - Serial.println("Accept: \" */*"); - Serial.println("Accept: \\"); // */*"); -} - -void loop() { - - -} - diff --git a/app/test/processing/app/preproc/StringWithCcomment.stripped.ino b/app/test/processing/app/preproc/StringWithCcomment.stripped.ino deleted file mode 100644 index e5fe15583..000000000 --- a/app/test/processing/app/preproc/StringWithCcomment.stripped.ino +++ /dev/null @@ -1,13 +0,0 @@ -void setup() { - - - - Serial.println( ); - Serial.println( ); - Serial.println( ); -} - -void loop() { - - -} diff --git a/arduino-core/src/cc/arduino/packages/uploaders/SSHUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/SSHUploader.java index 5681c3589..a81e0497b 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/SSHUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/SSHUploader.java @@ -29,7 +29,6 @@ package cc.arduino.packages.uploaders; -import cc.arduino.Compiler; import cc.arduino.CompilerUtils; import cc.arduino.packages.BoardPort; import cc.arduino.packages.Uploader; diff --git a/arduino-core/src/processing/app/SketchCode.java b/arduino-core/src/processing/app/SketchCode.java index d02f9606d..af4db284c 100644 --- a/arduino-core/src/processing/app/SketchCode.java +++ b/arduino-core/src/processing/app/SketchCode.java @@ -25,7 +25,6 @@ package processing.app; import processing.app.helpers.FileUtils; import java.io.File; -import java.io.FileFilter; import java.io.IOException; import java.util.Arrays; import java.util.List; diff --git a/arduino-core/src/processing/app/debug/OldCompiler.java b/arduino-core/src/processing/app/debug/OldCompiler.java deleted file mode 100644 index 0587c0d8a..000000000 --- a/arduino-core/src/processing/app/debug/OldCompiler.java +++ /dev/null @@ -1,1529 +0,0 @@ -/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ - -/* - Part of the Processing project - http://processing.org - - Copyright (c) 2004-08 Ben Fry and Casey Reas - Copyright (c) 2001-04 Massachusetts Institute of Technology - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -package processing.app.debug; - -import cc.arduino.Constants; -import cc.arduino.LoadVIDPIDSpecificPreferences; -import cc.arduino.MyStreamPumper; -import cc.arduino.contributions.packages.ContributedPlatform; -import cc.arduino.contributions.packages.ContributedTool; -import cc.arduino.packages.BoardPort; -import cc.arduino.packages.Uploader; -import cc.arduino.packages.UploaderFactory; -import cc.arduino.packages.uploaders.MergeSketchWithBooloader; -import cc.arduino.utils.Pair; -import org.apache.commons.compress.utils.IOUtils; -import org.apache.commons.exec.CommandLine; -import org.apache.commons.exec.DefaultExecutor; -import org.apache.commons.exec.PumpStreamHandler; -import processing.app.*; -import processing.app.helpers.FileUtils; -import processing.app.helpers.PreferencesMap; -import processing.app.helpers.PreferencesMapException; -import processing.app.helpers.StringReplacer; -import processing.app.helpers.filefilters.OnlyDirs; -import processing.app.legacy.PApplet; -import processing.app.packages.LegacyUserLibrary; -import processing.app.packages.LibraryList; -import processing.app.packages.UserLibrary; -import processing.app.preproc.PdePreprocessor; -import processing.app.tools.DoubleQuotedArgumentsOnWindowsCommandLine; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static processing.app.I18n.tr; - -@Deprecated -public class OldCompiler implements MessageConsumer { - - /** - * File inside the build directory that contains the build options - * used for the last build. - */ - static final public String BUILD_PREFS_FILE = "buildprefs.txt"; - private static final int ADDITIONAL_FILES_COPY_MAX_DEPTH = 5; - - private SketchData sketch; - private PreferencesMap prefs; - private boolean verbose; - private boolean saveHex; - - private List objectFiles; - - private boolean sketchIsCompiled; - - private RunnerException exception; - - /** - * Listener interface for progress update on the GUI - */ - public interface ProgressListener { - void progress(int percent); - } - - private ProgressListener progressListener; - - static public String build(SketchData data, String buildPath, File tempBuildFolder, ProgressListener progListener, boolean verbose, boolean save) throws RunnerException, PreferencesMapException { - if (SketchData.checkSketchFile(data.getPrimaryFile()) == null) - BaseNoGui.showError(tr("Bad file selected"), - tr("Bad sketch primary file or bad sketch directory structure"), null); - - String primaryClassName = data.getName() + ".cpp"; - OldCompiler compiler = new OldCompiler(data, buildPath, primaryClassName); - File buildPrefsFile = new File(buildPath, BUILD_PREFS_FILE); - String newBuildPrefs = compiler.buildPrefsString(); - - // Do a forced cleanup (throw everything away) if the previous - // build settings do not match the previous ones - boolean prefsChanged = compiler.buildPreferencesChanged(buildPrefsFile, newBuildPrefs); - compiler.cleanup(prefsChanged, tempBuildFolder); - - if (prefsChanged) { - PrintWriter out = null; - try { - out = new PrintWriter(buildPrefsFile); - out.print(newBuildPrefs); - } catch (IOException e) { - System.err.println(tr("Could not write build preferences file")); - } finally { - IOUtils.closeQuietly(out); - } - } - - compiler.setProgressListener(progListener); - - // compile the program. errors will happen as a RunnerException - // that will bubble up to whomever called build(). - try { - if (compiler.compile(verbose, save)) { - compiler.size(compiler.getBuildPreferences()); - return primaryClassName; - } - } catch (RunnerException e) { - // when the compile fails, take this opportunity to show - // any helpful info possible before throwing the exception - compiler.adviseDuplicateLibraries(); - throw e; - } - return null; - } - - static public Uploader getUploaderByPreferences(boolean noUploadPort) { - TargetPlatform target = BaseNoGui.getTargetPlatform(); - String board = PreferencesData.get("board"); - - BoardPort boardPort = null; - if (!noUploadPort) { - boardPort = BaseNoGui.getDiscoveryManager().find(PreferencesData.get("serial.port")); - } - - return new UploaderFactory().newUploader(target.getBoards().get(board), boardPort, noUploadPort); - } - - static public boolean upload(SketchData data, Uploader uploader, String buildPath, String suggestedClassName, boolean usingProgrammer, boolean noUploadPort, List warningsAccumulator) throws Exception { - - if (uploader == null) - uploader = getUploaderByPreferences(noUploadPort); - - boolean success = false; - - if (uploader.requiresAuthorization() && !PreferencesData.has(uploader.getAuthorizationKey())) { - BaseNoGui.showError(tr("Authorization required"), - tr("No authorization data found"), null); - } - - boolean useNewWarningsAccumulator = false; - if (warningsAccumulator == null) { - warningsAccumulator = new LinkedList(); - useNewWarningsAccumulator = true; - } - - try { - success = uploader.uploadUsingPreferences(data.getFolder(), buildPath, suggestedClassName, usingProgrammer, warningsAccumulator); - } finally { - if (uploader.requiresAuthorization() && !success) { - PreferencesData.remove(uploader.getAuthorizationKey()); - } - } - - if (useNewWarningsAccumulator) { - for (String warning : warningsAccumulator) { - System.out.print(tr("Warning")); - System.out.print(": "); - System.out.println(warning); - } - } - - return success; - } - - static public File findCompiledSketch(PreferencesMap prefs) throws PreferencesMapException { - List paths = Arrays.asList( - "{build.path}/sketch/{build.project_name}.with_bootloader.hex", - "{build.path}/sketch/{build.project_name}.hex", - "{build.path}/{build.project_name}.with_bootloader.hex", - "{build.path}/{build.project_name}.hex", - "{build.path}/sketch/{build.project_name}.bin", - "{build.path}/{build.project_name}.bin" - ); - Optional sketch = paths.stream(). - map(path -> StringReplacer.replaceFromMapping(path, prefs)). - map(File::new). - filter(File::exists). - findFirst(); - return sketch.orElseThrow(() -> new IllegalStateException(tr("No compiled sketch found"))); - } - - - /** - * Create a new Compiler - * @param _sketch Sketch object to be compiled. - * @param _buildPath Where the temporary files live and will be built from. - * @param _primaryClassName the name of the combined sketch file w/ extension - */ - public OldCompiler(SketchData _sketch, String _buildPath, String _primaryClassName) - throws RunnerException { - sketch = _sketch; - prefs = createBuildPreferences(_buildPath, _primaryClassName); - - // provide access to the source tree - prefs.put("build.source.path", _sketch.getFolder().getAbsolutePath()); - - // Start with an empty progress listener - progressListener = new ProgressListener() { - @Override - public void progress(int percent) { - } - }; - } - - /** - * Check if the build preferences used on the previous build in - * buildPath match the ones given. - */ - protected boolean buildPreferencesChanged(File buildPrefsFile, String newBuildPrefs) { - // No previous build, so no match - if (!buildPrefsFile.exists()) - return true; - - String previousPrefs; - try { - previousPrefs = FileUtils.readFileToString(buildPrefsFile); - } catch (IOException e) { - System.err.println(tr("Could not read prevous build preferences file, rebuilding all")); - return true; - } - - if (!previousPrefs.equals(newBuildPrefs)) { - System.out.println(tr("Build options changed, rebuilding all")); - return true; - } else { - return false; - } - } - - /** - * Returns the build preferences of the given compiler as a string. - * Only includes build-specific preferences, to make sure unrelated - * preferences don't cause a rebuild (in particular preferences that - * change on every start, like last.ide.xxx.daterun). */ - protected String buildPrefsString() { - PreferencesMap buildPrefs = getBuildPreferences(); - String res = ""; - SortedSet treeSet = new TreeSet(buildPrefs.keySet()); - for (String k : treeSet) { - if (k.startsWith("build.") || k.startsWith("compiler.") || k.startsWith("recipes.")) - res += k + " = " + buildPrefs.get(k) + "\n"; - } - return res; - } - - protected void setProgressListener(ProgressListener _progressListener) { - progressListener = (_progressListener == null ? - new ProgressListener() { - @Override - public void progress(int percent) { - } - } : _progressListener); - } - - /** - * Cleanup temporary files used during a build/run. - */ - protected void cleanup(boolean force, File tempBuildFolder) { - // if the java runtime is holding onto any files in the build dir, we - // won't be able to delete them, so we need to force a gc here - System.gc(); - - if (force) { - // delete the entire directory and all contents - // when we know something changed and all objects - // need to be recompiled, or if the board does not - // use setting build.dependency - //Base.removeDir(tempBuildFolder); - - // note that we can't remove the builddir itself, otherwise - // the next time we start up, internal runs using Runner won't - // work because the build dir won't exist at startup, so the classloader - // will ignore the fact that that dir is in the CLASSPATH in run.sh - BaseNoGui.removeDescendants(tempBuildFolder); - } else { - // delete only stale source files, from the previously - // compiled sketch. This allows multiple windows to be - // used. Keep everything else, which might be reusable - if (tempBuildFolder.exists()) { - String files[] = tempBuildFolder.list(); - if (files != null) { - for (String file : files) { - if (file.endsWith(".c") || file.endsWith(".cpp") || file.endsWith(".s")) { - File deleteMe = new File(tempBuildFolder, file); - if (!deleteMe.delete()) { - System.err.println("Could not delete " + deleteMe); - } - } - } - } - } - } - - // Create a fresh applet folder (needed before preproc is run below) - //tempBuildFolder.mkdirs(); - } - - protected void size(PreferencesMap prefs) throws RunnerException { - String maxTextSizeString = prefs.get("upload.maximum_size"); - String maxDataSizeString = prefs.get("upload.maximum_data_size"); - if (maxTextSizeString == null) - return; - long maxTextSize = Integer.parseInt(maxTextSizeString); - long maxDataSize = -1; - if (maxDataSizeString != null) - maxDataSize = Integer.parseInt(maxDataSizeString); - Sizer sizer = new Sizer(prefs); - long[] sizes; - try { - sizes = sizer.computeSize(); - } catch (RunnerException e) { - System.err.println(I18n.format(tr("Couldn't determine program size: {0}"), - e.getMessage())); - return; - } - - long textSize = sizes[0]; - long dataSize = sizes[1]; - System.out.println(); - System.out.println(I18n - .format(tr("Sketch uses {0} bytes ({2}%%) of program storage space. Maximum is {1} bytes."), - textSize, maxTextSize, textSize * 100 / maxTextSize)); - if (dataSize >= 0) { - if (maxDataSize > 0) { - System.out - .println(I18n - .format( - tr("Global variables use {0} bytes ({2}%%) of dynamic memory, leaving {3} bytes for local variables. Maximum is {1} bytes."), - dataSize, maxDataSize, dataSize * 100 / maxDataSize, - maxDataSize - dataSize)); - } else { - System.out.println(I18n - .format(tr("Global variables use {0} bytes of dynamic memory."), dataSize)); - } - } - - if (textSize > maxTextSize) - throw new RunnerException( - tr("Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing it.")); - - if (maxDataSize > 0 && dataSize > maxDataSize) - throw new RunnerException( - tr("Not enough memory; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing your footprint.")); - - int warnDataPercentage = Integer.parseInt(prefs.get("build.warn_data_percentage")); - if (maxDataSize > 0 && dataSize > maxDataSize*warnDataPercentage/100) - System.err.println(tr("Low memory available, stability problems may occur.")); - } - - /** - * Compile sketch. - * @param _verbose - * - * @return true if successful. - * @throws RunnerException Only if there's a problem. Only then. - */ - public boolean compile(boolean _verbose, boolean _save) throws RunnerException, PreferencesMapException { - File sketchBuildFolder = new File(prefs.get("build.path"), "sketch"); - if (!sketchBuildFolder.exists() && !sketchBuildFolder.mkdirs()) { - throw new RunnerException("Unable to create folder " + sketchBuildFolder); - } - preprocess(sketchBuildFolder.getAbsolutePath()); - - verbose = _verbose || PreferencesData.getBoolean("build.verbose"); - saveHex = _save; - sketchIsCompiled = false; - - // Hook runs at Start of Compilation - runActions("hooks.prebuild", prefs); - - objectFiles = new ArrayList(); - - // 0. include paths for core + all libraries - progressListener.progress(20); - List includeFolders = new ArrayList(); - includeFolders.add(prefs.getFile("build.core.path")); - if (prefs.getFile("build.variant.path") != null) - includeFolders.add(prefs.getFile("build.variant.path")); - for (UserLibrary lib : importedLibraries) { - if (verbose) { - String legacy = ""; - if (lib instanceof LegacyUserLibrary) { - legacy = "(legacy)"; - } - - if (lib.getParsedVersion() == null) { - System.out.println(I18n.format(tr("Using library {0} in folder: {1} {2}"), lib.getName(), lib.getInstalledFolder(), legacy)); - } else { - System.out.println(I18n.format(tr("Using library {0} at version {1} in folder: {2} {3}"), lib.getName(), lib.getParsedVersion(), lib.getInstalledFolder(), legacy)); - } - } - includeFolders.add(lib.getSrcFolder()); - } - - if (verbose) { - System.out.println(); - } - - List archs = new ArrayList(); - archs.add(BaseNoGui.getTargetPlatform().getId()); - if (prefs.containsKey("architecture.override_check")) { - String[] overrides = prefs.get("architecture.override_check").split(","); - archs.addAll(Arrays.asList(overrides)); - } - for (UserLibrary lib : importedLibraries) { - if (!lib.supportsArchitecture(archs)) { - System.err.println(I18n - .format(tr("WARNING: library {0} claims to run on {1} " - + "architecture(s) and may be incompatible with your" - + " current board which runs on {2} architecture(s)."), lib - .getName(), lib.getArchitectures(), archs)); - System.err.println(); - } - } - - runActions("hooks.sketch.prebuild", prefs); - - // 1. compile the sketch (already in the buildPath) - progressListener.progress(20); - compileSketch(includeFolders, sketchBuildFolder); - sketchIsCompiled = true; - - runActions("hooks.sketch.postbuild", prefs); - - runActions("hooks.libraries.prebuild", prefs); - - // 2. compile the libraries, outputting .o files to: // - // Doesn't really use configPreferences - progressListener.progress(30); - compileLibraries(includeFolders); - - runActions("hooks.libraries.postbuild", prefs); - - runActions("hooks.core.prebuild", prefs); - - // 3. compile the core, outputting .o files to and then - // collecting them into the core.a library file. - progressListener.progress(40); - compileCore(); - - runActions("hooks.core.postbuild", prefs); - - runActions("hooks.linking.prelink", prefs); - - // 4. link it all together into the .elf file - progressListener.progress(50); - compileLink(); - - runActions("hooks.linking.postlink", prefs); - - runActions("hooks.objcopy.preobjcopy", prefs); - - // 5. run objcopy to generate output files - progressListener.progress(60); - List objcopyPatterns = new ArrayList(); - for (String key : prefs.keySet()) { - if (key.startsWith("recipe.objcopy.") && key.endsWith(".pattern")) - objcopyPatterns.add(key); - } - Collections.sort(objcopyPatterns); - for (String recipe : objcopyPatterns) { - runRecipe(recipe); - } - - runActions("hooks.objcopy.postobjcopy", prefs); - - progressListener.progress(70); - try { - mergeSketchWithBootloaderIfAppropriate(sketch.getName() + ".cpp", prefs); - } catch (IOException e) { - e.printStackTrace(); - // ignore - } - - // 7. save the hex file - if (saveHex) { - runActions("hooks.savehex.presavehex", prefs); - - progressListener.progress(80); - saveHex(); - - runActions("hooks.savehex.postsavehex", prefs); - } - - progressListener.progress(90); - - // Hook runs at End of Compilation - runActions("hooks.postbuild", prefs); - adviseDuplicateLibraries(); - - return true; - } - - private void adviseDuplicateLibraries() { - if (importedDuplicateHeaders == null) { - return; - } - for (int i=0; i < importedDuplicateHeaders.size(); i++) { - System.out.println(I18n.format(tr("Multiple libraries were found for \"{0}\""), - importedDuplicateHeaders.get(i))); - boolean first = true; - for (UserLibrary lib : importedDuplicateLibraries.get(i)) { - if (first) { - System.out.println(I18n.format(tr(" Used: {0}"), - lib.getInstalledFolder().getPath())); - first = false; - } else { - System.out.println(I18n.format(tr(" Not used: {0}"), - lib.getInstalledFolder().getPath())); - } - } - } - } - - private PreferencesMap createBuildPreferences(String _buildPath, - String _primaryClassName) - throws RunnerException { - - if (BaseNoGui.getBoardPreferences() == null) { - RunnerException re = new RunnerException( - tr("No board selected; please choose a board from the Tools > Board menu.")); - re.hideStackTrace(); - throw re; - } - - // Check if the board needs a platform from another package - TargetPlatform targetPlatform = BaseNoGui.getTargetPlatform(); - TargetPlatform corePlatform = null; - PreferencesMap boardPreferences = BaseNoGui.getBoardPreferences(); - String core = boardPreferences.get("build.core", "arduino"); - if (core.contains(":")) { - String[] split = core.split(":"); - core = split[1]; - corePlatform = BaseNoGui.getTargetPlatform(split[0], targetPlatform.getId()); - if (corePlatform == null) { - RunnerException re = new RunnerException(I18n - .format(tr("Selected board depends on '{0}' core (not installed)."), - split[0])); - re.hideStackTrace(); - throw re; - } - } - - // Merge all the global preference configuration in order of priority - PreferencesMap buildPref = new PreferencesMap(); - buildPref.putAll(PreferencesData.getMap()); - if (corePlatform != null) { - buildPref.putAll(corePlatform.getPreferences()); - } - buildPref.putAll(targetPlatform.getPreferences()); - buildPref.putAll(BaseNoGui.getBoardPreferences()); - for (String k : buildPref.keySet()) { - if (buildPref.get(k) == null) { - buildPref.put(k, ""); - } - } - - buildPref.put("build.path", _buildPath); - buildPref.put("build.project_name", _primaryClassName); - buildPref.put("build.arch", targetPlatform.getId().toUpperCase()); - - // Platform.txt should define its own compiler.path. For - // compatibility with earlier 1.5 versions, we define a (ugly, - // avr-specific) default for it, but this should be removed at some - // point. - if (!buildPref.containsKey("compiler.path")) { - System.err.println(tr("Third-party platform.txt does not define compiler.path. Please report this to the third-party hardware maintainer.")); - buildPref.put("compiler.path", BaseNoGui.getAvrBasePath()); - } - - TargetPlatform referencePlatform = null; - if (corePlatform != null) { - referencePlatform = corePlatform; - } else { - referencePlatform = targetPlatform; - } - - buildPref.put("build.platform.path", referencePlatform.getFolder().getAbsolutePath()); - - // Core folder - File coreFolder = new File(referencePlatform.getFolder(), "cores"); - coreFolder = new File(coreFolder, core); - buildPref.put("build.core", core); - buildPref.put("build.core.path", coreFolder.getAbsolutePath()); - - // System Folder - File systemFolder = referencePlatform.getFolder(); - systemFolder = new File(systemFolder, "system"); - buildPref.put("build.system.path", systemFolder.getAbsolutePath()); - - // Variant Folder - String variant = buildPref.get("build.variant"); - if (variant != null) { - TargetPlatform t; - if (!variant.contains(":")) { - t = targetPlatform; - } else { - String[] split = variant.split(":", 2); - t = BaseNoGui.getTargetPlatform(split[0], targetPlatform.getId()); - variant = split[1]; - } - File variantFolder = new File(t.getFolder(), "variants"); - variantFolder = new File(variantFolder, variant); - buildPref.put("build.variant.path", variantFolder.getAbsolutePath()); - } else { - buildPref.put("build.variant.path", ""); - } - - ContributedPlatform installedPlatform = BaseNoGui.indexer.getInstalled(referencePlatform.getContainerPackage().getId(), referencePlatform.getId()); - if (installedPlatform != null) { - List tools = installedPlatform.getResolvedTools(); - BaseNoGui.createToolPreferences(tools, false); - } - - // Build Time - GregorianCalendar cal = new GregorianCalendar(); - long current = new Date().getTime() / 1000; - long timezone = cal.get(Calendar.ZONE_OFFSET) / 1000; - long daylight = cal.get(Calendar.DST_OFFSET) / 1000; - buildPref.put("extra.time.utc", Long.toString(current)); - buildPref.put("extra.time.local", Long.toString(current + timezone + daylight)); - buildPref.put("extra.time.zone", Long.toString(timezone)); - buildPref.put("extra.time.dst", Long.toString(daylight)); - - List> unsetPrefs = buildPref.entrySet().stream() - .filter(entry -> Constants.PREF_REMOVE_PLACEHOLDER.equals(entry.getValue())) - .collect(Collectors.toList()); - - buildPref.entrySet().stream() - .filter(entry -> unsetPrefs.stream() - .filter(unsetPrefEntry -> entry.getValue().contains(unsetPrefEntry.getKey())) - .count() > 0) - .forEach(invalidEntry -> buildPref.put(invalidEntry.getKey(), "")); - - new LoadVIDPIDSpecificPreferences().load(buildPref); - - return buildPref; - } - - private List compileFiles(File outputPath, File sourcePath, - boolean recurse, List includeFolders) - throws RunnerException, PreferencesMapException { - List sSources = findFilesInFolder(sourcePath, "S", recurse); - List cSources = findFilesInFolder(sourcePath, "c", recurse); - List cppSources = findFilesInFolder(sourcePath, "cpp", recurse); - List objectPaths = new ArrayList(); - - for (File file : sSources) { - File objectFile = new File(outputPath, file.getName() + ".o"); - objectPaths.add(objectFile); - String[] cmd = getCommandCompilerByRecipe(includeFolders, file, objectFile, "recipe.S.o.pattern"); - execAsynchronously(cmd); - } - - for (File file : cSources) { - File objectFile = new File(outputPath, file.getName() + ".o"); - File dependFile = new File(outputPath, file.getName() + ".d"); - objectPaths.add(objectFile); - if (isAlreadyCompiled(file, objectFile, dependFile, prefs)) - continue; - String[] cmd = getCommandCompilerByRecipe(includeFolders, file, objectFile, "recipe.c.o.pattern"); - execAsynchronously(cmd); - } - - for (File file : cppSources) { - File objectFile = new File(outputPath, file.getName() + ".o"); - File dependFile = new File(outputPath, file.getName() + ".d"); - objectPaths.add(objectFile); - if (isAlreadyCompiled(file, objectFile, dependFile, prefs)) - continue; - String[] cmd = getCommandCompilerByRecipe(includeFolders, file, objectFile, "recipe.cpp.o.pattern"); - execAsynchronously(cmd); - } - - return objectPaths; - } - - /** - * Strip escape sequences used in makefile dependency files (.d) - * https://github.com/arduino/Arduino/issues/2255#issuecomment-57645845 - * - * @param line - * @return - */ - protected static String unescapeDepFile(String line) { - // Replaces: "\\" -> "\" - // Replaces: "\ " -> " " - // Replaces: "\#" -> "#" - line = line.replaceAll("\\\\([ #\\\\])", "$1"); - // Replaces: "$$" -> "$" - line = line.replace("$$", "$"); - return line; - } - - private boolean isAlreadyCompiled(File src, File obj, File dep, Map prefs) { - boolean ret=true; - BufferedReader reader = null; - try { - //System.out.println("\n isAlreadyCompiled: begin checks: " + obj.getPath()); - if (!obj.exists()) return false; // object file (.o) does not exist - if (!dep.exists()) return false; // dep file (.d) does not exist - long src_modified = src.lastModified(); - long obj_modified = obj.lastModified(); - if (src_modified >= obj_modified) return false; // source modified since object compiled - if (src_modified >= dep.lastModified()) return false; // src modified since dep compiled - reader = new BufferedReader(new FileReader(dep.getPath())); - String line; - boolean need_obj_parse = true; - while ((line = reader.readLine()) != null) { - if (line.endsWith("\\")) { - line = line.substring(0, line.length() - 1); - } - line = line.trim(); - line = unescapeDepFile(line); - if (line.length() == 0) continue; // ignore blank lines - if (need_obj_parse) { - // line is supposed to be the object file - make sure it really is! - if (line.endsWith(":")) { - line = line.substring(0, line.length() - 1); - String objpath = obj.getCanonicalPath(); - File linefile = new File(line); - String linepath = linefile.getCanonicalPath(); - //System.out.println(" isAlreadyCompiled: obj = " + objpath); - //System.out.println(" isAlreadyCompiled: line = " + linepath); - if (objpath.compareTo(linepath) == 0) { - need_obj_parse = false; - continue; - } else { - ret = false; // object named inside .d file is not the correct file! - break; - } - } else { - ret = false; // object file supposed to end with ':', but didn't - break; - } - } else { - // line is a prerequisite file - File prereq = new File(line); - if (!prereq.exists()) { - ret = false; // prerequisite file did not exist - break; - } - if (prereq.lastModified() >= obj_modified) { - ret = false; // prerequisite modified since object was compiled - break; - } - //System.out.println(" isAlreadyCompiled: prerequisite ok"); - } - } - } catch (Exception e) { - return false; // any error reading dep file = recompile it - } finally { - IOUtils.closeQuietly(reader); - } - if (ret && verbose) { - System.out.println(I18n.format(tr("Using previously compiled file: {0}"), obj.getPath())); - } - return ret; - } - - - /** - * Either succeeds or throws a RunnerException fit for public consumption. - */ - private void execAsynchronously(String[] command) throws RunnerException { - - // eliminate any empty array entries - List stringList = new ArrayList(); - for (String string : command) { - string = string.trim(); - if (string.length() != 0) - stringList.add(string); - } - command = stringList.toArray(new String[stringList.size()]); - if (command.length == 0) - return; - - if (verbose) { - for (String c : command) - System.out.print(c + " "); - System.out.println(); - } - - DefaultExecutor executor = new DefaultExecutor(); - executor.setStreamHandler(new PumpStreamHandler() { - - @Override - protected Thread createPump(InputStream is, OutputStream os, boolean closeWhenExhausted) { - final Thread result = new Thread(new MyStreamPumper(is, OldCompiler.this)); - result.setDaemon(true); - return result; - - } - }); - - CommandLine commandLine = new DoubleQuotedArgumentsOnWindowsCommandLine(command[0]); - for (int i = 1; i < command.length; i++) { - commandLine.addArgument(command[i], false); - } - - int result; - executor.setExitValues(null); - try { - result = executor.execute(commandLine); - } catch (IOException e) { - RunnerException re = new RunnerException(e.getMessage()); - re.hideStackTrace(); - throw re; - } - executor.setExitValues(new int[0]); - - // an error was queued up by message(), barf this back to compile(), - // which will barf it back to Editor. if you're having trouble - // discerning the imagery, consider how cows regurgitate their food - // to digest it, and the fact that they have five stomaches. - // - //System.out.println("throwing up " + exception); - if (exception != null) - throw exception; - - if (result > 1) { - // a failure in the tool (e.g. unable to locate a sub-executable) - System.err - .println(I18n.format(tr("{0} returned {1}"), command[0], result)); - } - - if (result != 0) { - RunnerException re = new RunnerException(tr("Error compiling.")); - re.hideStackTrace(); - throw re; - } - } - - /** - * Part of the MessageConsumer interface, this is called - * whenever a piece (usually a line) of error message is spewed - * out from the compiler. The errors are parsed for their contents - * and line number, which is then reported back to Editor. - */ - public void message(String s) { - int i; - - // remove the build path so people only see the filename - // can't use replaceAll() because the path may have characters in it which - // have meaning in a regular expression. - if (!verbose) { - String buildPath = prefs.get("build.path"); - while ((i = s.indexOf(buildPath + File.separator)) != -1) { - s = s.substring(0, i) + s.substring(i + (buildPath + File.separator).length()); - } - } - - // look for error line, which contains file name, line number, - // and at least the first line of the error message - String errorFormat = "(.+\\.\\w+):(\\d+)(:\\d+)*:\\s*error:\\s*(.*)\\s*"; - String[] pieces = PApplet.match(s, errorFormat); - -// if (pieces != null && exception == null) { -// exception = sketch.placeException(pieces[3], pieces[1], PApplet.parseInt(pieces[2]) - 1); -// if (exception != null) exception.hideStackTrace(); -// } - - if (pieces != null) { - String error = pieces[pieces.length - 1], msg = ""; - - if (error.trim().equals("SPI.h: No such file or directory")) { - error = tr("Please import the SPI library from the Sketch > Import Library menu."); - msg = tr("\nAs of Arduino 0019, the Ethernet library depends on the SPI library." + - "\nYou appear to be using it or another library that depends on the SPI library.\n\n"); - } - - if (error.trim().equals("'BYTE' was not declared in this scope")) { - error = tr("The 'BYTE' keyword is no longer supported."); - msg = tr("\nAs of Arduino 1.0, the 'BYTE' keyword is no longer supported." + - "\nPlease use Serial.write() instead.\n\n"); - } - - if (error.trim().equals("no matching function for call to 'Server::Server(int)'")) { - error = tr("The Server class has been renamed EthernetServer."); - msg = tr("\nAs of Arduino 1.0, the Server class in the Ethernet library " + - "has been renamed to EthernetServer.\n\n"); - } - - if (error.trim().equals("no matching function for call to 'Client::Client(byte [4], int)'")) { - error = tr("The Client class has been renamed EthernetClient."); - msg = tr("\nAs of Arduino 1.0, the Client class in the Ethernet library " + - "has been renamed to EthernetClient.\n\n"); - } - - if (error.trim().equals("'Udp' was not declared in this scope")) { - error = tr("The Udp class has been renamed EthernetUdp."); - msg = tr("\nAs of Arduino 1.0, the Udp class in the Ethernet library " + - "has been renamed to EthernetUdp.\n\n"); - } - - if (error.trim().equals("'class TwoWire' has no member named 'send'")) { - error = tr("Wire.send() has been renamed Wire.write()."); - msg = tr("\nAs of Arduino 1.0, the Wire.send() function was renamed " + - "to Wire.write() for consistency with other libraries.\n\n"); - } - - if (error.trim().equals("'class TwoWire' has no member named 'receive'")) { - error = tr("Wire.receive() has been renamed Wire.read()."); - msg = tr("\nAs of Arduino 1.0, the Wire.receive() function was renamed " + - "to Wire.read() for consistency with other libraries.\n\n"); - } - - if (error.trim().equals("'Mouse' was not declared in this scope")) { - error = tr("'Mouse' only supported on the Arduino Leonardo"); - //msg = _("\nThe 'Mouse' class is only supported on the Arduino Leonardo.\n\n"); - } - - if (error.trim().equals("'Keyboard' was not declared in this scope")) { - error = tr("'Keyboard' only supported on the Arduino Leonardo"); - //msg = _("\nThe 'Keyboard' class is only supported on the Arduino Leonardo.\n\n"); - } - - RunnerException e = null; - if (!sketchIsCompiled) { - // Place errors when compiling the sketch, but never while compiling libraries - // or the core. The user's sketch might contain the same filename! - e = placeException(error, pieces[1], PApplet.parseInt(pieces[2]) - 1); - } - - // replace full file path with the name of the sketch tab (unless we're - // in verbose mode, in which case don't modify the compiler output) - if (e != null && !verbose) { - SketchCode code = sketch.getCode(e.getCodeIndex()); - String fileName = (code.isExtension("ino") || code.isExtension("pde")) ? code.getPrettyName() : code.getFileName(); - int lineNum = e.getCodeLine() + 1; - s = fileName + ":" + lineNum + ": error: " + error + msg; - } - - if (e != null) { - if (exception == null || exception.getMessage().equals(e.getMessage())) { - exception = e; - exception.hideStackTrace(); - } - } - } - - if (s.contains("undefined reference to `SPIClass::begin()'") && - s.contains("libraries/Robot_Control")) { - String error = tr("Please import the SPI library from the Sketch > Import Library menu."); - exception = new RunnerException(error); - } - - if (s.contains("undefined reference to `Wire'") && - s.contains("libraries/Robot_Control")) { - String error = tr("Please import the Wire library from the Sketch > Import Library menu."); - exception = new RunnerException(error); - } - - System.err.print(s); - } - - private String[] getCommandCompilerByRecipe(List includeFolders, File sourceFile, File objectFile, String recipe) throws PreferencesMapException, RunnerException { - String includes = prepareIncludes(includeFolders); - PreferencesMap dict = new PreferencesMap(prefs); - dict.put("ide_version", "" + BaseNoGui.REVISION); - dict.put("includes", includes); - dict.put("source_file", sourceFile.getAbsolutePath()); - dict.put("object_file", objectFile.getAbsolutePath()); - - setupWarningFlags(dict); - - String cmd = prefs.getOrExcept(recipe); - try { - return StringReplacer.formatAndSplit(cmd, dict, true); - } catch (Exception e) { - throw new RunnerException(e); - } - } - - private void setupWarningFlags(PreferencesMap dict) { - if (dict.containsKey("compiler.warning_level")) { - String key = "compiler.warning_flags." + dict.get("compiler.warning_level"); - dict.put("compiler.warning_flags", dict.get(key)); - } else { - dict.put("compiler.warning_flags", dict.get("compiler.warning_flags.none")); - } - - if (dict.get("compiler.warning_flags") == null) { - dict.remove("compiler.warning_flags"); - } - } - - ///////////////////////////////////////////////////////////////////////////// - - private void createFolder(File folder) throws RunnerException { - if (folder.isDirectory()) - return; - if (!folder.mkdir()) - throw new RunnerException("Couldn't create: " + folder); - } - - static public List findFilesInFolder(File folder, String extension, - boolean recurse) { - List files = new ArrayList(); - - if (FileUtils.isSCCSOrHiddenFile(folder)) { - return files; - } - - File[] listFiles = folder.listFiles(); - if (listFiles == null) { - return files; - } - - for (File file : listFiles) { - if (FileUtils.isSCCSOrHiddenFile(file)) { - continue; // skip hidden files - } - - if (file.getName().endsWith("." + extension)) - files.add(file); - - if (recurse && file.isDirectory()) { - files.addAll(findFilesInFolder(file, extension, true)); - } - } - - return files; - } - - // 1. compile the sketch (already in the buildPath) - void compileSketch(List includeFolders, File buildPath) throws RunnerException, PreferencesMapException { - objectFiles.addAll(compileFiles(buildPath, buildPath, false, includeFolders)); - } - - // 2. compile the libraries, outputting .o files to: - // // - void compileLibraries(List includeFolders) throws RunnerException, PreferencesMapException { - for (UserLibrary lib : importedLibraries) { - compileLibrary(lib, includeFolders); - } - } - - private void compileLibrary(UserLibrary lib, List includeFolders) - throws RunnerException, PreferencesMapException { - File libFolder = lib.getSrcFolder(); - File librariesFolder = new File(prefs.getFile("build.path"), "libraries"); - if (!librariesFolder.exists() && !librariesFolder.mkdirs()) { - throw new RunnerException("Unable to create folder " + librariesFolder); - } - - File libBuildFolder = new File(librariesFolder, lib.getName()); - - if (lib.useRecursion()) { - // libBuildFolder == {build.path}/LibName - // libFolder == {lib.path}/src - recursiveCompileFilesInFolder(libBuildFolder, libFolder, includeFolders); - - } else { - // libFolder == {lib.path}/ - // utilityFolder == {lib.path}/utility - // libBuildFolder == {build.path}/LibName - // utilityBuildFolder == {build.path}/LibName/utility - File utilityFolder = new File(libFolder, "utility"); - File utilityBuildFolder = new File(libBuildFolder, "utility"); - - includeFolders.add(utilityFolder); - compileFilesInFolder(libBuildFolder, libFolder, includeFolders); - compileFilesInFolder(utilityBuildFolder, utilityFolder, includeFolders); - - // other libraries should not see this library's utility/ folder - includeFolders.remove(utilityFolder); - } - } - - private void recursiveCompileFilesInFolder(File srcBuildFolder, File srcFolder, List includeFolders) throws RunnerException, PreferencesMapException { - compileFilesInFolder(srcBuildFolder, srcFolder, includeFolders); - for (File subFolder : srcFolder.listFiles(new OnlyDirs())) { - File subBuildFolder = new File(srcBuildFolder, subFolder.getName()); - recursiveCompileFilesInFolder(subBuildFolder, subFolder, includeFolders); - } - } - - private void compileFilesInFolder(File buildFolder, File srcFolder, List includeFolders) throws RunnerException, PreferencesMapException { - createFolder(buildFolder); - List objects = compileFiles(buildFolder, srcFolder, false, includeFolders); - objectFiles.addAll(objects); - } - - // 3. compile the core, outputting .o files to and then - // collecting them into the core.a library file. - // Also compiles the variant (if it supplies actual source files), - // which are included in the link directly (not through core.a) - void compileCore() - throws RunnerException, PreferencesMapException { - - File coreFolder = prefs.getFile("build.core.path"); - File variantFolder = prefs.getFile("build.variant.path"); - File buildFolder = new File(prefs.getFile("build.path"), "core"); - if (!buildFolder.exists() && !buildFolder.mkdirs()) { - throw new RunnerException("Unable to create folder " + buildFolder); - } - - List includeFolders = new ArrayList(); - includeFolders.add(coreFolder); // include core path only - if (variantFolder != null) - includeFolders.add(variantFolder); - - - if (variantFolder != null) - objectFiles.addAll(compileFiles(buildFolder, variantFolder, true, - includeFolders)); - - File afile = new File(buildFolder, "core.a"); - - List coreObjectFiles = compileFiles(buildFolder, coreFolder, true, - includeFolders); - - // See if the .a file is already uptodate - if (afile.exists()) { - boolean changed = false; - for (File file : coreObjectFiles) { - if (file.lastModified() > afile.lastModified()) { - changed = true; - break; - } - } - - // If none of the object files is newer than the .a file, don't - // bother rebuilding the .a file. There is a small corner case - // here: If a source file was removed, but no other source file - // was modified, this will not rebuild core.a even when it - // should. It's hard to fix and not a realistic case, so it - // shouldn't be a problem. - if (!changed) { - if (verbose) - System.out.println(I18n.format(tr("Using previously compiled file: {0}"), afile.getPath())); - return; - } - } - - // Delete the .a file, to prevent any previous code from lingering - afile.delete(); - - try { - for (File file : coreObjectFiles) { - - PreferencesMap dict = new PreferencesMap(prefs); - dict.put("ide_version", "" + BaseNoGui.REVISION); - dict.put("archive_file", afile.getName()); - dict.put("object_file", file.getAbsolutePath()); - dict.put("build.path", buildFolder.getAbsolutePath()); - - String[] cmdArray; - String cmd = prefs.getOrExcept("recipe.ar.pattern"); - try { - cmdArray = StringReplacer.formatAndSplit(cmd, dict, true); - } catch (Exception e) { - throw new RunnerException(e); - } - execAsynchronously(cmdArray); - } - } catch (RunnerException e) { - afile.delete(); - throw e; - } - } - - // 4. link it all together into the .elf file - void compileLink() - throws RunnerException, PreferencesMapException { - - // TODO: Make the --relax thing in configuration files. - - // For atmega2560, need --relax linker option to link larger - // programs correctly. - String optRelax = ""; - if (prefs.get("build.mcu").equals("atmega2560")) - optRelax = ",--relax"; - - String objectFileList = ""; - for (File file : objectFiles) - objectFileList += " \"" + file.getAbsolutePath() + '"'; - objectFileList = objectFileList.substring(1); - - PreferencesMap dict = new PreferencesMap(prefs); - String flags = dict.get("compiler.c.elf.flags") + optRelax; - dict.put("compiler.c.elf.flags", flags); - dict.put("archive_file", new File("core", "core.a").getPath()); - dict.put("object_files", objectFileList); - dict.put("ide_version", "" + BaseNoGui.REVISION); - - setupWarningFlags(dict); - - String[] cmdArray; - String cmd = prefs.getOrExcept("recipe.c.combine.pattern"); - try { - cmdArray = StringReplacer.formatAndSplit(cmd, dict, true); - } catch (Exception e) { - throw new RunnerException(e); - } - execAsynchronously(cmdArray); - } - - void runActions(String recipeClass, PreferencesMap prefs) throws RunnerException, PreferencesMapException { - List patterns = new ArrayList(); - for (String key : prefs.keySet()) { - if (key.startsWith("recipe."+recipeClass) && key.endsWith(".pattern")) - patterns.add(key); - } - Collections.sort(patterns); - for (String recipe : patterns) { - runRecipe(recipe); - } - } - - void runRecipe(String recipe) throws RunnerException, PreferencesMapException { - PreferencesMap dict = new PreferencesMap(prefs); - dict.put("ide_version", "" + BaseNoGui.REVISION); - dict.put("sketch_path", sketch.getFolder().getAbsolutePath()); - - String[] cmdArray; - String cmd = prefs.getOrExcept(recipe); - try { - cmdArray = StringReplacer.formatAndSplit(cmd, dict, true); - } catch (Exception e) { - throw new RunnerException(e); - } - execAsynchronously(cmdArray); - } - - private void mergeSketchWithBootloaderIfAppropriate(String className, PreferencesMap prefs) throws IOException { - if (!prefs.containsKey("bootloader.noblink") && !prefs.containsKey("bootloader.file")) { - return; - } - - String buildPath = prefs.get("build.path"); - - Path sketch; - Path sketchInSubfolder = Paths.get(buildPath, "sketch", className + ".hex"); - Path sketchInBuildPath = Paths.get(buildPath, className + ".hex"); - if (Files.exists(sketchInSubfolder)) { - sketch = sketchInSubfolder; - } else if (Files.exists(sketchInBuildPath)) { - sketch = sketchInBuildPath; - } else { - return; - } - - String bootloaderNoBlink = prefs.get("bootloader.noblink"); - if (bootloaderNoBlink == null) { - bootloaderNoBlink = prefs.get("bootloader.file"); - } - - Path bootloader = Paths.get(prefs.get("runtime.platform.path"), "bootloaders", bootloaderNoBlink); - if (!Files.exists(bootloader)) { - System.err.println(I18n.format(tr("Bootloader file specified but missing: {0}"), bootloader)); - return; - } - - Path mergedSketch; - if ("sketch".equals(sketch.getParent().getFileName().toString())) { - mergedSketch = Paths.get(buildPath, "sketch", className + ".with_bootloader.hex"); - } else { - mergedSketch = Paths.get(buildPath, className + ".with_bootloader.hex"); - } - - Files.copy(sketch, mergedSketch, StandardCopyOption.REPLACE_EXISTING); - - new MergeSketchWithBooloader().merge(mergedSketch.toFile(), bootloader.toFile()); - } - - //7. Save the .hex file - void saveHex() throws RunnerException { - List compiledSketches = new ArrayList<>(prefs.subTree("recipe.output.tmp_file", 1).values()); - List copyOfCompiledSketches = new ArrayList<>(prefs.subTree("recipe.output.save_file", 1).values()); - - if (isExportCompiledSketchSupported(compiledSketches, copyOfCompiledSketches)) { - System.err.println(tr("Warning: This core does not support exporting sketches. Please consider upgrading it or contacting its author")); - return; - } - - PreferencesMap dict = new PreferencesMap(prefs); - dict.put("ide_version", "" + BaseNoGui.REVISION); - - if (!compiledSketches.isEmpty()) { - for (int i = 0; i < compiledSketches.size(); i++) { - saveHex(compiledSketches.get(i), copyOfCompiledSketches.get(i), prefs); - } - } else { - try { - saveHex(prefs.getOrExcept("recipe.output.tmp_file"), prefs.getOrExcept("recipe.output.save_file"), prefs); - } catch (PreferencesMapException e) { - throw new RunnerException(e); - } - } - } - - private boolean isExportCompiledSketchSupported(List compiledSketches, List copyOfCompiledSketches) { - return (compiledSketches.isEmpty() || copyOfCompiledSketches.isEmpty() || copyOfCompiledSketches.size() < compiledSketches.size()) && (!prefs.containsKey("recipe.output.tmp_file") || !prefs.containsKey("recipe.output.save_file")); - } - - private void saveHex(String compiledSketch, String copyOfCompiledSketch, PreferencesMap dict) throws RunnerException { - try { - compiledSketch = StringReplacer.replaceFromMapping(compiledSketch, dict); - copyOfCompiledSketch = StringReplacer.replaceFromMapping(copyOfCompiledSketch, dict); - - Path compiledSketchPath; - Path compiledSketchPathInSubfolder = Paths.get(prefs.get("build.path"), "sketch", compiledSketch); - Path compiledSketchPathInBuildPath = Paths.get(prefs.get("build.path"), compiledSketch); - if (Files.exists(compiledSketchPathInSubfolder)) { - compiledSketchPath = compiledSketchPathInSubfolder; - } else { - compiledSketchPath = compiledSketchPathInBuildPath; - } - - Path copyOfCompiledSketchFilePath = Paths.get(this.sketch.getFolder().getAbsolutePath(), copyOfCompiledSketch); - - Files.copy(compiledSketchPath, copyOfCompiledSketchFilePath, StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - throw new RunnerException(e); - } - } - - private static String prepareIncludes(List includeFolders) { - String res = ""; - for (File p : includeFolders) - res += " \"-I" + p.getAbsolutePath() + '"'; - - // Remove first space - return res.substring(1); - } - - public PreferencesMap getBuildPreferences() { - return prefs; - } - - /** - * Build all the code for this sketch. - * - * In an advanced program, the returned class name could be different, - * which is why the className is set based on the return value. - * A compilation error will burp up a RunnerException. - * - * Setting purty to 'true' will cause exception line numbers to be incorrect. - * Unless you know the code compiles, you should first run the preprocessor - * with purty set to false to make sure there are no errors, then once - * successful, re-export with purty set to true. - * - * @param buildPath Location to copy all the .java files - * @return null if compilation failed, main class name if not - */ - public void preprocess(String buildPath) throws RunnerException { - preprocess(buildPath, new PdePreprocessor()); - } - - public void preprocess(String buildPath, PdePreprocessor preprocessor) throws RunnerException { - - // 1. concatenate all .pde files to the 'main' pde - // store line number for starting point of each code bit - - StringBuffer bigCode = new StringBuffer(); - int bigCount = 0; - for (SketchCode sc : sketch.getCodes()) { - if (sc.isExtension(SketchData.SKETCH_EXTENSIONS)) { - sc.setPreprocOffset(bigCount); - // These #line directives help the compiler report errors with - // correct the filename and line number (issue 281 & 907) - bigCode.append("#line 1 \"" + sc.getFileName() + "\"\n"); - bigCode.append(sc.getProgram()); - bigCode.append('\n'); - bigCount += sc.getLineCount(); - } - } - - // Note that the headerOffset isn't applied until compile and run, because - // it only applies to the code after it's been written to the .java file. - int headerOffset = 0; - try { - headerOffset = preprocessor.writePrefix(bigCode.toString()); - } catch (FileNotFoundException fnfe) { - fnfe.printStackTrace(); - String msg = tr("Build folder disappeared or could not be written"); - throw new RunnerException(msg); - } - - // 2. run preproc on that code using the sugg class name - // to create a single .java file and write to buildpath - - FileOutputStream outputStream = null; - try { - // Output file - File streamFile = new File(buildPath, sketch.getName() + ".cpp"); - outputStream = new FileOutputStream(streamFile); - preprocessor.write(outputStream); - } catch (FileNotFoundException fnfe) { - fnfe.printStackTrace(); - String msg = tr("Build folder disappeared or could not be written"); - throw new RunnerException(msg); - } catch (RunnerException pe) { - // RunnerExceptions are caught here and re-thrown, so that they don't - // get lost in the more general "Exception" handler below. - throw pe; - - } catch (Exception ex) { - // TODO better method for handling this? - System.err.println(I18n.format(tr("Uncaught exception type: {0}"), ex.getClass())); - ex.printStackTrace(); - throw new RunnerException(ex.toString()); - } finally { - IOUtils.closeQuietly(outputStream); - } - - // grab the imports from the code just preproc'd - - importedLibraries = new LibraryList(); - importedDuplicateHeaders = new ArrayList(); - importedDuplicateLibraries = new ArrayList(); - for (String item : preprocessor.getExtraImports()) { - LibraryList list = BaseNoGui.importToLibraryTable.get(item); - if (list != null) { - UserLibrary lib = list.peekFirst(); - if (lib != null && !importedLibraries.contains(lib)) { - importedLibraries.add(lib); - if (list.size() > 1) { - importedDuplicateHeaders.add(item); - importedDuplicateLibraries.add(list); - } - } - } - } - - // 3. then loop over the code[] and save each .java file - for (SketchCode sc : sketch.getCodes()) { - if (sc.isExtension(SketchData.OTHER_ALLOWED_EXTENSIONS)) { - // no pre-processing services necessary for java files - // just write the the contents of 'program' to a .java file - // into the build directory. uses byte stream and reader/writer - // shtuff so that unicode bunk is properly handled - String filename = sc.getFileName(); //code[i].name + ".java"; - try { - BaseNoGui.saveFile(sc.getProgram(), new File(buildPath, filename)); - } catch (IOException e) { - e.printStackTrace(); - throw new RunnerException(I18n.format(tr("Problem moving {0} to the build folder"), filename)); - } - - } else if (sc.isExtension("ino") || sc.isExtension("pde")) { - // The compiler and runner will need this to have a proper offset - sc.addPreprocOffset(headerOffset); - } - } - - copyAdditionalFilesToBuildFolderSavingOriginalFolderStructure(sketch, buildPath); - } - - private void copyAdditionalFilesToBuildFolderSavingOriginalFolderStructure(SketchData sketch, String buildPath) throws RunnerException { - Path sketchPath = Paths.get(sketch.getFolder().getAbsolutePath()); - Stream otherFilesStream; - try { - otherFilesStream = Files.find(sketchPath, ADDITIONAL_FILES_COPY_MAX_DEPTH, (path, attribs) -> !attribs.isDirectory() && isPathInASubfolder(sketchPath, path) && FileUtils.hasExtension(path.toFile(), SketchData.OTHER_ALLOWED_EXTENSIONS)); - } catch (IOException e) { - throw new RunnerException(e); - } - otherFilesStream.map((path) -> new Pair<>(path, Paths.get(buildPath, sketchPath.relativize(path).toString()))) - .forEach((pair) -> { - try { - Files.createDirectories(pair.value.getParent()); - Files.copy(pair.key, pair.value, StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(I18n.format(tr("Problem moving {0} to the build folder"), sketchPath.relativize(pair.key).toString())); - } - }); - } - - private boolean isPathInASubfolder(Path sketchPath, Path path) { - return sketchPath.relativize(path).getNameCount() > 1; - } - - /** - * List of library folders. - */ - private LibraryList importedLibraries; - private List importedDuplicateHeaders; - private List importedDuplicateLibraries; - - /** - * Map an error from a set of processed .java files back to its location - * in the actual sketch. - * @param message The error message. - * @param dotJavaFilename The .java file where the exception was found. - * @param dotJavaLine Line number of the .java file for the exception (0-indexed!) - * @return A RunnerException to be sent to the editor, or null if it wasn't - * possible to place the exception to the sketch code. - */ - public RunnerException placeException(String message, - String dotJavaFilename, - int dotJavaLine) { - // Placing errors is simple, because we inserted #line directives - // into the preprocessed source. The compiler gives us correct - // the file name and line number. :-) - for (SketchCode code : sketch.getCodes()) { - if (dotJavaFilename.equals(code.getFileName())) { - return new RunnerException(message, sketch.indexOfCode(code), dotJavaLine); - } - } - return null; - } - -} diff --git a/arduino-core/src/processing/app/preproc/.cvsignore b/arduino-core/src/processing/app/preproc/.cvsignore deleted file mode 100644 index b010c249c..000000000 --- a/arduino-core/src/processing/app/preproc/.cvsignore +++ /dev/null @@ -1,9 +0,0 @@ -*Lexer.java -*Recognizer.java -*TokenTypes.java -*TokenTypes.txt -*TreeParser.java -*TreeParserTokenTypes.java -*TreeParserTokenTypes.txt -expanded*.g - diff --git a/arduino-core/src/processing/app/preproc/PdePreprocessor.java b/arduino-core/src/processing/app/preproc/PdePreprocessor.java deleted file mode 100644 index e3ac5dd61..000000000 --- a/arduino-core/src/processing/app/preproc/PdePreprocessor.java +++ /dev/null @@ -1,435 +0,0 @@ -/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ - -/* - PdePreprocessor - wrapper for default ANTLR-generated parser - Part of the Wiring project - http://wiring.org.co - - Copyright (c) 2004-05 Hernando Barragan - - Processing version Copyright (c) 2004-05 Ben Fry and Casey Reas - Copyright (c) 2001-04 Massachusetts Institute of Technology - - ANTLR-generated parser and several supporting classes written - by Dan Mosedale via funding from the Interaction Institute IVREA. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -package processing.app.preproc; - -import static processing.app.I18n.tr; -import processing.app.*; -import processing.app.legacy.PApplet; - -import java.io.*; -import java.util.*; -import java.util.regex.*; - - -/** - * Class that orchestrates preprocessing p5 syntax into straight Java. - */ -public class PdePreprocessor { - - private static final String IMPORT_REGEX = "^\\s*#include\\s*[<\"](\\S+)[\">]"; - - // stores number of built user-defined function prototypes - public int prototypeCount = 0; - - // stores number of included library headers written - // we always write one header: Arduino.h - public int headerCount = 1; - - // the prototypes that are generated by the preprocessor - List prototypes; - - // these ones have the .* at the end, since a class name might be at the end - // instead of .* which would make trouble other classes using this can lop - // off the . and anything after it to produce a package name consistently. - List programImports; - - // imports just from the code folder, treated differently - // than the others, since the imports are auto-generated. - List codeFolderImports; - - String program; - - - /** - * Setup a new preprocessor. - */ - public PdePreprocessor() { - } - - /** - * Writes out the head of the c++ code generated for a sketch. - * Called from processing.app.Sketch. - * @param program the concatenated code from all tabs containing pde-files - */ - public int writePrefix(String program) - throws FileNotFoundException { - // if the program ends with no CR or LF an OutOfMemoryError will happen. - // not gonna track down the bug now, so here's a hack for it: - // http://dev.processing.org/bugs/show_bug.cgi?id=5 - program += "\n"; - - // if the program ends with an unterminated multi-line comment, - // an OutOfMemoryError or NullPointerException will happen. - // again, not gonna bother tracking this down, but here's a hack. - // http://dev.processing.org/bugs/show_bug.cgi?id=16 - program = scrubComments(program); - // If there are errors, an exception is thrown and this fxn exits. - - if (PreferencesData.getBoolean("preproc.substitute_unicode")) { - program = substituteUnicode(program); - } - - //String importRegexp = "(?:^|\\s|;)(import\\s+)(\\S+)(\\s*;)"; - programImports = new ArrayList(); - - String[][] pieces = PApplet.matchAll(program, IMPORT_REGEX); - - if (pieces != null) - for (int i = 0; i < pieces.length; i++) - programImports.add(pieces[i][1]); // the package name - - codeFolderImports = new ArrayList(); -// if (codeFolderPackages != null) { -// for (String item : codeFolderPackages) { -// codeFolderImports.add(item + ".*"); -// } -// } - - prototypes = prototypes(program); - - // store # of prototypes so that line number reporting can be adjusted - prototypeCount = prototypes.size(); - - // do this after the program gets re-combobulated - this.program = program; - - return headerCount + prototypeCount; - } - - public static List findIncludes(String code){ - - String[][] pieces = PApplet.matchAll(code, IMPORT_REGEX); - - ArrayList programImports = new ArrayList(); - - if (pieces != null) - for (int i = 0; i < pieces.length; i++) - programImports.add(pieces[i][1]); // the package name - - return programImports; - } - - - static String substituteUnicode(String program) { - // check for non-ascii chars (these will be/must be in unicode format) - char p[] = program.toCharArray(); - int unicodeCount = 0; - for (int i = 0; i < p.length; i++) { - if (p[i] > 127) unicodeCount++; - } - // if non-ascii chars are in there, convert to unicode escapes - if (unicodeCount != 0) { - // add unicodeCount * 5.. replacing each unicode char - // with six digit uXXXX sequence (xxxx is in hex) - // (except for nbsp chars which will be a replaced with a space) - int index = 0; - char p2[] = new char[p.length + unicodeCount*5]; - for (int i = 0; i < p.length; i++) { - if (p[i] < 128) { - p2[index++] = p[i]; - - } else if (p[i] == 160) { // unicode for non-breaking space - p2[index++] = ' '; - - } else { - int c = p[i]; - p2[index++] = '\\'; - p2[index++] = 'u'; - char str[] = Integer.toHexString(c).toCharArray(); - // add leading zeros, so that the length is 4 - //for (int i = 0; i < 4 - str.length; i++) p2[index++] = '0'; - for (int m = 0; m < 4 - str.length; m++) p2[index++] = '0'; - System.arraycopy(str, 0, p2, index, str.length); - index += str.length; - } - } - program = new String(p2, 0, index); - } - return program; - } - - /** - * preprocesses a pde file and writes out a cpp file into the specified - * OutputStream - * - * @param output - * @throws Exception - */ - public void write(OutputStream output) throws Exception { - PrintStream stream = new PrintStream(output); - writeProgram(stream, program, prototypes); - writeFooter(stream); - } - - // Write the pde program to the cpp file - protected void writeProgram(PrintStream out, String program, List prototypes) { - int prototypeInsertionPoint = firstStatement(program); - - out.print(program.substring(0, prototypeInsertionPoint)); - out.print("#include \"Arduino.h\"\n"); - - // print user defined prototypes - for (int i = 0; i < prototypes.size(); i++) { - out.print(prototypes.get(i) + "\n"); - } - String[] lines = program.substring(0, prototypeInsertionPoint).split("\n", -1); - out.println("#line " + (lines.length - 1)); - out.print(program.substring(prototypeInsertionPoint)); - } - - - /** - * Write any necessary closing text. - * - * @param out PrintStream to write it to. - */ - protected void writeFooter(PrintStream out) throws java.lang.Exception {} - - - public List getExtraImports() { - return programImports; - } - - - - - - /** - * Returns the index of the first character that's not whitespace, a comment - * or a pre-processor directive. - */ - public int firstStatement(String in) { - // whitespace - String p = "\\s+"; - - // multi-line and single-line comment - //p += "|" + "(//\\s*?$)|(/\\*\\s*?\\*/)"; - p += "|(/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)|(//.*?$)"; - - // pre-processor directive - p += "|(#(?:\\\\\\n|.)*)"; - Pattern pattern = Pattern.compile(p, Pattern.MULTILINE); - - Matcher matcher = pattern.matcher(in); - int i = 0; - while (matcher.find()) { - if (matcher.start()!=i) - break; - i = matcher.end(); - } - - return i; - } - - /** - * Strips comments, pre-processor directives, single- and double-quoted - * strings from a string. - * @param in the String to strip - * @return the stripped String - */ - public String strip(String in) { - // XXX: doesn't properly handle special single-quoted characters - // single-quoted character - String p = "('.')"; - - p += "|('\\\\\"')"; - - // double-quoted string - p += "|(\"(?:[^\"\\\\]|\\\\.)*\")"; - - // single and multi-line comment - //p += "|" + "(//\\s*?$)|(/\\*\\s*?\\*/)"; - p += "|(//.*?$)|(/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)"; - - // pre-processor directive - p += "|" + "(^\\s*#.*?$)"; - - StringBuilder sb = new StringBuilder(in); - Pattern pattern = Pattern.compile(p, Pattern.MULTILINE | Pattern.DOTALL); - Matcher matcher = pattern.matcher(sb); - while (matcher.find()) { - String replacement = composeReplacementString(new StringBuilder(sb.subSequence(matcher.start(), matcher.end()))); - sb.replace(matcher.start(), matcher.end(), replacement); - } - return sb.toString(); - } - - private String composeReplacementString(StringBuilder sb) { - for (int i = 0; i < sb.length(); i++) { - if (sb.charAt(i) != '\n') { - sb.setCharAt(i, ' '); - } - } - return sb.toString(); - } - - /** - * Removes the contents of all top-level curly brace pairs {}. - * @param in the String to collapse - * @return the collapsed String - */ - private String collapseBraces(String in) { - StringBuffer buffer = new StringBuffer(); - int nesting = 0; - int start = 0; - - // XXX: need to keep newlines inside braces so we can determine the line - // number of a prototype - for (int i = 0; i < in.length(); i++) { - if (in.charAt(i) == '{') { - if (nesting == 0) { - buffer.append(in.substring(start, i + 1)); // include the '{' - } - nesting++; - } - if (in.charAt(i) == '}') { - nesting--; - if (nesting == 0) { - start = i; // include the '}' - } - } - } - - buffer.append(in.substring(start)); - - return buffer.toString(); - } - - public ArrayList prototypes(String in) { - in = collapseBraces(strip(in)); - - // XXX: doesn't handle ... varargs - // XXX: doesn't handle function pointers - Pattern prototypePattern = Pattern.compile("[\\w\\[\\]\\*]+\\s+[&\\[\\]\\*\\w\\s]+\\([&,\\[\\]\\*\\w\\s]*\\)(?=\\s*;)"); - Pattern functionPattern = Pattern.compile("[\\w\\[\\]\\*]+\\s+[&\\[\\]\\*\\w\\s]+\\([&,\\[\\]\\*\\w\\s]*\\)(?=\\s*\\{)"); - - // Find already declared prototypes - ArrayList prototypeMatches = new ArrayList(); - Matcher prototypeMatcher = prototypePattern.matcher(in); - while (prototypeMatcher.find()) - prototypeMatches.add(prototypeMatcher.group(0) + ";"); - - // Find all functions and generate prototypes for them - ArrayList functionMatches = new ArrayList(); - Matcher functionMatcher = functionPattern.matcher(in); - while (functionMatcher.find()) - functionMatches.add(functionMatcher.group(0) + ";"); - - // Remove generated prototypes that exactly match ones found in the source file - for (int functionIndex=functionMatches.size() - 1; functionIndex >= 0; functionIndex--) { - for (int prototypeIndex=0; prototypeIndex < prototypeMatches.size(); prototypeIndex++) { - if ((functionMatches.get(functionIndex)).equals(prototypeMatches.get(prototypeIndex))) { - functionMatches.remove(functionIndex); - break; - } - } - } - - return functionMatches; - } - - private boolean isStartOrEndOfString(char p[], int index) { - if (p[index] != '\"') { - return false; - } - - if (index == 0) { - return true; - } - - if (p[index - 1] == '\\') { - return false; - } - - if (index - 2 >= 0 && p[index - 2] == '\\') { - return true; - } - - return true; - } - - /** - * Replace all commented portions of a given String as spaces. - * Utility function used here and in the preprocessor. - */ - public String scrubComments(String what) { - char p[] = what.toCharArray(); - - int index = 0; - boolean insideString = false; - while (index < p.length) { - if (isStartOrEndOfString(p, index)) { - insideString = !insideString; - } - // for any double slash comments, ignore until the end of the line - if (!insideString && (p[index] == '/') && - (index < p.length - 1) && - (p[index+1] == '/')) { - p[index++] = ' '; - p[index++] = ' '; - while ((index < p.length) && - (p[index] != '\n')) { - p[index++] = ' '; - } - - // check to see if this is the start of a new multiline comment. - // if it is, then make sure it's actually terminated somewhere. - } else if (!insideString && (p[index] == '/') && - (index < p.length - 1) && - (p[index+1] == '*')) { - p[index++] = ' '; - p[index++] = ' '; - boolean endOfRainbow = false; - while (index < p.length - 1) { - if ((p[index] == '*') && (p[index+1] == '/')) { - p[index++] = ' '; - p[index++] = ' '; - endOfRainbow = true; - break; - - } else { - // continue blanking this area - if (p[index] != '\n') { - p[index] = ' '; - } - index++; - } - } - if (!endOfRainbow) { - throw new RuntimeException(tr("Missing the */ from the end of a " + - "/* comment */")); - } - } else { // any old character, move along - index++; - } - } - return new String(p); - } -}