arduino stuffs
Diffstat (limited to 'libraries/Firmata/utility/SerialFirmata.cpp')
| -rw-r--r-- | libraries/Firmata/utility/SerialFirmata.cpp | 342 |
1 files changed, 0 insertions, 342 deletions
diff --git a/libraries/Firmata/utility/SerialFirmata.cpp b/libraries/Firmata/utility/SerialFirmata.cpp deleted file mode 100644 index 8b703e1..0000000 --- a/libraries/Firmata/utility/SerialFirmata.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/* - SerialFirmata.cpp - Copyright (C) 2016 Jeff Hoefs. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - See file LICENSE.txt for further informations on licensing terms. - - This version of SerialFirmata.cpp differs from the ConfigurableFirmata - version in the following ways: - - - handlePinMode calls Firmata::setPinMode - - Last updated October 16th, 2016 -*/ - -#include "SerialFirmata.h" - -SerialFirmata::SerialFirmata() -{ -#if defined(SoftwareSerial_h) - swSerial0 = NULL; - swSerial1 = NULL; - swSerial2 = NULL; - swSerial3 = NULL; -#endif - - serialIndex = -1; -} - -boolean SerialFirmata::handlePinMode(byte pin, int mode) -{ - // used for both HW and SW serial - if (mode == PIN_MODE_SERIAL) { - Firmata.setPinMode(pin, PIN_MODE_SERIAL); - return true; - } - return false; -} - -void SerialFirmata::handleCapability(byte pin) -{ - if (IS_PIN_SERIAL(pin)) { - Firmata.write(PIN_MODE_SERIAL); - Firmata.write(getSerialPinType(pin)); - } -} - -boolean SerialFirmata::handleSysex(byte command, byte argc, byte *argv) -{ - if (command == SERIAL_MESSAGE) { - - Stream *serialPort; - byte mode = argv[0] & SERIAL_MODE_MASK; - byte portId = argv[0] & SERIAL_PORT_ID_MASK; - - switch (mode) { - case SERIAL_CONFIG: - { - long baud = (long)argv[1] | ((long)argv[2] << 7) | ((long)argv[3] << 14); - serial_pins pins; - - if (portId < 8) { - serialPort = getPortFromId(portId); - if (serialPort != NULL) { - pins = getSerialPinNumbers(portId); - if (pins.rx != 0 && pins.tx != 0) { - Firmata.setPinMode(pins.rx, PIN_MODE_SERIAL); - Firmata.setPinMode(pins.tx, PIN_MODE_SERIAL); - // Fixes an issue where some serial devices would not work properly with Arduino Due - // because all Arduino pins are set to OUTPUT by default in StandardFirmata. - pinMode(pins.rx, INPUT); - } - ((HardwareSerial*)serialPort)->begin(baud); - } - } else { -#if defined(SoftwareSerial_h) - byte swTxPin, swRxPin; - if (argc > 4) { - swRxPin = argv[4]; - swTxPin = argv[5]; - } else { - // RX and TX pins must be specified when using SW serial - Firmata.sendString("Specify serial RX and TX pins"); - return false; - } - switch (portId) { - case SW_SERIAL0: - if (swSerial0 == NULL) { - swSerial0 = new SoftwareSerial(swRxPin, swTxPin); - } - break; - case SW_SERIAL1: - if (swSerial1 == NULL) { - swSerial1 = new SoftwareSerial(swRxPin, swTxPin); - } - break; - case SW_SERIAL2: - if (swSerial2 == NULL) { - swSerial2 = new SoftwareSerial(swRxPin, swTxPin); - } - break; - case SW_SERIAL3: - if (swSerial3 == NULL) { - swSerial3 = new SoftwareSerial(swRxPin, swTxPin); - } - break; - } - serialPort = getPortFromId(portId); - if (serialPort != NULL) { - Firmata.setPinMode(swRxPin, PIN_MODE_SERIAL); - Firmata.setPinMode(swTxPin, PIN_MODE_SERIAL); - ((SoftwareSerial*)serialPort)->begin(baud); - } -#endif - } - break; // SERIAL_CONFIG - } - case SERIAL_WRITE: - { - byte data; - serialPort = getPortFromId(portId); - if (serialPort == NULL) { - break; - } - for (byte i = 1; i < argc; i += 2) { - data = argv[i] + (argv[i + 1] << 7); - serialPort->write(data); - } - break; // SERIAL_WRITE - } - case SERIAL_READ: - if (argv[1] == SERIAL_READ_CONTINUOUSLY) { - if (serialIndex + 1 >= MAX_SERIAL_PORTS) { - break; - } - - if (argc > 2) { - // maximum number of bytes to read from buffer per iteration of loop() - serialBytesToRead[portId] = (int)argv[2] | ((int)argv[3] << 7); - } else { - // read all available bytes per iteration of loop() - serialBytesToRead[portId] = 0; - } - serialIndex++; - reportSerial[serialIndex] = portId; - } else if (argv[1] == SERIAL_STOP_READING) { - byte serialIndexToSkip = 0; - if (serialIndex <= 0) { - serialIndex = -1; - } else { - for (byte i = 0; i < serialIndex + 1; i++) { - if (reportSerial[i] == portId) { - serialIndexToSkip = i; - break; - } - } - // shift elements over to fill space left by removed element - for (byte i = serialIndexToSkip; i < serialIndex + 1; i++) { - if (i < MAX_SERIAL_PORTS) { - reportSerial[i] = reportSerial[i + 1]; - } - } - serialIndex--; - } - } - break; // SERIAL_READ - case SERIAL_CLOSE: - serialPort = getPortFromId(portId); - if (serialPort != NULL) { - if (portId < 8) { - ((HardwareSerial*)serialPort)->end(); - } else { -#if defined(SoftwareSerial_h) - ((SoftwareSerial*)serialPort)->end(); - if (serialPort != NULL) { - free(serialPort); - serialPort = NULL; - } -#endif - } - } - break; // SERIAL_CLOSE - case SERIAL_FLUSH: - serialPort = getPortFromId(portId); - if (serialPort != NULL) { - getPortFromId(portId)->flush(); - } - break; // SERIAL_FLUSH -#if defined(SoftwareSerial_h) - case SERIAL_LISTEN: - // can only call listen() on software serial ports - if (portId > 7) { - serialPort = getPortFromId(portId); - if (serialPort != NULL) { - ((SoftwareSerial*)serialPort)->listen(); - } - } - break; // SERIAL_LISTEN -#endif - } // end switch - return true; - } - return false; -} - -void SerialFirmata::update() -{ - checkSerial(); -} - -void SerialFirmata::reset() -{ -#if defined(SoftwareSerial_h) - Stream *serialPort; - // free memory allocated for SoftwareSerial ports - for (byte i = SW_SERIAL0; i < SW_SERIAL3 + 1; i++) { - serialPort = getPortFromId(i); - if (serialPort != NULL) { - free(serialPort); - serialPort = NULL; - } - } -#endif - - serialIndex = -1; - for (byte i = 0; i < SERIAL_READ_ARR_LEN; i++) { - serialBytesToRead[i] = 0; - } -} - -// get a pointer to the serial port associated with the specified port id -Stream* SerialFirmata::getPortFromId(byte portId) -{ - switch (portId) { - case HW_SERIAL0: - // block use of Serial (typically pins 0 and 1) until ability to reclaim Serial is implemented - //return &Serial; - return NULL; -#if defined(PIN_SERIAL1_RX) - case HW_SERIAL1: - return &Serial1; -#endif -#if defined(PIN_SERIAL2_RX) - case HW_SERIAL2: - return &Serial2; -#endif -#if defined(PIN_SERIAL3_RX) - case HW_SERIAL3: - return &Serial3; -#endif -#if defined(PIN_SERIAL4_RX) - case HW_SERIAL4: - return &Serial4; -#endif -#if defined(PIN_SERIAL5_RX) - case HW_SERIAL5: - return &Serial5; -#endif -#if defined(PIN_SERIAL6_RX) - case HW_SERIAL6: - return &Serial6; -#endif -#if defined(SoftwareSerial_h) - case SW_SERIAL0: - if (swSerial0 != NULL) { - // instances of SoftwareSerial are already pointers so simply return the instance - return swSerial0; - } - break; - case SW_SERIAL1: - if (swSerial1 != NULL) { - return swSerial1; - } - break; - case SW_SERIAL2: - if (swSerial2 != NULL) { - return swSerial2; - } - break; - case SW_SERIAL3: - if (swSerial3 != NULL) { - return swSerial3; - } - break; -#endif - } - return NULL; -} - -// Check serial ports that have READ_CONTINUOUS mode set and relay any data -// for each port to the device attached to that port. -void SerialFirmata::checkSerial() -{ - byte portId, serialData; - int bytesToRead = 0; - int numBytesToRead = 0; - Stream* serialPort; - - if (serialIndex > -1) { - - // loop through all reporting (READ_CONTINUOUS) serial ports - for (byte i = 0; i < serialIndex + 1; i++) { - portId = reportSerial[i]; - bytesToRead = serialBytesToRead[portId]; - serialPort = getPortFromId(portId); - if (serialPort == NULL) { - continue; - } -#if defined(SoftwareSerial_h) - // only the SoftwareSerial port that is "listening" can read data - if (portId > 7 && !((SoftwareSerial*)serialPort)->isListening()) { - continue; - } -#endif - if (serialPort->available() > 0) { - Firmata.write(START_SYSEX); - Firmata.write(SERIAL_MESSAGE); - Firmata.write(SERIAL_REPLY | portId); - - if (bytesToRead == 0 || (serialPort->available() <= bytesToRead)) { - numBytesToRead = serialPort->available(); - } else { - numBytesToRead = bytesToRead; - } - - // relay serial data to the serial device - while (numBytesToRead > 0) { - serialData = serialPort->read(); - Firmata.write(serialData & 0x7F); - Firmata.write((serialData >> 7) & 0x7F); - numBytesToRead--; - } - Firmata.write(END_SYSEX); - } - - } - } -} |