[realtek-ambz] Migrate to ArduinoCore-API
This commit is contained in:
@@ -17,168 +17,41 @@
|
|||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef Arduino_h
|
#pragma once
|
||||||
#define Arduino_h
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#ifdef __cplusplus
|
||||||
#include <stdlib.h>
|
#include "WCharacterFixup.h"
|
||||||
#include <string.h>
|
#endif
|
||||||
#include <math.h>
|
#define PinMode PinModeArduino // this conflicts with SDK enum
|
||||||
|
#include "api/ArduinoAPI.h"
|
||||||
#include "binary.h"
|
#undef PinMode
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
|
||||||
#include "wiring_constants.h"
|
|
||||||
|
|
||||||
extern uint32_t SystemCoreClock;
|
extern uint32_t SystemCoreClock;
|
||||||
|
|
||||||
#define clockCyclesPerMicrosecond() ( SystemCoreClock / 1000000L )
|
#define clockCyclesPerMicrosecond() ( SystemCoreClock / 1000000L )
|
||||||
#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (SystemCoreClock / 1000L) )
|
#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (SystemCoreClock / 1000L) )
|
||||||
#define microsecondsToClockCycles(a) ( (a) * (SystemCoreClock / 1000000L) )
|
#define microsecondsToClockCycles(a) ( (a) * (SystemCoreClock / 1000000L) )
|
||||||
|
|
||||||
/*
|
#include "WVariant.h"
|
||||||
* \brief Set CPU CLK 166MHz
|
|
||||||
* clk : 0 - 166666666 Hz, 1 - 83333333 Hz, 2 - 41666666 Hz, 3 - 20833333 Hz, 4 - 10416666 Hz, 5 - 4000000 Hz
|
|
||||||
* baud: 38400,...
|
|
||||||
*/
|
|
||||||
extern void Init_CPU_CLK_UART(int clkn, int baud);
|
|
||||||
extern void sys_info(void);
|
|
||||||
/* HalGetChipId:
|
|
||||||
* 0xff - RTL8711AM, 0xfe - RTL8195AM, 0xfd - RTL8711AF,
|
|
||||||
* 0xfc - RTL8710AF, 0xfb - RTL8711AN, 0xfa - RTL8710AM */
|
|
||||||
extern unsigned char HalGetChipId(void);
|
|
||||||
extern unsigned int HalGetCpuClk(void);
|
|
||||||
|
|
||||||
extern void wait_us(int us);
|
|
||||||
#define delay_us wait_us
|
|
||||||
|
|
||||||
extern void yield(void);
|
|
||||||
|
|
||||||
#ifndef printf
|
|
||||||
#define printf rtl_printf
|
|
||||||
#endif
|
|
||||||
#ifndef sprintf
|
|
||||||
#define sprintf rtl_sprintf
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
extern void *pvPortMalloc( size_t xWantedSize );
|
|
||||||
extern void vPortFree( void *pv );
|
|
||||||
extern void *pvPortReAlloc( void *pv, size_t xWantedSize );
|
|
||||||
extern size_t xPortGetFreeHeapSize( void );
|
|
||||||
extern size_t xPortGetMinimumEverFreeHeapSize( void );
|
|
||||||
|
|
||||||
extern void *tcm_heap_malloc(int size);
|
|
||||||
extern void *tcm_heap_calloc(int size);
|
|
||||||
extern void tcm_heap_free(void * mem);
|
|
||||||
extern void tcm_heap_dump(void);
|
|
||||||
extern int tcm_heap_freeSpace(void);
|
|
||||||
|
|
||||||
#ifndef malloc
|
|
||||||
#define malloc pvPortMalloc
|
|
||||||
#endif
|
|
||||||
#ifndef free
|
|
||||||
#define free vPortFree
|
|
||||||
#endif
|
|
||||||
#ifndef realloc
|
|
||||||
#define realloc pvPortReAlloc
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* sketch */
|
|
||||||
extern void setup( void );
|
|
||||||
extern void loop( void );
|
|
||||||
|
|
||||||
#define NOT_INITIAL (1UL<<0)
|
|
||||||
#define PIO_GPIO (1UL<<1)
|
|
||||||
#define PIO_PWM (1UL<<2)
|
|
||||||
#define PIO_I2C (1UL<<3)
|
|
||||||
#define PIO_ADC (1UL<<4)
|
|
||||||
#define PIO_DAC (1UL<<5)
|
|
||||||
#define PIO_GPIO_IRQ (1UL<<6)
|
|
||||||
|
|
||||||
#define PWM_MODE_ENABLED 1
|
|
||||||
#define PWM_MODE_DISABLED 0
|
|
||||||
|
|
||||||
/* Types used for the tables below */
|
|
||||||
typedef struct _PinDescription
|
|
||||||
{
|
|
||||||
|
|
||||||
// HW PinNames
|
|
||||||
uint32_t pinname;
|
|
||||||
|
|
||||||
// Current Pin Type
|
|
||||||
uint32_t ulPinType;
|
|
||||||
|
|
||||||
// Supported Pin Function
|
|
||||||
uint32_t ulPinAttribute;
|
|
||||||
|
|
||||||
// Current Pin Mode
|
|
||||||
uint32_t ulPinMode;
|
|
||||||
|
|
||||||
} PinDescription ;
|
|
||||||
|
|
||||||
/* Pins table to be instanciated into variant.cpp */
|
|
||||||
extern PinDescription g_APinDescription[];
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
#endif
|
||||||
#include "WCharacter.h"
|
|
||||||
#include "WString.h"
|
|
||||||
#include "WMath.h"
|
|
||||||
#include "HardwareSerial.h"
|
|
||||||
#include "wiring_pulse.h"
|
|
||||||
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
// Include board variant
|
// Include board variant
|
||||||
#include "variant.h"
|
#include "variant.h"
|
||||||
|
|
||||||
#include "wiring.h"
|
#define interrupts() vPortClearInterruptMask(0)
|
||||||
#include "wiring_digital.h"
|
#define noInterrupts() ulPortSetInterruptMask()
|
||||||
#include "wiring_analog.h"
|
|
||||||
#include "WInterrupts.h"
|
|
||||||
#include "wiring_os.h"
|
|
||||||
#include "wiring_watchdog.h"
|
|
||||||
#include "wiring_shift.h"
|
|
||||||
|
|
||||||
extern void * malloc(size_t size);
|
/*
|
||||||
extern void * zalloc(size_t size);
|
* \brief SAM3 products have only one reference for ADC
|
||||||
extern void * calloc(size_t count, size_t size);
|
*/
|
||||||
extern void free(void *pv);
|
typedef enum _eAnalogReference
|
||||||
extern void * realloc(void *pv, size_t size);
|
{
|
||||||
extern void hexdump(void * ptr, int cnt);
|
AR_DEFAULT,
|
||||||
extern void debug_on(void);
|
} eAnalogReference ;
|
||||||
|
|
||||||
extern unsigned int GetFlashSize(void); // default 1048576 bytes (1 Mbytes)
|
|
||||||
/* FlashID: manufacturer ID : memory type : memory density
|
|
||||||
0xC22015 - MXIC MX25L1606E, F11AMIM13 (RTL8711AM) module,
|
|
||||||
0xC22014 - MXIC MX25L8006E, RTL00 (RTL8710AF) module */
|
|
||||||
extern unsigned int GetFlashId(void);
|
|
||||||
|
|
||||||
// C++ functions
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
// WMath prototypes
|
|
||||||
extern long random( long ) ;
|
|
||||||
extern long random( long, long ) ;
|
|
||||||
extern void randomSeed( uint32_t dwSeed ) ;
|
|
||||||
extern long map( long, long, long, long, long ) ;
|
|
||||||
|
|
||||||
void tone(uint32_t ulPin, unsigned int frequency, unsigned long duration = 0);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// custom defined
|
|
||||||
//
|
|
||||||
|
|
||||||
//#include "Thread.h"
|
|
||||||
//#include "DAC1.h"
|
|
||||||
|
|
||||||
|
|
||||||
#endif // Arduino_h
|
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
Client.h - Base class that provides Client
|
|
||||||
Copyright (c) 2011 Adrian McEwen. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef client_h
|
|
||||||
#define client_h
|
|
||||||
#include "Print.h"
|
|
||||||
#include "Stream.h"
|
|
||||||
#include "IPAddress.h"
|
|
||||||
|
|
||||||
class Client : public Stream {
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual int connect(IPAddress ip, uint16_t port) =0;
|
|
||||||
virtual int connect(const char *host, uint16_t port) =0;
|
|
||||||
virtual size_t write(uint8_t) =0;
|
|
||||||
virtual size_t write(const uint8_t *buf, size_t size) =0;
|
|
||||||
virtual int available() = 0;
|
|
||||||
virtual int read() = 0;
|
|
||||||
virtual int read(uint8_t *buf, size_t size) = 0;
|
|
||||||
virtual int peek() = 0;
|
|
||||||
virtual void flush() = 0;
|
|
||||||
virtual void stop() = 0;
|
|
||||||
virtual uint8_t connected() = 0;
|
|
||||||
virtual operator bool() = 0;
|
|
||||||
protected:
|
|
||||||
uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); };
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
#include <Print.h>
|
#include <api/Print.h>
|
||||||
|
|
||||||
class CountingStream : public Print
|
class CountingStream : public Print
|
||||||
{
|
{
|
||||||
virtual size_t write(uint8_t) { return 1; };
|
virtual size_t write(uint8_t) { return 1; };
|
||||||
virtual size_t write(const uint8_t *buffer, size_t size) { return size; };
|
virtual size_t write(const uint8_t *buffer, size_t size) { return size; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HardwareSerial_h
|
|
||||||
#define HardwareSerial_h
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#include "Stream.h"
|
|
||||||
|
|
||||||
class HardwareSerial : public Stream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual void begin(unsigned long);
|
|
||||||
virtual void end();
|
|
||||||
virtual int available(void) = 0;
|
|
||||||
virtual int peek(void) = 0;
|
|
||||||
virtual int read(void) = 0;
|
|
||||||
virtual void flush(void) = 0;
|
|
||||||
virtual size_t write(uint8_t) = 0;
|
|
||||||
using Print::write; // pull in write(str) and write(buf, size) from Print
|
|
||||||
virtual operator bool() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern void serialEventRun(void) __attribute__((weak));
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
/*
|
|
||||||
IPAddress.cpp - Base class that provides IPAddress
|
|
||||||
Copyright (c) 2011 Adrian McEwen. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <IPAddress.h>
|
|
||||||
#include <Print.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <WString.h>
|
|
||||||
|
|
||||||
//NeoJou
|
|
||||||
extern "C" {
|
|
||||||
#define _LONG_CALL_ __attribute__ ((long_call))
|
|
||||||
extern _LONG_CALL_ uint32_t DiagPrintf(const char *fmt, ...);
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress::IPAddress()
|
|
||||||
{
|
|
||||||
_address.dword = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet)
|
|
||||||
{
|
|
||||||
_address.bytes[0] = first_octet;
|
|
||||||
_address.bytes[1] = second_octet;
|
|
||||||
_address.bytes[2] = third_octet;
|
|
||||||
_address.bytes[3] = fourth_octet;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress::IPAddress(uint32_t address)
|
|
||||||
{
|
|
||||||
_address.dword = address;
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress::IPAddress(const uint8_t *address)
|
|
||||||
{
|
|
||||||
memcpy(_address.bytes, address, sizeof(_address.bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress& IPAddress::operator=(const uint8_t *address)
|
|
||||||
{
|
|
||||||
memcpy(_address.bytes, address, sizeof(_address.bytes));
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress& IPAddress::operator=(uint32_t address)
|
|
||||||
{
|
|
||||||
_address.dword = address;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IPAddress::operator==(const uint8_t* addr) const
|
|
||||||
{
|
|
||||||
return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* IPAddress::get_address(void)
|
|
||||||
{
|
|
||||||
String ipAddrStr(_address.bytes[0]);
|
|
||||||
ipAddrStr.concat('.');
|
|
||||||
ipAddrStr.concat(_address.bytes[1]);
|
|
||||||
ipAddrStr.concat('.');
|
|
||||||
ipAddrStr.concat(_address.bytes[2]);
|
|
||||||
ipAddrStr.concat('.');
|
|
||||||
ipAddrStr.concat(_address.bytes[3]);
|
|
||||||
ipAddrStr.toCharArray(_ipAddress, sizeof(_ipAddress));
|
|
||||||
|
|
||||||
return _ipAddress;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t IPAddress::printTo(Print& p) const
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
for (int i =0; i < 3; i++)
|
|
||||||
{
|
|
||||||
n += p.print(_address.bytes[i], DEC);
|
|
||||||
n += p.print('.');
|
|
||||||
}
|
|
||||||
n += p.print(_address.bytes[3], DEC);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
/*
|
|
||||||
IPAddress.h - Base class that provides IPAddress
|
|
||||||
Copyright (c) 2011 Adrian McEwen. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef IPAddress_h
|
|
||||||
#define IPAddress_h
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <Printable.h>
|
|
||||||
|
|
||||||
// A class to make it easier to handle and pass around IP addresses
|
|
||||||
|
|
||||||
class IPAddress : public Printable {
|
|
||||||
private:
|
|
||||||
char _ipAddress[17];
|
|
||||||
union {
|
|
||||||
uint8_t bytes[4]; // IPv4 address
|
|
||||||
uint32_t dword;
|
|
||||||
} _address;
|
|
||||||
|
|
||||||
// Access the raw byte array containing the address. Because this returns a pointer
|
|
||||||
// to the internal structure rather than a copy of the address this function should only
|
|
||||||
// be used when you know that the usage of the returned uint8_t* will be transient and not
|
|
||||||
// stored.
|
|
||||||
uint8_t* raw_address() { return _address.bytes; };
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors
|
|
||||||
IPAddress();
|
|
||||||
IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet);
|
|
||||||
IPAddress(uint32_t address);
|
|
||||||
IPAddress(const uint8_t *address);
|
|
||||||
|
|
||||||
// Overloaded cast operator to allow IPAddress objects to be used where a pointer
|
|
||||||
// to a four-byte uint8_t array is expected
|
|
||||||
operator uint32_t() const { return _address.dword; };
|
|
||||||
bool operator==(const IPAddress& addr) const { return _address.dword == addr._address.dword; };
|
|
||||||
bool operator==(const uint8_t* addr) const;
|
|
||||||
|
|
||||||
// Overloaded index operator to allow getting and setting individual octets of the address
|
|
||||||
uint8_t operator[](int index) const { return _address.bytes[index]; };
|
|
||||||
uint8_t& operator[](int index) { return _address.bytes[index]; };
|
|
||||||
|
|
||||||
// Overloaded copy operators to allow initialisation of IPAddress objects from other types
|
|
||||||
IPAddress& operator=(const uint8_t *address);
|
|
||||||
IPAddress& operator=(uint32_t address);
|
|
||||||
|
|
||||||
//NeoJou
|
|
||||||
char * get_address(void);
|
|
||||||
|
|
||||||
virtual size_t printTo(Print& p) const;
|
|
||||||
|
|
||||||
friend class EthernetClass;
|
|
||||||
friend class UDP;
|
|
||||||
friend class Client;
|
|
||||||
friend class Server;
|
|
||||||
friend class DhcpClass;
|
|
||||||
friend class DNSClient;
|
|
||||||
};
|
|
||||||
|
|
||||||
const IPAddress INADDR_NONE(0,0,0,0);
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -18,9 +18,6 @@
|
|||||||
|
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "LOGUARTClass.h"
|
#include "LOGUARTClass.h"
|
||||||
|
|
||||||
#define LOG_UART_MODIFIABLE_BAUD_RATE 1
|
#define LOG_UART_MODIFIABLE_BAUD_RATE 1
|
||||||
|
|||||||
@@ -16,11 +16,12 @@
|
|||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LOGUART_CLASS_
|
#pragma once
|
||||||
#define _LOGUART_CLASS_
|
|
||||||
|
|
||||||
#include "HardwareSerial.h"
|
#include "api/HardwareSerial.h"
|
||||||
#include "RingBuffer.h"
|
#include "api/RingBuffer.h"
|
||||||
|
|
||||||
|
using namespace arduino;
|
||||||
|
|
||||||
class LOGUARTClass : public HardwareSerial
|
class LOGUARTClass : public HardwareSerial
|
||||||
{
|
{
|
||||||
@@ -28,6 +29,9 @@ class LOGUARTClass : public HardwareSerial
|
|||||||
LOGUARTClass(int dwIrq, RingBuffer* pRx_buffer );
|
LOGUARTClass(int dwIrq, RingBuffer* pRx_buffer );
|
||||||
|
|
||||||
void begin(const uint32_t dwBaudRate);
|
void begin(const uint32_t dwBaudRate);
|
||||||
|
inline void begin(const uint32_t dwBaudRate, uint16_t config) {
|
||||||
|
begin(dwBaudRate); // TODO implement this properly
|
||||||
|
}
|
||||||
void end(void);
|
void end(void);
|
||||||
int available(void);
|
int available(void);
|
||||||
int peek(void);
|
int peek(void);
|
||||||
@@ -47,7 +51,3 @@ class LOGUARTClass : public HardwareSerial
|
|||||||
private:
|
private:
|
||||||
friend bool Serial_available();
|
friend bool Serial_available();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern LOGUARTClass Serial;
|
|
||||||
|
|
||||||
#endif // _LOGUART_CLASS_
|
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
#include "PowerManagement.h"
|
#include "PowerManagement.h"
|
||||||
|
#include "Arduino.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
#include "freertos_pmu.h"
|
#include "freertos_pmu.h"
|
||||||
#include "sys_api.h"
|
#include "sys_api.h"
|
||||||
#include "sleep_ex_api.h"
|
#include "sleep_ex_api.h"
|
||||||
|
|
||||||
#include "wiring_digital.h"
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,257 +0,0 @@
|
|||||||
/*
|
|
||||||
Print.cpp - Base class that provides print() and println()
|
|
||||||
Copyright (c) 2008 David A. Mellis. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Modified 23 November 2006 by David A. Mellis
|
|
||||||
Modified 03 August 2015 by Chuck Todd
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include "Arduino.h"
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
// Public Methods //////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/* default implementation: may be overridden */
|
|
||||||
size_t Print::write(const uint8_t *buffer, size_t size)
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
while (size--) {
|
|
||||||
if (write(*buffer++)) n++;
|
|
||||||
else break;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(const __FlashStringHelper *ifsh)
|
|
||||||
{
|
|
||||||
return print(reinterpret_cast<const char *>(ifsh));
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(const String &s)
|
|
||||||
{
|
|
||||||
return write(s.c_str(), s.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(const char str[])
|
|
||||||
{
|
|
||||||
return write(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(char c)
|
|
||||||
{
|
|
||||||
return write(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(unsigned char b, int base)
|
|
||||||
{
|
|
||||||
return print((unsigned long) b, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(int n, int base)
|
|
||||||
{
|
|
||||||
return print((long) n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(unsigned int n, int base)
|
|
||||||
{
|
|
||||||
return print((unsigned long) n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(long n, int base)
|
|
||||||
{
|
|
||||||
if (base == 0) {
|
|
||||||
return write(n);
|
|
||||||
} else if (base == 10) {
|
|
||||||
if (n < 0) {
|
|
||||||
int t = print('-');
|
|
||||||
n = -n;
|
|
||||||
return printNumber(n, 10) + t;
|
|
||||||
}
|
|
||||||
return printNumber(n, 10);
|
|
||||||
} else {
|
|
||||||
return printNumber(n, base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(unsigned long n, int base)
|
|
||||||
{
|
|
||||||
if (base == 0) return write(n);
|
|
||||||
else return printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(double n, int digits)
|
|
||||||
{
|
|
||||||
return printFloat(n, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(const __FlashStringHelper *ifsh)
|
|
||||||
{
|
|
||||||
size_t n = print(ifsh);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(const Printable& x)
|
|
||||||
{
|
|
||||||
return x.printTo(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(void)
|
|
||||||
{
|
|
||||||
return write("\r\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(const String &s)
|
|
||||||
{
|
|
||||||
size_t n = print(s);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(const char c[])
|
|
||||||
{
|
|
||||||
size_t n = print(c);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(char c)
|
|
||||||
{
|
|
||||||
size_t n = print(c);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(unsigned char b, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(b, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(int num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(unsigned int num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(long num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(unsigned long num, int base)
|
|
||||||
{
|
|
||||||
size_t n = print(num, base);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(double num, int digits)
|
|
||||||
{
|
|
||||||
size_t n = print(num, digits);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println(const Printable& x)
|
|
||||||
{
|
|
||||||
size_t n = print(x);
|
|
||||||
n += println();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods /////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
size_t Print::printNumber(unsigned long n, uint8_t base) {
|
|
||||||
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
|
|
||||||
char *str = &buf[sizeof(buf) - 1];
|
|
||||||
|
|
||||||
*str = '\0';
|
|
||||||
|
|
||||||
// prevent crash if called with base == 1
|
|
||||||
if (base < 2) base = 10;
|
|
||||||
|
|
||||||
do {
|
|
||||||
unsigned long m = n;
|
|
||||||
n /= base;
|
|
||||||
char c = m - base * n;
|
|
||||||
*--str = c < 10 ? c + '0' : c + 'A' - 10;
|
|
||||||
} while(n);
|
|
||||||
|
|
||||||
return write(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::printFloat(double number, uint8_t digits)
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
|
|
||||||
if (isnan(number)) return print("nan");
|
|
||||||
if (isinf(number)) return print("inf");
|
|
||||||
if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
|
|
||||||
if (number <-4294967040.0) return print ("ovf"); // constant determined empirically
|
|
||||||
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0)
|
|
||||||
{
|
|
||||||
n += print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
for (uint8_t i=0; i<digits; ++i)
|
|
||||||
rounding /= 10.0;
|
|
||||||
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
n += print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits > 0) {
|
|
||||||
n += print(".");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits-- > 0)
|
|
||||||
{
|
|
||||||
remainder *= 10.0;
|
|
||||||
int toPrint = int(remainder);
|
|
||||||
n += print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
/*
|
|
||||||
Print.h - Base class that provides print() and println()
|
|
||||||
Copyright (c) 2008 David A. Mellis. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Print_h
|
|
||||||
#define Print_h
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stdio.h> // for size_t
|
|
||||||
|
|
||||||
#include "WString.h"
|
|
||||||
#include "Printable.h"
|
|
||||||
|
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
|
|
||||||
class Print
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
int write_error;
|
|
||||||
size_t printNumber(unsigned long, uint8_t);
|
|
||||||
size_t printFloat(double, uint8_t);
|
|
||||||
protected:
|
|
||||||
void setWriteError(int err = 1) { write_error = err; }
|
|
||||||
public:
|
|
||||||
Print() : write_error(0) {}
|
|
||||||
|
|
||||||
int getWriteError() { return write_error; }
|
|
||||||
void clearWriteError() { setWriteError(0); }
|
|
||||||
|
|
||||||
virtual size_t write(uint8_t) = 0;
|
|
||||||
size_t write(const char *str) {
|
|
||||||
if (str == NULL) return 0;
|
|
||||||
return write((const uint8_t *)str, strlen(str));
|
|
||||||
}
|
|
||||||
virtual size_t write(const uint8_t *buffer, size_t size);
|
|
||||||
size_t write(const char *buffer, size_t size) {
|
|
||||||
return write((const uint8_t *)buffer, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t print(const __FlashStringHelper *);
|
|
||||||
size_t print(const String &);
|
|
||||||
size_t print(const char[]);
|
|
||||||
size_t print(char);
|
|
||||||
size_t print(unsigned char, int = DEC);
|
|
||||||
size_t print(int, int = DEC);
|
|
||||||
size_t print(unsigned int, int = DEC);
|
|
||||||
size_t print(long, int = DEC);
|
|
||||||
size_t print(unsigned long, int = DEC);
|
|
||||||
size_t print(double, int = 2);
|
|
||||||
size_t print(const Printable&);
|
|
||||||
|
|
||||||
size_t println(const __FlashStringHelper *);
|
|
||||||
size_t println(const String &s);
|
|
||||||
size_t println(const char[]);
|
|
||||||
size_t println(char);
|
|
||||||
size_t println(unsigned char, int = DEC);
|
|
||||||
size_t println(int, int = DEC);
|
|
||||||
size_t println(unsigned int, int = DEC);
|
|
||||||
size_t println(long, int = DEC);
|
|
||||||
size_t println(unsigned long, int = DEC);
|
|
||||||
size_t println(double, int = 2);
|
|
||||||
size_t println(const Printable&);
|
|
||||||
size_t println(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
Printable.h - Interface class that allows printing of complex types
|
|
||||||
Copyright (c) 2011 Adrian McEwen. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Printable_h
|
|
||||||
#define Printable_h
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
class Print;
|
|
||||||
|
|
||||||
/** The Printable class provides a way for new classes to allow themselves to be printed.
|
|
||||||
By deriving from Printable and implementing the printTo method, it will then be possible
|
|
||||||
for users to print out instances of this class by passing them into the usual
|
|
||||||
Print::print and Print::println methods.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Printable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual size_t printTo(Print& p) const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "RingBuffer.h"
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
RingBuffer::RingBuffer( void )
|
|
||||||
{
|
|
||||||
memset( (void *)_aucBuffer, 0, SERIAL_BUFFER_SIZE ) ;
|
|
||||||
_iHead=0 ;
|
|
||||||
_iTail=0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RingBuffer::store_char( uint8_t c )
|
|
||||||
{
|
|
||||||
int i = (uint32_t)(_iHead + 1) % SERIAL_BUFFER_SIZE ;
|
|
||||||
|
|
||||||
// if we should be storing the received character into the location
|
|
||||||
// just before the tail (meaning that the head would advance to the
|
|
||||||
// current location of the tail), we're about to overflow the buffer
|
|
||||||
// and so we don't write the character or advance the head.
|
|
||||||
if ( i != _iTail )
|
|
||||||
{
|
|
||||||
_aucBuffer[_iHead] = c ;
|
|
||||||
_iHead = i ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _RING_BUFFER_
|
|
||||||
#define _RING_BUFFER_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
// Define constants and variables for buffering incoming serial data. We're
|
|
||||||
// using a ring buffer (I think), in which head is the index of the location
|
|
||||||
// to which to write the next incoming character and tail is the index of the
|
|
||||||
// location from which to read.
|
|
||||||
#define SERIAL_BUFFER_SIZE 128
|
|
||||||
|
|
||||||
class RingBuffer
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
volatile uint8_t _aucBuffer[SERIAL_BUFFER_SIZE] ;
|
|
||||||
volatile int _iHead ;
|
|
||||||
volatile int _iTail ;
|
|
||||||
|
|
||||||
public:
|
|
||||||
RingBuffer( void ) ;
|
|
||||||
void store_char( uint8_t c ) ;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif /* _RING_BUFFER_ */
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
Server.h - Base class that provides Server
|
|
||||||
Copyright (c) 2011 Adrian McEwen. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef server_h
|
|
||||||
#define server_h
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
class Server : public Print {
|
|
||||||
public:
|
|
||||||
virtual void begin() =0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,317 +0,0 @@
|
|||||||
/*
|
|
||||||
Stream.cpp - adds parsing methods to Stream class
|
|
||||||
Copyright (c) 2008 David A. Mellis. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Created July 2011
|
|
||||||
parsing functions based on TextFinder library by Michael Margolis
|
|
||||||
|
|
||||||
findMulti/findUntil routines written by Jim Leonard/Xuth
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "Arduino.h"
|
|
||||||
#include "Stream.h"
|
|
||||||
|
|
||||||
#define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait
|
|
||||||
#define NO_SKIP_CHAR 1 // a magic char not found in a valid ASCII numeric field
|
|
||||||
|
|
||||||
// private method to read stream with timeout
|
|
||||||
int Stream::timedRead()
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
_startMillis = millis();
|
|
||||||
do {
|
|
||||||
c = read();
|
|
||||||
if (c >= 0) return c;
|
|
||||||
} while(millis() - _startMillis < _timeout);
|
|
||||||
return -1; // -1 indicates timeout
|
|
||||||
}
|
|
||||||
|
|
||||||
// private method to peek stream with timeout
|
|
||||||
int Stream::timedPeek()
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
_startMillis = millis();
|
|
||||||
do {
|
|
||||||
c = peek();
|
|
||||||
if (c >= 0) return c;
|
|
||||||
} while(millis() - _startMillis < _timeout);
|
|
||||||
return -1; // -1 indicates timeout
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns peek of the next digit in the stream or -1 if timeout
|
|
||||||
// discards non-numeric characters
|
|
||||||
int Stream::peekNextDigit()
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
while (1) {
|
|
||||||
c = timedPeek();
|
|
||||||
if (c < 0) return c; // timeout
|
|
||||||
if (c == '-') return c;
|
|
||||||
if (c >= '0' && c <= '9') return c;
|
|
||||||
read(); // discard non-numeric
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Public Methods
|
|
||||||
//////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void Stream::setTimeout(unsigned long timeout) // sets the maximum number of milliseconds to wait
|
|
||||||
{
|
|
||||||
_timeout = timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
// find returns true if the target string is found
|
|
||||||
bool Stream::find(char *target)
|
|
||||||
{
|
|
||||||
return findUntil(target, strlen(target), NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// reads data from the stream until the target string of given length is found
|
|
||||||
// returns true if target string is found, false if timed out
|
|
||||||
bool Stream::find(char *target, size_t length)
|
|
||||||
{
|
|
||||||
return findUntil(target, length, NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// as find but search ends if the terminator string is found
|
|
||||||
bool Stream::findUntil(char *target, char *terminator)
|
|
||||||
{
|
|
||||||
return findUntil(target, strlen(target), terminator, strlen(terminator));
|
|
||||||
}
|
|
||||||
|
|
||||||
// reads data from the stream until the target string of the given length is found
|
|
||||||
// search terminated if the terminator string is found
|
|
||||||
// returns true if target string is found, false if terminated or timed out
|
|
||||||
bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t termLen)
|
|
||||||
{
|
|
||||||
if (terminator == NULL) {
|
|
||||||
MultiTarget t[1] = {{target, targetLen, 0}};
|
|
||||||
return findMulti(t, 1) == 0 ? true : false;
|
|
||||||
} else {
|
|
||||||
MultiTarget t[2] = {{target, targetLen, 0}, {terminator, termLen, 0}};
|
|
||||||
return findMulti(t, 2) == 0 ? true : false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// returns the first valid (long) integer value from the current position.
|
|
||||||
// initial characters that are not digits (or the minus sign) are skipped
|
|
||||||
// function is terminated by the first character that is not a digit.
|
|
||||||
long Stream::parseInt()
|
|
||||||
{
|
|
||||||
return parseInt(NO_SKIP_CHAR); // terminate on first non-digit character (or timeout)
|
|
||||||
}
|
|
||||||
|
|
||||||
// as above but a given skipChar is ignored
|
|
||||||
// this allows format characters (typically commas) in values to be ignored
|
|
||||||
long Stream::parseInt(char skipChar)
|
|
||||||
{
|
|
||||||
bool isNegative = false;
|
|
||||||
long value = 0;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
c = peekNextDigit();
|
|
||||||
// ignore non numeric leading characters
|
|
||||||
if(c < 0)
|
|
||||||
return 0; // zero returned if timeout
|
|
||||||
|
|
||||||
do{
|
|
||||||
if(c == skipChar)
|
|
||||||
; // ignore this charactor
|
|
||||||
else if(c == '-')
|
|
||||||
isNegative = true;
|
|
||||||
else if(c >= '0' && c <= '9') // is c a digit?
|
|
||||||
value = value * 10 + c - '0';
|
|
||||||
read(); // consume the character we got with peek
|
|
||||||
c = timedPeek();
|
|
||||||
}
|
|
||||||
while( (c >= '0' && c <= '9') || c == skipChar );
|
|
||||||
|
|
||||||
if(isNegative)
|
|
||||||
value = -value;
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// as parseInt but returns a floating point value
|
|
||||||
float Stream::parseFloat()
|
|
||||||
{
|
|
||||||
return parseFloat(NO_SKIP_CHAR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// as above but the given skipChar is ignored
|
|
||||||
// this allows format characters (typically commas) in values to be ignored
|
|
||||||
float Stream::parseFloat(char skipChar){
|
|
||||||
bool isNegative = false;
|
|
||||||
bool isFraction = false;
|
|
||||||
long value = 0;
|
|
||||||
char c;
|
|
||||||
float fraction = 1.0;
|
|
||||||
|
|
||||||
c = peekNextDigit();
|
|
||||||
// ignore non numeric leading characters
|
|
||||||
if(c < 0)
|
|
||||||
return 0; // zero returned if timeout
|
|
||||||
|
|
||||||
do{
|
|
||||||
if(c == skipChar)
|
|
||||||
; // ignore
|
|
||||||
else if(c == '-')
|
|
||||||
isNegative = true;
|
|
||||||
else if (c == '.')
|
|
||||||
isFraction = true;
|
|
||||||
else if(c >= '0' && c <= '9') { // is c a digit?
|
|
||||||
value = value * 10 + c - '0';
|
|
||||||
if(isFraction)
|
|
||||||
fraction *= 0.1;
|
|
||||||
}
|
|
||||||
read(); // consume the character we got with peek
|
|
||||||
c = timedPeek();
|
|
||||||
}
|
|
||||||
while( (c >= '0' && c <= '9') || c == '.' || c == skipChar );
|
|
||||||
|
|
||||||
if(isNegative)
|
|
||||||
value = -value;
|
|
||||||
if(isFraction)
|
|
||||||
return value * fraction;
|
|
||||||
else
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// read characters from stream into buffer
|
|
||||||
// terminates if length characters have been read, or timeout (see setTimeout)
|
|
||||||
// returns the number of characters placed in the buffer
|
|
||||||
// the buffer is NOT null terminated.
|
|
||||||
//
|
|
||||||
size_t Stream::readBytes(char *buffer, size_t length)
|
|
||||||
{
|
|
||||||
size_t count = 0;
|
|
||||||
while (count < length) {
|
|
||||||
int c = timedRead();
|
|
||||||
if (c < 0) break;
|
|
||||||
*buffer++ = (char)c;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// as readBytes with terminator character
|
|
||||||
// terminates if length characters have been read, timeout, or if the terminator character detected
|
|
||||||
// returns the number of characters placed in the buffer (0 means no valid data found)
|
|
||||||
|
|
||||||
size_t Stream::readBytesUntil(char terminator, char *buffer, size_t length)
|
|
||||||
{
|
|
||||||
if (length < 1) return 0;
|
|
||||||
size_t index = 0;
|
|
||||||
while (index < length) {
|
|
||||||
int c = timedRead();
|
|
||||||
if (c < 0 || c == terminator) break;
|
|
||||||
*buffer++ = (char)c;
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
return index; // return number of characters, not including null terminator
|
|
||||||
}
|
|
||||||
|
|
||||||
String Stream::readString()
|
|
||||||
{
|
|
||||||
String ret;
|
|
||||||
int c = timedRead();
|
|
||||||
while (c >= 0)
|
|
||||||
{
|
|
||||||
ret += (char)c;
|
|
||||||
c = timedRead();
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
String Stream::readStringUntil(char terminator)
|
|
||||||
{
|
|
||||||
String ret;
|
|
||||||
int c = timedRead();
|
|
||||||
while (c >= 0 && c != terminator)
|
|
||||||
{
|
|
||||||
ret += (char)c;
|
|
||||||
c = timedRead();
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Stream::findMulti( struct Stream::MultiTarget *targets, int tCount) {
|
|
||||||
// any zero length target string automatically matches and would make
|
|
||||||
// a mess of the rest of the algorithm.
|
|
||||||
for (struct MultiTarget *t = targets; t < targets+tCount; ++t) {
|
|
||||||
if (t->len <= 0)
|
|
||||||
return t - targets;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
int c = timedRead();
|
|
||||||
if (c < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
for (struct MultiTarget *t = targets; t < targets+tCount; ++t) {
|
|
||||||
// the simple case is if we match, deal with that first.
|
|
||||||
if (c == t->str[t->index]) {
|
|
||||||
if (++t->index == t->len)
|
|
||||||
return t - targets;
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if not we need to walk back and see if we could have matched further
|
|
||||||
// down the stream (ie '1112' doesn't match the first position in '11112'
|
|
||||||
// but it will match the second position so we can't just reset the current
|
|
||||||
// index to 0 when we find a mismatch.
|
|
||||||
if (t->index == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
int origIndex = t->index;
|
|
||||||
do {
|
|
||||||
--t->index;
|
|
||||||
// first check if current char works against the new current index
|
|
||||||
if (c != t->str[t->index])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// if it's the only char then we're good, nothing more to check
|
|
||||||
if (t->index == 0) {
|
|
||||||
t->index++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise we need to check the rest of the found string
|
|
||||||
int diff = origIndex - t->index;
|
|
||||||
size_t i;
|
|
||||||
for (i = 0; i < t->index; ++i) {
|
|
||||||
if (t->str[i] != t->str[i + diff])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we successfully got through the previous loop then our current
|
|
||||||
// index is good.
|
|
||||||
if (i == t->index) {
|
|
||||||
t->index++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise we just try the next index
|
|
||||||
} while (t->index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// unreachable
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
Stream.h - base class for character-based streams.
|
|
||||||
Copyright (c) 2010 David A. Mellis. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
parsing functions based on TextFinder library by Michael Margolis
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Stream_h
|
|
||||||
#define Stream_h
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
// compatability macros for testing
|
|
||||||
/*
|
|
||||||
#define getInt() parseInt()
|
|
||||||
#define getInt(skipChar) parseInt(skipchar)
|
|
||||||
#define getFloat() parseFloat()
|
|
||||||
#define getFloat(skipChar) parseFloat(skipChar)
|
|
||||||
#define getString( pre_string, post_string, buffer, length)
|
|
||||||
readBytesBetween( pre_string, terminator, buffer, length)
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Stream : public Print
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
unsigned long _timeout; // number of milliseconds to wait for the next char before aborting timed read
|
|
||||||
unsigned long _startMillis; // used for timeout measurement
|
|
||||||
int timedRead(); // private method to read stream with timeout
|
|
||||||
int timedPeek(); // private method to peek stream with timeout
|
|
||||||
int peekNextDigit(); // returns the next numeric digit in the stream or -1 if timeout
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual int available() = 0;
|
|
||||||
virtual int read() = 0;
|
|
||||||
virtual int peek() = 0;
|
|
||||||
virtual void flush() = 0;
|
|
||||||
|
|
||||||
Stream() {_timeout=1000;}
|
|
||||||
|
|
||||||
// parsing methods
|
|
||||||
|
|
||||||
void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second
|
|
||||||
|
|
||||||
bool find(char *target); // reads data from the stream until the target string is found
|
|
||||||
bool find(uint8_t *target) { return find ((char *)target); }
|
|
||||||
// returns true if target string is found, false if timed out (see setTimeout)
|
|
||||||
|
|
||||||
bool find(char *target, size_t length); // reads data from the stream until the target string of given length is found
|
|
||||||
bool find(uint8_t *target, size_t length) { return find ((char *)target, length); }
|
|
||||||
// returns true if target string is found, false if timed out
|
|
||||||
|
|
||||||
bool findUntil(char *target, char *terminator); // as find but search ends if the terminator string is found
|
|
||||||
bool findUntil(uint8_t *target, char *terminator) { return findUntil((char *)target, terminator); }
|
|
||||||
|
|
||||||
bool findUntil(char *target, size_t targetLen, char *terminate, size_t termLen); // as above but search ends if the terminate string is found
|
|
||||||
bool findUntil(uint8_t *target, size_t targetLen, char *terminate, size_t termLen) {return findUntil((char *)target, targetLen, terminate, termLen); }
|
|
||||||
|
|
||||||
|
|
||||||
long parseInt(); // returns the first valid (long) integer value from the current position.
|
|
||||||
// initial characters that are not digits (or the minus sign) are skipped
|
|
||||||
// integer is terminated by the first character that is not a digit.
|
|
||||||
|
|
||||||
float parseFloat(); // float version of parseInt
|
|
||||||
|
|
||||||
virtual size_t readBytes( char *buffer, size_t length); // read chars from stream into buffer
|
|
||||||
virtual size_t readBytes( uint8_t *buffer, size_t length) { return readBytes((char *)buffer, length); }
|
|
||||||
// terminates if length characters have been read or timeout (see setTimeout)
|
|
||||||
// returns the number of characters placed in the buffer (0 means no valid data found)
|
|
||||||
|
|
||||||
size_t readBytesUntil( char terminator, char *buffer, size_t length); // as readBytes with terminator character
|
|
||||||
size_t readBytesUntil( char terminator, uint8_t *buffer, size_t length) { return readBytesUntil(terminator, (char *)buffer, length); }
|
|
||||||
// terminates if length characters have been read, timeout, or if the terminator character detected
|
|
||||||
// returns the number of characters placed in the buffer (0 means no valid data found)
|
|
||||||
|
|
||||||
// Arduino String functions to be added here
|
|
||||||
String readString();
|
|
||||||
String readStringUntil(char terminator);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
long parseInt(char skipChar); // as above but the given skipChar is ignored
|
|
||||||
// as above but the given skipChar is ignored
|
|
||||||
// this allows format characters (typically commas) in values to be ignored
|
|
||||||
|
|
||||||
float parseFloat(char skipChar); // as above but the given skipChar is ignored
|
|
||||||
|
|
||||||
struct MultiTarget {
|
|
||||||
const char *str; // string you're searching for
|
|
||||||
size_t len; // length of string you're searching for
|
|
||||||
size_t index; // index used by the search routine.
|
|
||||||
};
|
|
||||||
|
|
||||||
// This allows you to search for an arbitrary number of strings.
|
|
||||||
// Returns index of the target that is found first or -1 if timeout occurs.
|
|
||||||
int findMulti(struct MultiTarget *targets, int tCount);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
* Udp.cpp: Library to send/receive UDP packets.
|
|
||||||
*
|
|
||||||
* NOTE: UDP is fast, but has some important limitations (thanks to Warren Gray for mentioning these)
|
|
||||||
* 1) UDP does not guarantee the order in which assembled UDP packets are received. This
|
|
||||||
* might not happen often in practice, but in larger network topologies, a UDP
|
|
||||||
* packet can be received out of sequence.
|
|
||||||
* 2) UDP does not guard against lost packets - so packets *can* disappear without the sender being
|
|
||||||
* aware of it. Again, this may not be a concern in practice on small local networks.
|
|
||||||
* For more information, see http://www.cafeaulait.org/course/week12/35.html
|
|
||||||
*
|
|
||||||
* MIT License:
|
|
||||||
* Copyright (c) 2008 Bjoern Hartmann
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* bjoern@cs.stanford.edu 12/30/2008
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef udp_h
|
|
||||||
#define udp_h
|
|
||||||
|
|
||||||
#include <Stream.h>
|
|
||||||
#include <IPAddress.h>
|
|
||||||
|
|
||||||
class UDP : public Stream {
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use
|
|
||||||
virtual void stop() =0; // Finish with the UDP socket
|
|
||||||
|
|
||||||
// Sending UDP packets
|
|
||||||
|
|
||||||
// Start building up a packet to send to the remote host specific in ip and port
|
|
||||||
// Returns 1 if successful, 0 if there was a problem with the supplied IP address or port
|
|
||||||
virtual int beginPacket(IPAddress ip, uint16_t port) =0;
|
|
||||||
// Start building up a packet to send to the remote host specific in host and port
|
|
||||||
// Returns 1 if successful, 0 if there was a problem resolving the hostname or port
|
|
||||||
virtual int beginPacket(const char *host, uint16_t port) =0;
|
|
||||||
// Finish off this packet and send it
|
|
||||||
// Returns 1 if the packet was sent successfully, 0 if there was an error
|
|
||||||
virtual int endPacket() =0;
|
|
||||||
// Write a single byte into the packet
|
|
||||||
virtual size_t write(uint8_t) =0;
|
|
||||||
// Write size bytes from buffer into the packet
|
|
||||||
virtual size_t write(const uint8_t *buffer, size_t size) =0;
|
|
||||||
|
|
||||||
// Start processing the next available incoming packet
|
|
||||||
// Returns the size of the packet in bytes, or 0 if no packets are available
|
|
||||||
virtual int parsePacket() =0;
|
|
||||||
// Number of bytes remaining in the current packet
|
|
||||||
virtual int available() =0;
|
|
||||||
// Read a single byte from the current packet
|
|
||||||
virtual int read() =0;
|
|
||||||
// Read up to len bytes from the current packet and place them into buffer
|
|
||||||
// Returns the number of bytes read, or 0 if none are available
|
|
||||||
virtual int read(unsigned char* buffer, size_t len) =0;
|
|
||||||
// Read up to len characters from the current packet and place them into buffer
|
|
||||||
// Returns the number of characters read, or 0 if none are available
|
|
||||||
virtual int read(char* buffer, size_t len) =0;
|
|
||||||
// Return the next byte from the current packet without moving on to the next byte
|
|
||||||
virtual int peek() =0;
|
|
||||||
virtual void flush() =0; // Finish reading the current packet
|
|
||||||
|
|
||||||
// Return the IP address of the host who sent the current incoming packet
|
|
||||||
virtual IPAddress remoteIP() =0;
|
|
||||||
// Return the port of the host who sent the current incoming packet
|
|
||||||
virtual uint16_t remotePort() =0;
|
|
||||||
protected:
|
|
||||||
uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); };
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,180 +0,0 @@
|
|||||||
/*
|
|
||||||
WCharacter.h - Character utility functions for Wiring & Arduino
|
|
||||||
Copyright (c) 2010 Hernando Barragan. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Character_h
|
|
||||||
#define Character_h
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// WCharacter.h prototypes
|
|
||||||
#if defined ( __GNUC__ )
|
|
||||||
inline boolean isAlphaNumeric(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isAlpha(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isAscii(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isWhitespace(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isControl(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isDigit(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isGraph(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isLowerCase(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isPrintable(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isPunct(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isSpace(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isUpperCase(int c) __attribute__((always_inline));
|
|
||||||
inline boolean isHexadecimalDigit(int c) __attribute__((always_inline));
|
|
||||||
inline int toAscii(int c) __attribute__((always_inline));
|
|
||||||
inline int toLowerCase(int c) __attribute__((always_inline));
|
|
||||||
inline int toUpperCase(int c)__attribute__((always_inline));
|
|
||||||
#elif defined ( __ICCARM__ )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Checks for an alphanumeric character.
|
|
||||||
// It is equivalent to (isalpha(c) || isdigit(c)).
|
|
||||||
inline boolean isAlphaNumeric(int c)
|
|
||||||
{
|
|
||||||
return ( isalnum(c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for an alphabetic character.
|
|
||||||
// It is equivalent to (isupper(c) || islower(c)).
|
|
||||||
inline boolean isAlpha(int c)
|
|
||||||
{
|
|
||||||
return ( isalpha(c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks whether c is a 7-bit unsigned char value
|
|
||||||
// that fits into the ASCII character set.
|
|
||||||
inline boolean isAscii(int c)
|
|
||||||
{
|
|
||||||
/* return ( isascii(c) == 0 ? false : true); */
|
|
||||||
return ( (c & ~0x7f) != 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a blank character, that is, a space or a tab.
|
|
||||||
inline boolean isWhitespace(int c)
|
|
||||||
{
|
|
||||||
return ( isblank (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a control character.
|
|
||||||
inline boolean isControl(int c)
|
|
||||||
{
|
|
||||||
return ( iscntrl (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a digit (0 through 9).
|
|
||||||
inline boolean isDigit(int c)
|
|
||||||
{
|
|
||||||
return ( isdigit (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for any printable character except space.
|
|
||||||
inline boolean isGraph(int c)
|
|
||||||
{
|
|
||||||
return ( isgraph (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a lower-case character.
|
|
||||||
inline boolean isLowerCase(int c)
|
|
||||||
{
|
|
||||||
return (islower (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for any printable character including space.
|
|
||||||
inline boolean isPrintable(int c)
|
|
||||||
{
|
|
||||||
return ( isprint (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for any printable character which is not a space
|
|
||||||
// or an alphanumeric character.
|
|
||||||
inline boolean isPunct(int c)
|
|
||||||
{
|
|
||||||
return ( ispunct (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for white-space characters. For the avr-libc library,
|
|
||||||
// these are: space, formfeed ('\f'), newline ('\n'), carriage
|
|
||||||
// return ('\r'), horizontal tab ('\t'), and vertical tab ('\v').
|
|
||||||
inline boolean isSpace(int c)
|
|
||||||
{
|
|
||||||
return ( isspace (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for an uppercase letter.
|
|
||||||
inline boolean isUpperCase(int c)
|
|
||||||
{
|
|
||||||
return ( isupper (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7
|
|
||||||
// 8 9 a b c d e f A B C D E F.
|
|
||||||
inline boolean isHexadecimalDigit(int c)
|
|
||||||
{
|
|
||||||
return ( isxdigit (c) == 0 ? false : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Converts c to a 7-bit unsigned char value that fits into the
|
|
||||||
// ASCII character set, by clearing the high-order bits.
|
|
||||||
inline int toAscii(int c)
|
|
||||||
{
|
|
||||||
/* return toascii (c); */
|
|
||||||
return (c & 0x7f);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Warning:
|
|
||||||
// Many people will be unhappy if you use this function.
|
|
||||||
// This function will convert accented letters into random
|
|
||||||
// characters.
|
|
||||||
|
|
||||||
// Converts the letter c to lower case, if possible.
|
|
||||||
inline int toLowerCase(int c)
|
|
||||||
{
|
|
||||||
return tolower (c);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Converts the letter c to upper case, if possible.
|
|
||||||
inline int toUpperCase(int c)
|
|
||||||
{
|
|
||||||
return toupper (c);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,31 +1,29 @@
|
|||||||
|
#include "Arduino.h"
|
||||||
|
|
||||||
#include "WInterrupts.h"
|
void attachInterrupt(pin_size_t interruptNumber, voidFuncPtr callback, PinStatus mode) {
|
||||||
|
if ( g_APinDescription[interruptNumber].ulPinType != PIO_GPIO_IRQ ) {
|
||||||
void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode) {
|
pinRemoveMode(interruptNumber);
|
||||||
if ( g_APinDescription[pin].ulPinType != PIO_GPIO_IRQ ) {
|
|
||||||
pinRemoveMode(pin);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case LOW:
|
case LOW:
|
||||||
pinMode(pin, INPUT_IRQ_LOW);
|
pinMode(interruptNumber, INPUT_IRQ_LOW);
|
||||||
digitalSetIrqHandler(pin, (void *)callback);
|
digitalSetIrqHandler(interruptNumber, (void *)callback);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HIGH:
|
case HIGH:
|
||||||
pinMode(pin, INPUT_IRQ_HIGH);
|
pinMode(interruptNumber, INPUT_IRQ_HIGH);
|
||||||
digitalSetIrqHandler(pin, (void *)callback);
|
digitalSetIrqHandler(interruptNumber, (void *)callback);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FALLING:
|
case FALLING:
|
||||||
pinMode(pin, INPUT_IRQ_FALL);
|
pinMode(interruptNumber, INPUT_IRQ_FALL);
|
||||||
digitalSetIrqHandler(pin, (void *)callback);
|
digitalSetIrqHandler(interruptNumber, (void *)callback);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RISING:
|
case RISING:
|
||||||
pinMode(pin, INPUT_IRQ_RISE);
|
pinMode(interruptNumber, INPUT_IRQ_RISE);
|
||||||
digitalSetIrqHandler(pin, (void *)callback);
|
digitalSetIrqHandler(interruptNumber, (void *)callback);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CHANGE:
|
case CHANGE:
|
||||||
@@ -34,8 +32,8 @@ void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void detachInterrupt(uint32_t pin) {
|
void detachInterrupt(pin_size_t interruptNumber) {
|
||||||
if ( g_APinDescription[pin].ulPinType == PIO_GPIO_IRQ ) {
|
if ( g_APinDescription[interruptNumber].ulPinType == PIO_GPIO_IRQ ) {
|
||||||
pinRemoveMode(pin);
|
pinRemoveMode(interruptNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011-2012 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WIRING_INTERRUPTS_
|
|
||||||
#define _WIRING_INTERRUPTS_
|
|
||||||
|
|
||||||
#include "Arduino.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode);
|
|
||||||
|
|
||||||
extern void detachInterrupt(uint32_t pin);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _WIRING_INTERRUPTS_ */
|
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include "WMath.h"
|
#include "api/Common.h"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
extern void rtl_srandom( uint32_t seed );
|
extern void rtl_srandom( uint32_t seed );
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WIRING_MATH_
|
|
||||||
#define _WIRING_MATH_
|
|
||||||
|
|
||||||
extern long random( long ) ;
|
|
||||||
extern long random( long, long ) ;
|
|
||||||
extern void randomSeed( uint32_t dwSeed ) ;
|
|
||||||
extern long map( long, long, long, long, long ) ;
|
|
||||||
|
|
||||||
extern uint16_t makeWord( uint16_t w ) ;
|
|
||||||
extern uint16_t makeWord( uint8_t h, uint8_t l ) ;
|
|
||||||
|
|
||||||
#define word(...) makeWord(__VA_ARGS__)
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _WIRING_MATH_ */
|
|
||||||
@@ -1,748 +0,0 @@
|
|||||||
/*
|
|
||||||
WString.cpp - String library for Wiring & Arduino
|
|
||||||
...mostly rewritten by Paul Stoffregen...
|
|
||||||
Copyright (c) 2009-10 Hernando Barragan. All rights reserved.
|
|
||||||
Copyright 2011, Paul Stoffregen, paul@pjrc.com
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "Arduino.h"
|
|
||||||
#include "WString.h"
|
|
||||||
#include "itoa.h"
|
|
||||||
#include "avr/dtostrf.h"
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Constructors */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
String::String(const char *cstr)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
if (cstr) copy(cstr, strlen(cstr));
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(const String &value)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
*this = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(const __FlashStringHelper *pstr)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
*this = pstr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
String::String(String &&rval)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
move(rval);
|
|
||||||
}
|
|
||||||
String::String(StringSumHelper &&rval)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
move(rval);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
String::String(char c)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[2];
|
|
||||||
buf[0] = c;
|
|
||||||
buf[1] = 0;
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(unsigned char value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[1 + 8 * sizeof(unsigned char)];
|
|
||||||
utoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(int value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[2 + 8 * sizeof(int)];
|
|
||||||
itoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(unsigned int value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[1 + 8 * sizeof(unsigned int)];
|
|
||||||
utoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(long value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[2 + 8 * sizeof(long)];
|
|
||||||
ltoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(unsigned long value, unsigned char base)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[1 + 8 * sizeof(unsigned long)];
|
|
||||||
ultoa(value, buf, base);
|
|
||||||
*this = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(float value, unsigned char decimalPlaces)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[33];
|
|
||||||
*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
String::String(double value, unsigned char decimalPlaces)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
char buf[33];
|
|
||||||
*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
String::~String()
|
|
||||||
{
|
|
||||||
free(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Memory Management */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
inline void String::init(void)
|
|
||||||
{
|
|
||||||
buffer = NULL;
|
|
||||||
capacity = 0;
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::invalidate(void)
|
|
||||||
{
|
|
||||||
if (buffer) free(buffer);
|
|
||||||
buffer = NULL;
|
|
||||||
capacity = len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::reserve(unsigned int size)
|
|
||||||
{
|
|
||||||
if (buffer && capacity >= size) return 1;
|
|
||||||
if (changeBuffer(size)) {
|
|
||||||
if (len == 0) buffer[0] = 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::changeBuffer(unsigned int maxStrLen)
|
|
||||||
{
|
|
||||||
char *newbuffer = (char *)realloc(buffer, maxStrLen + 1);
|
|
||||||
if (newbuffer) {
|
|
||||||
buffer = newbuffer;
|
|
||||||
capacity = maxStrLen;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Copy and Move */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
String & String::copy(const char *cstr, unsigned int length)
|
|
||||||
{
|
|
||||||
if (!reserve(length)) {
|
|
||||||
invalidate();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
len = length;
|
|
||||||
strcpy(buffer, cstr);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
String & String::copy(const __FlashStringHelper *pstr, unsigned int length)
|
|
||||||
{
|
|
||||||
if (!reserve(length)) {
|
|
||||||
invalidate();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
len = length;
|
|
||||||
strcpy_P(buffer, (PGM_P)pstr);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
void String::move(String &rhs)
|
|
||||||
{
|
|
||||||
if (buffer) {
|
|
||||||
if (capacity >= rhs.len) {
|
|
||||||
strcpy(buffer, rhs.buffer);
|
|
||||||
len = rhs.len;
|
|
||||||
rhs.len = 0;
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
free(buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buffer = rhs.buffer;
|
|
||||||
capacity = rhs.capacity;
|
|
||||||
len = rhs.len;
|
|
||||||
rhs.buffer = NULL;
|
|
||||||
rhs.capacity = 0;
|
|
||||||
rhs.len = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
String & String::operator = (const String &rhs)
|
|
||||||
{
|
|
||||||
if (this == &rhs) return *this;
|
|
||||||
|
|
||||||
if (rhs.buffer) copy(rhs.buffer, rhs.len);
|
|
||||||
else invalidate();
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
String & String::operator = (String &&rval)
|
|
||||||
{
|
|
||||||
if (this != &rval) move(rval);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
String & String::operator = (StringSumHelper &&rval)
|
|
||||||
{
|
|
||||||
if (this != &rval) move(rval);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
String & String::operator = (const char *cstr)
|
|
||||||
{
|
|
||||||
if (cstr) copy(cstr, strlen(cstr));
|
|
||||||
else invalidate();
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
String & String::operator = (const __FlashStringHelper *pstr)
|
|
||||||
{
|
|
||||||
if (pstr) copy(pstr, strlen_P((PGM_P)pstr));
|
|
||||||
else invalidate();
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* concat */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
unsigned char String::concat(const String &s)
|
|
||||||
{
|
|
||||||
return concat(s.buffer, s.len);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(const char *cstr, unsigned int length)
|
|
||||||
{
|
|
||||||
unsigned int newlen = len + length;
|
|
||||||
if (!cstr) return 0;
|
|
||||||
if (length == 0) return 1;
|
|
||||||
if (!reserve(newlen)) return 0;
|
|
||||||
strcpy(buffer + len, cstr);
|
|
||||||
len = newlen;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(const char *cstr)
|
|
||||||
{
|
|
||||||
if (!cstr) return 0;
|
|
||||||
return concat(cstr, strlen(cstr));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(char c)
|
|
||||||
{
|
|
||||||
char buf[2];
|
|
||||||
buf[0] = c;
|
|
||||||
buf[1] = 0;
|
|
||||||
return concat(buf, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(unsigned char num)
|
|
||||||
{
|
|
||||||
char buf[1 + 3 * sizeof(unsigned char)];
|
|
||||||
itoa(num, buf, 10);
|
|
||||||
return concat(buf, strlen(buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(int num)
|
|
||||||
{
|
|
||||||
char buf[2 + 3 * sizeof(int)];
|
|
||||||
itoa(num, buf, 10);
|
|
||||||
return concat(buf, strlen(buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(unsigned int num)
|
|
||||||
{
|
|
||||||
char buf[1 + 3 * sizeof(unsigned int)];
|
|
||||||
utoa(num, buf, 10);
|
|
||||||
return concat(buf, strlen(buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(long num)
|
|
||||||
{
|
|
||||||
char buf[2 + 3 * sizeof(long)];
|
|
||||||
ltoa(num, buf, 10);
|
|
||||||
return concat(buf, strlen(buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(unsigned long num)
|
|
||||||
{
|
|
||||||
char buf[1 + 3 * sizeof(unsigned long)];
|
|
||||||
ultoa(num, buf, 10);
|
|
||||||
return concat(buf, strlen(buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(float num)
|
|
||||||
{
|
|
||||||
char buf[20];
|
|
||||||
char* string = dtostrf(num, 4, 2, buf);
|
|
||||||
return concat(string, strlen(string));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(double num)
|
|
||||||
{
|
|
||||||
char buf[20];
|
|
||||||
char* string = dtostrf(num, 4, 2, buf);
|
|
||||||
return concat(string, strlen(string));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::concat(const __FlashStringHelper * str)
|
|
||||||
{
|
|
||||||
if (!str) return 0;
|
|
||||||
int length = strlen_P((const char *) str);
|
|
||||||
if (length == 0) return 1;
|
|
||||||
unsigned int newlen = len + length;
|
|
||||||
if (!reserve(newlen)) return 0;
|
|
||||||
strcpy_P(buffer + len, (const char *) str);
|
|
||||||
len = newlen;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Concatenate */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(rhs.buffer, rhs.len)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!cstr || !a.concat(cstr, strlen(cstr))) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, char c)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(c)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, int num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, long num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, float num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, double num)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(num)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs)
|
|
||||||
{
|
|
||||||
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
|
|
||||||
if (!a.concat(rhs)) a.invalidate();
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Comparison */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
int String::compareTo(const String &s) const
|
|
||||||
{
|
|
||||||
if (!buffer || !s.buffer) {
|
|
||||||
if (s.buffer && s.len > 0) return 0 - *(unsigned char *)s.buffer;
|
|
||||||
if (buffer && len > 0) return *(unsigned char *)buffer;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return strcmp(buffer, s.buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::equals(const String &s2) const
|
|
||||||
{
|
|
||||||
return (len == s2.len && compareTo(s2) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::equals(const char *cstr) const
|
|
||||||
{
|
|
||||||
if (len == 0) return (cstr == NULL || *cstr == 0);
|
|
||||||
if (cstr == NULL) return buffer[0] == 0;
|
|
||||||
return strcmp(buffer, cstr) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::operator<(const String &rhs) const
|
|
||||||
{
|
|
||||||
return compareTo(rhs) < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::operator>(const String &rhs) const
|
|
||||||
{
|
|
||||||
return compareTo(rhs) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::operator<=(const String &rhs) const
|
|
||||||
{
|
|
||||||
return compareTo(rhs) <= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::operator>=(const String &rhs) const
|
|
||||||
{
|
|
||||||
return compareTo(rhs) >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::equalsIgnoreCase( const String &s2 ) const
|
|
||||||
{
|
|
||||||
if (this == &s2) return 1;
|
|
||||||
if (len != s2.len) return 0;
|
|
||||||
if (len == 0) return 1;
|
|
||||||
const char *p1 = buffer;
|
|
||||||
const char *p2 = s2.buffer;
|
|
||||||
while (*p1) {
|
|
||||||
if (tolower(*p1++) != tolower(*p2++)) return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::startsWith( const String &s2 ) const
|
|
||||||
{
|
|
||||||
if (len < s2.len) return 0;
|
|
||||||
return startsWith(s2, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::startsWith( const String &s2, unsigned int offset ) const
|
|
||||||
{
|
|
||||||
if (offset > len - s2.len || !buffer || !s2.buffer) return 0;
|
|
||||||
return strncmp( &buffer[offset], s2.buffer, s2.len ) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char String::endsWith( const String &s2 ) const
|
|
||||||
{
|
|
||||||
if ( len < s2.len || !buffer || !s2.buffer) return 0;
|
|
||||||
return strcmp(&buffer[len - s2.len], s2.buffer) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Character Access */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
char String::charAt(unsigned int loc) const
|
|
||||||
{
|
|
||||||
return operator[](loc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::setCharAt(unsigned int loc, char c)
|
|
||||||
{
|
|
||||||
if (loc < len) buffer[loc] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
char & String::operator[](unsigned int index)
|
|
||||||
{
|
|
||||||
static char dummy_writable_char;
|
|
||||||
if (index >= len || !buffer) {
|
|
||||||
dummy_writable_char = 0;
|
|
||||||
return dummy_writable_char;
|
|
||||||
}
|
|
||||||
return buffer[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
char String::operator[]( unsigned int index ) const
|
|
||||||
{
|
|
||||||
if (index >= len || !buffer) return 0;
|
|
||||||
return buffer[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const
|
|
||||||
{
|
|
||||||
if (!bufsize || !buf) return;
|
|
||||||
if (index >= len) {
|
|
||||||
buf[0] = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
unsigned int n = bufsize - 1;
|
|
||||||
if (n > len - index) n = len - index;
|
|
||||||
strncpy((char *)buf, buffer + index, n);
|
|
||||||
buf[n] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Search */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
int String::indexOf(char c) const
|
|
||||||
{
|
|
||||||
return indexOf(c, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::indexOf( char ch, unsigned int fromIndex ) const
|
|
||||||
{
|
|
||||||
if (fromIndex >= len) return -1;
|
|
||||||
const char* temp = strchr(buffer + fromIndex, ch);
|
|
||||||
if (temp == NULL) return -1;
|
|
||||||
return temp - buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::indexOf(const String &s2) const
|
|
||||||
{
|
|
||||||
return indexOf(s2, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::indexOf(const String &s2, unsigned int fromIndex) const
|
|
||||||
{
|
|
||||||
if (fromIndex >= len) return -1;
|
|
||||||
const char *found = strstr(buffer + fromIndex, s2.buffer);
|
|
||||||
if (found == NULL) return -1;
|
|
||||||
return found - buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::lastIndexOf( char theChar ) const
|
|
||||||
{
|
|
||||||
return lastIndexOf(theChar, len - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::lastIndexOf(char ch, unsigned int fromIndex) const
|
|
||||||
{
|
|
||||||
if (fromIndex >= len) return -1;
|
|
||||||
char tempchar = buffer[fromIndex + 1];
|
|
||||||
buffer[fromIndex + 1] = '\0';
|
|
||||||
char* temp = strrchr( buffer, ch );
|
|
||||||
buffer[fromIndex + 1] = tempchar;
|
|
||||||
if (temp == NULL) return -1;
|
|
||||||
return temp - buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::lastIndexOf(const String &s2) const
|
|
||||||
{
|
|
||||||
return lastIndexOf(s2, len - s2.len);
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::lastIndexOf(const String &s2, unsigned int fromIndex) const
|
|
||||||
{
|
|
||||||
if (s2.len == 0 || len == 0 || s2.len > len) return -1;
|
|
||||||
if (fromIndex >= len) fromIndex = len - 1;
|
|
||||||
int found = -1;
|
|
||||||
for (char *p = buffer; p <= buffer + fromIndex; p++) {
|
|
||||||
p = strstr(p, s2.buffer);
|
|
||||||
if (!p) break;
|
|
||||||
if ((unsigned int)(p - buffer) <= fromIndex) found = p - buffer;
|
|
||||||
}
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
String String::substring(unsigned int left, unsigned int right) const
|
|
||||||
{
|
|
||||||
if (left > right) {
|
|
||||||
unsigned int temp = right;
|
|
||||||
right = left;
|
|
||||||
left = temp;
|
|
||||||
}
|
|
||||||
String out;
|
|
||||||
if (left >= len) return out;
|
|
||||||
if (right > len) right = len;
|
|
||||||
char temp = buffer[right]; // save the replaced character
|
|
||||||
buffer[right] = '\0';
|
|
||||||
out = buffer + left; // pointer arithmetic
|
|
||||||
buffer[right] = temp; //restore character
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Modification */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
void String::replace(char find, char replace)
|
|
||||||
{
|
|
||||||
if (!buffer) return;
|
|
||||||
for (char *p = buffer; *p; p++) {
|
|
||||||
if (*p == find) *p = replace;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::replace(const String& find, const String& replace)
|
|
||||||
{
|
|
||||||
if (len == 0 || find.len == 0) return;
|
|
||||||
int diff = replace.len - find.len;
|
|
||||||
char *readFrom = buffer;
|
|
||||||
char *foundAt;
|
|
||||||
if (diff == 0) {
|
|
||||||
while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
|
|
||||||
memcpy(foundAt, replace.buffer, replace.len);
|
|
||||||
readFrom = foundAt + replace.len;
|
|
||||||
}
|
|
||||||
} else if (diff < 0) {
|
|
||||||
char *writeTo = buffer;
|
|
||||||
while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
|
|
||||||
unsigned int n = foundAt - readFrom;
|
|
||||||
memcpy(writeTo, readFrom, n);
|
|
||||||
writeTo += n;
|
|
||||||
memcpy(writeTo, replace.buffer, replace.len);
|
|
||||||
writeTo += replace.len;
|
|
||||||
readFrom = foundAt + find.len;
|
|
||||||
len += diff;
|
|
||||||
}
|
|
||||||
strcpy(writeTo, readFrom);
|
|
||||||
} else {
|
|
||||||
unsigned int size = len; // compute size needed for result
|
|
||||||
while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
|
|
||||||
readFrom = foundAt + find.len;
|
|
||||||
size += diff;
|
|
||||||
}
|
|
||||||
if (size == len) return;
|
|
||||||
if (size > capacity && !changeBuffer(size)) return; // XXX: tell user!
|
|
||||||
int index = len - 1;
|
|
||||||
while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) {
|
|
||||||
readFrom = buffer + index + find.len;
|
|
||||||
memmove(readFrom + diff, readFrom, len - (readFrom - buffer));
|
|
||||||
len += diff;
|
|
||||||
buffer[len] = 0;
|
|
||||||
memcpy(buffer + index, replace.buffer, replace.len);
|
|
||||||
index--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::remove(unsigned int index){
|
|
||||||
// Pass the biggest integer as the count. The remove method
|
|
||||||
// below will take care of truncating it at the end of the
|
|
||||||
// string.
|
|
||||||
remove(index, (unsigned int)-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::remove(unsigned int index, unsigned int count){
|
|
||||||
if (index >= len) { return; }
|
|
||||||
if (count <= 0) { return; }
|
|
||||||
if (count > len - index) { count = len - index; }
|
|
||||||
char *writeTo = buffer + index;
|
|
||||||
len = len - count;
|
|
||||||
strncpy(writeTo, buffer + index + count,len - index);
|
|
||||||
buffer[len] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::toLowerCase(void)
|
|
||||||
{
|
|
||||||
if (!buffer) return;
|
|
||||||
for (char *p = buffer; *p; p++) {
|
|
||||||
*p = tolower(*p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::toUpperCase(void)
|
|
||||||
{
|
|
||||||
if (!buffer) return;
|
|
||||||
for (char *p = buffer; *p; p++) {
|
|
||||||
*p = toupper(*p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::trim(void)
|
|
||||||
{
|
|
||||||
if (!buffer || len == 0) return;
|
|
||||||
char *begin = buffer;
|
|
||||||
while (isspace(*begin)) begin++;
|
|
||||||
char *end = buffer + len - 1;
|
|
||||||
while (isspace(*end) && end >= begin) end--;
|
|
||||||
len = end + 1 - begin;
|
|
||||||
if (begin > buffer) memcpy(buffer, begin, len);
|
|
||||||
buffer[len] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************/
|
|
||||||
/* Parsing / Conversion */
|
|
||||||
/*********************************************/
|
|
||||||
|
|
||||||
long String::toInt(void) const
|
|
||||||
{
|
|
||||||
if (buffer) return atol(buffer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
float String::toFloat(void) const
|
|
||||||
{
|
|
||||||
if (buffer) return float(atof(buffer));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,224 +0,0 @@
|
|||||||
/*
|
|
||||||
WString.h - String library for Wiring & Arduino
|
|
||||||
...mostly rewritten by Paul Stoffregen...
|
|
||||||
Copyright (c) 2009-10 Hernando Barragan. All right reserved.
|
|
||||||
Copyright 2011, Paul Stoffregen, paul@pjrc.com
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef String_class_h
|
|
||||||
#define String_class_h
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <avr/pgmspace.h>
|
|
||||||
|
|
||||||
// When compiling programs with this class, the following gcc parameters
|
|
||||||
// dramatically increase performance and memory (RAM) efficiency, typically
|
|
||||||
// with little or no increase in code size.
|
|
||||||
// -felide-constructors
|
|
||||||
// -std=c++0x
|
|
||||||
|
|
||||||
class __FlashStringHelper;
|
|
||||||
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
|
|
||||||
|
|
||||||
// An inherited class for holding the result of a concatenation. These
|
|
||||||
// result objects are assumed to be writable by subsequent concatenations.
|
|
||||||
class StringSumHelper;
|
|
||||||
|
|
||||||
// The string class
|
|
||||||
class String
|
|
||||||
{
|
|
||||||
// use a function pointer to allow for "if (s)" without the
|
|
||||||
// complications of an operator bool(). for more information, see:
|
|
||||||
// http://www.artima.com/cppsource/safebool.html
|
|
||||||
typedef void (String::*StringIfHelperType)() const;
|
|
||||||
void StringIfHelper() const {}
|
|
||||||
|
|
||||||
public:
|
|
||||||
// constructors
|
|
||||||
// creates a copy of the initial value.
|
|
||||||
// if the initial value is null or invalid, or if memory allocation
|
|
||||||
// fails, the string will be marked as invalid (i.e. "if (s)" will
|
|
||||||
// be false).
|
|
||||||
String(const char *cstr = "");
|
|
||||||
String(const String &str);
|
|
||||||
String(const __FlashStringHelper *str);
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
String(String &&rval);
|
|
||||||
String(StringSumHelper &&rval);
|
|
||||||
#endif
|
|
||||||
explicit String(char c);
|
|
||||||
explicit String(unsigned char, unsigned char base=10);
|
|
||||||
explicit String(int, unsigned char base=10);
|
|
||||||
explicit String(unsigned int, unsigned char base=10);
|
|
||||||
explicit String(long, unsigned char base=10);
|
|
||||||
explicit String(unsigned long, unsigned char base=10);
|
|
||||||
explicit String(float, unsigned char decimalPlaces=2);
|
|
||||||
explicit String(double, unsigned char decimalPlaces=2);
|
|
||||||
~String(void);
|
|
||||||
|
|
||||||
// memory management
|
|
||||||
// return true on success, false on failure (in which case, the string
|
|
||||||
// is left unchanged). reserve(0), if successful, will validate an
|
|
||||||
// invalid string (i.e., "if (s)" will be true afterwards)
|
|
||||||
unsigned char reserve(unsigned int size);
|
|
||||||
inline unsigned int length(void) const {return len;}
|
|
||||||
|
|
||||||
// creates a copy of the assigned value. if the value is null or
|
|
||||||
// invalid, or if the memory allocation fails, the string will be
|
|
||||||
// marked as invalid ("if (s)" will be false).
|
|
||||||
String & operator = (const String &rhs);
|
|
||||||
String & operator = (const char *cstr);
|
|
||||||
String & operator = (const __FlashStringHelper *str);
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
String & operator = (String &&rval);
|
|
||||||
String & operator = (StringSumHelper &&rval);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// concatenate (works w/ built-in types)
|
|
||||||
|
|
||||||
// returns true on success, false on failure (in which case, the string
|
|
||||||
// is left unchanged). if the argument is null or invalid, the
|
|
||||||
// concatenation is considered unsucessful.
|
|
||||||
unsigned char concat(const String &str);
|
|
||||||
unsigned char concat(const char *cstr);
|
|
||||||
unsigned char concat(char c);
|
|
||||||
unsigned char concat(unsigned char c);
|
|
||||||
unsigned char concat(int num);
|
|
||||||
unsigned char concat(unsigned int num);
|
|
||||||
unsigned char concat(long num);
|
|
||||||
unsigned char concat(unsigned long num);
|
|
||||||
unsigned char concat(float num);
|
|
||||||
unsigned char concat(double num);
|
|
||||||
unsigned char concat(const __FlashStringHelper * str);
|
|
||||||
|
|
||||||
// if there's not enough memory for the concatenated value, the string
|
|
||||||
// will be left unchanged (but this isn't signalled in any way)
|
|
||||||
String & operator += (const String &rhs) {concat(rhs); return (*this);}
|
|
||||||
String & operator += (const char *cstr) {concat(cstr); return (*this);}
|
|
||||||
String & operator += (char c) {concat(c); return (*this);}
|
|
||||||
String & operator += (unsigned char num) {concat(num); return (*this);}
|
|
||||||
String & operator += (int num) {concat(num); return (*this);}
|
|
||||||
String & operator += (unsigned int num) {concat(num); return (*this);}
|
|
||||||
String & operator += (long num) {concat(num); return (*this);}
|
|
||||||
String & operator += (unsigned long num) {concat(num); return (*this);}
|
|
||||||
String & operator += (float num) {concat(num); return (*this);}
|
|
||||||
String & operator += (double num) {concat(num); return (*this);}
|
|
||||||
String & operator += (const __FlashStringHelper *str){concat(str); return (*this);}
|
|
||||||
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, char c);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, int num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, float num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, double num);
|
|
||||||
friend StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs);
|
|
||||||
|
|
||||||
// comparison (only works w/ Strings and "strings")
|
|
||||||
operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; }
|
|
||||||
int compareTo(const String &s) const;
|
|
||||||
unsigned char equals(const String &s) const;
|
|
||||||
unsigned char equals(const char *cstr) const;
|
|
||||||
unsigned char operator == (const String &rhs) const {return equals(rhs);}
|
|
||||||
unsigned char operator == (const char *cstr) const {return equals(cstr);}
|
|
||||||
unsigned char operator != (const String &rhs) const {return !equals(rhs);}
|
|
||||||
unsigned char operator != (const char *cstr) const {return !equals(cstr);}
|
|
||||||
unsigned char operator < (const String &rhs) const;
|
|
||||||
unsigned char operator > (const String &rhs) const;
|
|
||||||
unsigned char operator <= (const String &rhs) const;
|
|
||||||
unsigned char operator >= (const String &rhs) const;
|
|
||||||
unsigned char equalsIgnoreCase(const String &s) const;
|
|
||||||
unsigned char startsWith( const String &prefix) const;
|
|
||||||
unsigned char startsWith(const String &prefix, unsigned int offset) const;
|
|
||||||
unsigned char endsWith(const String &suffix) const;
|
|
||||||
|
|
||||||
// character acccess
|
|
||||||
char charAt(unsigned int index) const;
|
|
||||||
void setCharAt(unsigned int index, char c);
|
|
||||||
char operator [] (unsigned int index) const;
|
|
||||||
char& operator [] (unsigned int index);
|
|
||||||
void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index=0) const;
|
|
||||||
void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const
|
|
||||||
{getBytes((unsigned char *)buf, bufsize, index);}
|
|
||||||
const char * c_str() const { return buffer; }
|
|
||||||
|
|
||||||
// search
|
|
||||||
int indexOf( char ch ) const;
|
|
||||||
int indexOf( char ch, unsigned int fromIndex ) const;
|
|
||||||
int indexOf( const String &str ) const;
|
|
||||||
int indexOf( const String &str, unsigned int fromIndex ) const;
|
|
||||||
int lastIndexOf( char ch ) const;
|
|
||||||
int lastIndexOf( char ch, unsigned int fromIndex ) const;
|
|
||||||
int lastIndexOf( const String &str ) const;
|
|
||||||
int lastIndexOf( const String &str, unsigned int fromIndex ) const;
|
|
||||||
String substring( unsigned int beginIndex ) const { return substring(beginIndex, len); };
|
|
||||||
String substring( unsigned int beginIndex, unsigned int endIndex ) const;
|
|
||||||
|
|
||||||
// modification
|
|
||||||
void replace(char find, char replace);
|
|
||||||
void replace(const String& find, const String& replace);
|
|
||||||
void remove(unsigned int index);
|
|
||||||
void remove(unsigned int index, unsigned int count);
|
|
||||||
void toLowerCase(void);
|
|
||||||
void toUpperCase(void);
|
|
||||||
void trim(void);
|
|
||||||
|
|
||||||
// parsing/conversion
|
|
||||||
long toInt(void) const;
|
|
||||||
float toFloat(void) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
char *buffer; // the actual char array
|
|
||||||
unsigned int capacity; // the array length minus one (for the '\0')
|
|
||||||
unsigned int len; // the String length (not counting the '\0')
|
|
||||||
protected:
|
|
||||||
void init(void);
|
|
||||||
void invalidate(void);
|
|
||||||
unsigned char changeBuffer(unsigned int maxStrLen);
|
|
||||||
unsigned char concat(const char *cstr, unsigned int length);
|
|
||||||
|
|
||||||
// copy and move
|
|
||||||
String & copy(const char *cstr, unsigned int length);
|
|
||||||
String & copy(const __FlashStringHelper *pstr, unsigned int length);
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
|
||||||
void move(String &rhs);
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
class StringSumHelper : public String
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
StringSumHelper(const String &s) : String(s) {}
|
|
||||||
StringSumHelper(const char *p) : String(p) {}
|
|
||||||
StringSumHelper(char c) : String(c) {}
|
|
||||||
StringSumHelper(unsigned char num) : String(num) {}
|
|
||||||
StringSumHelper(int num) : String(num) {}
|
|
||||||
StringSumHelper(unsigned int num) : String(num) {}
|
|
||||||
StringSumHelper(long num) : String(num) {}
|
|
||||||
StringSumHelper(unsigned long num) : String(num) {}
|
|
||||||
StringSumHelper(float num) : String(num) {}
|
|
||||||
StringSumHelper(double num) : String(num) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // __cplusplus
|
|
||||||
#endif // String_class_h
|
|
||||||
155
arduino/realtek-ambz/cores/arduino/WVariant.h
Normal file
155
arduino/realtek-ambz/cores/arduino/WVariant.h
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "wiring_os.h"
|
||||||
|
#include "wiring_watchdog.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#define boolean boolean_rtl
|
||||||
|
#include "rtl_lib.h"
|
||||||
|
#undef boolean
|
||||||
|
|
||||||
|
/* moved from Arduino.h */
|
||||||
|
/*
|
||||||
|
* \brief Set CPU CLK 166MHz
|
||||||
|
* clk : 0 - 166666666 Hz, 1 - 83333333 Hz, 2 - 41666666 Hz, 3 - 20833333 Hz, 4 - 10416666 Hz, 5 - 4000000 Hz
|
||||||
|
* baud: 38400,...
|
||||||
|
*/
|
||||||
|
extern void Init_CPU_CLK_UART(int clkn, int baud);
|
||||||
|
extern void sys_info(void);
|
||||||
|
/* HalGetChipId:
|
||||||
|
* 0xff - RTL8711AM, 0xfe - RTL8195AM, 0xfd - RTL8711AF,
|
||||||
|
* 0xfc - RTL8710AF, 0xfb - RTL8711AN, 0xfa - RTL8710AM */
|
||||||
|
extern unsigned char HalGetChipId(void);
|
||||||
|
extern unsigned int HalGetCpuClk(void);
|
||||||
|
|
||||||
|
extern void wait_us(int us);
|
||||||
|
#define delay_us wait_us
|
||||||
|
|
||||||
|
extern void yield(void);
|
||||||
|
|
||||||
|
#ifndef printf
|
||||||
|
#define printf rtl_printf
|
||||||
|
#endif
|
||||||
|
#ifndef sprintf
|
||||||
|
#define sprintf rtl_sprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
extern void *pvPortMalloc( size_t xWantedSize );
|
||||||
|
extern void vPortFree( void *pv );
|
||||||
|
extern void *pvPortReAlloc( void *pv, size_t xWantedSize );
|
||||||
|
extern size_t xPortGetFreeHeapSize( void );
|
||||||
|
extern size_t xPortGetMinimumEverFreeHeapSize( void );
|
||||||
|
|
||||||
|
extern void *tcm_heap_malloc(int size);
|
||||||
|
extern void *tcm_heap_calloc(int size);
|
||||||
|
extern void tcm_heap_free(void * mem);
|
||||||
|
extern void tcm_heap_dump(void);
|
||||||
|
extern int tcm_heap_freeSpace(void);
|
||||||
|
|
||||||
|
#ifndef malloc
|
||||||
|
#define malloc pvPortMalloc
|
||||||
|
#endif
|
||||||
|
#ifndef free
|
||||||
|
#define free vPortFree
|
||||||
|
#endif
|
||||||
|
#ifndef realloc
|
||||||
|
#define realloc pvPortReAlloc
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NOT_INITIAL (1UL<<0)
|
||||||
|
#define PIO_GPIO (1UL<<1)
|
||||||
|
#define PIO_PWM (1UL<<2)
|
||||||
|
#define PIO_I2C (1UL<<3)
|
||||||
|
#define PIO_ADC (1UL<<4)
|
||||||
|
#define PIO_DAC (1UL<<5)
|
||||||
|
#define PIO_GPIO_IRQ (1UL<<6)
|
||||||
|
|
||||||
|
#define PWM_MODE_ENABLED 1
|
||||||
|
#define PWM_MODE_DISABLED 0
|
||||||
|
|
||||||
|
/* Types used for the tables below */
|
||||||
|
typedef struct _PinDescription
|
||||||
|
{
|
||||||
|
|
||||||
|
// HW PinNames
|
||||||
|
uint32_t pinname;
|
||||||
|
|
||||||
|
// Current Pin Type
|
||||||
|
uint32_t ulPinType;
|
||||||
|
|
||||||
|
// Supported Pin Function
|
||||||
|
uint32_t ulPinAttribute;
|
||||||
|
|
||||||
|
// Current Pin Mode
|
||||||
|
uint32_t ulPinMode;
|
||||||
|
|
||||||
|
} PinDescription ;
|
||||||
|
|
||||||
|
/* Pins table to be instanciated into variant.cpp */
|
||||||
|
extern PinDescription g_APinDescription[];
|
||||||
|
|
||||||
|
/* moved from wiring_digital.h */
|
||||||
|
extern void digitalChangeDir( uint32_t ulPin, uint8_t direction);
|
||||||
|
/**************************** Extend API by RTK ***********************************/
|
||||||
|
extern uint32_t digitalPinToPort( uint32_t ulPin );
|
||||||
|
extern uint32_t digitalPinToBitMask( uint32_t ulPin );
|
||||||
|
extern uint32_t digitalSetIrqHandler( uint32_t ulPin, void (*handler)(uint32_t id, uint32_t event) );
|
||||||
|
extern uint32_t digitalClearIrqHandler( uint32_t ulPin );
|
||||||
|
extern void pinRemoveMode(uint32_t ulPin);
|
||||||
|
|
||||||
|
/* moved from wiring_analog.h */
|
||||||
|
/*
|
||||||
|
* \brief Set the resolution of analogRead return values. Default is 10 bits (range from 0 to 1023).
|
||||||
|
*
|
||||||
|
* \param res
|
||||||
|
*/
|
||||||
|
extern void analogReadResolution(int res);
|
||||||
|
/*
|
||||||
|
* \brief Set the resolution of analogWrite parameters. Default is 8 bits (range from 0 to 255).
|
||||||
|
*
|
||||||
|
* \param res
|
||||||
|
*/
|
||||||
|
extern void analogWriteResolution(int res);
|
||||||
|
extern void analogOutputInit( void ) ;
|
||||||
|
extern void analogWritePeriod(int us);
|
||||||
|
|
||||||
|
/* moved from wiring_constants.h */
|
||||||
|
// TODO use these correctly in wiring
|
||||||
|
// #define INPUT_PULLDOWN INPUT
|
||||||
|
// #define INPUT_PULLNONE 0x03
|
||||||
|
#define INPUT_IRQ_FALL 0x05
|
||||||
|
#define INPUT_IRQ_RISE 0x06
|
||||||
|
#define INPUT_IRQ_LOW 0x07
|
||||||
|
#define INPUT_IRQ_HIGH 0x08
|
||||||
|
|
||||||
|
#define DEFAULT 1
|
||||||
|
#define EXTERNAL 0
|
||||||
|
|
||||||
|
// undefine stdlib's abs if encountered
|
||||||
|
/* #ifdef abs
|
||||||
|
#undef abs
|
||||||
|
#endif // abs
|
||||||
|
|
||||||
|
#define abs(x) ((x)>0?(x):-(x)) */
|
||||||
|
#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
|
||||||
|
|
||||||
|
extern uint32_t ulPortSetInterruptMask( void );
|
||||||
|
extern void vPortClearInterruptMask( uint32_t ulNewMask );
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern unsigned int GetFlashSize(void); // default 1048576 bytes (1 Mbytes)
|
||||||
|
/* FlashID: manufacturer ID : memory type : memory density
|
||||||
|
0xC22015 - MXIC MX25L1606E, F11AMIM13 (RTL8711AM) module,
|
||||||
|
0xC22014 - MXIC MX25L8006E, RTL00 (RTL8710AF) module */
|
||||||
|
extern unsigned int GetFlashId(void);
|
||||||
@@ -7,7 +7,6 @@
|
|||||||
#define WEBSOCKETCLIENT_H_
|
#define WEBSOCKETCLIENT_H_
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Stream.h>
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "libwsclient.h"
|
#include "libwsclient.h"
|
||||||
#include "wsclient_api.h"
|
#include "wsclient_api.h"
|
||||||
@@ -114,4 +113,4 @@ private:
|
|||||||
wsclient_context *client;
|
wsclient_context *client;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // WEBSOCKETCLIENT_H_
|
#endif // WEBSOCKETCLIENT_H_
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
dtostrf - Emulation for dtostrf function from avr-libc
|
|
||||||
Copyright (c) 2013 Arduino. All rights reserved.
|
|
||||||
Written by Cristian Maglie <c.maglie@arduino.cc>
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char *dtostrf (double val, signed char width, unsigned char prec, char *sout);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
pgmspace.h - Definitions for compatibility with AVR pgmspace macros
|
|
||||||
|
|
||||||
Copyright (c) 2015 Arduino LLC
|
|
||||||
|
|
||||||
Based on work of Paul Stoffregen on Teensy 3 (http://pjrc.com)
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __PGMSPACE_H_
|
|
||||||
#define __PGMSPACE_H_ 1
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#define PROGMEM
|
|
||||||
#define PGM_P const char *
|
|
||||||
#define PSTR(str) (str)
|
|
||||||
|
|
||||||
#define _SFR_BYTE(n) (n)
|
|
||||||
|
|
||||||
typedef void prog_void;
|
|
||||||
typedef char prog_char;
|
|
||||||
typedef unsigned char prog_uchar;
|
|
||||||
typedef int8_t prog_int8_t;
|
|
||||||
typedef uint8_t prog_uint8_t;
|
|
||||||
typedef int16_t prog_int16_t;
|
|
||||||
typedef uint16_t prog_uint16_t;
|
|
||||||
typedef int32_t prog_int32_t;
|
|
||||||
typedef uint32_t prog_uint32_t;
|
|
||||||
|
|
||||||
#define memcpy_P(dest, src, num) memcpy((dest), (src), (num))
|
|
||||||
#define strcpy_P(dest, src) strcpy((dest), (src))
|
|
||||||
#define strcat_P(dest, src) strcat((dest), (src))
|
|
||||||
#define strcmp_P(a, b) strcmp((a), (b))
|
|
||||||
#define strstr_P(a, b) strstr((a), (b))
|
|
||||||
#define strlen_P(a) strlen((a))
|
|
||||||
#define sprintf_P(s, f, ...) sprintf((s), (f), __VA_ARGS__)
|
|
||||||
|
|
||||||
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
|
|
||||||
#define pgm_read_word(addr) (*(const unsigned short *)(addr))
|
|
||||||
#define pgm_read_dword(addr) (*(const unsigned long *)(addr))
|
|
||||||
#define pgm_read_float(addr) (*(const float *)(addr))
|
|
||||||
|
|
||||||
#define pgm_read_byte_near(addr) pgm_read_byte(addr)
|
|
||||||
#define pgm_read_word_near(addr) pgm_read_word(addr)
|
|
||||||
#define pgm_read_dword_near(addr) pgm_read_dword(addr)
|
|
||||||
#define pgm_read_float_near(addr) pgm_read_float(addr)
|
|
||||||
#define pgm_read_byte_far(addr) pgm_read_byte(addr)
|
|
||||||
#define pgm_read_word_far(addr) pgm_read_word(addr)
|
|
||||||
#define pgm_read_dword_far(addr) pgm_read_dword(addr)
|
|
||||||
#define pgm_read_float_far(addr) pgm_read_float(addr)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,534 +0,0 @@
|
|||||||
/*
|
|
||||||
binary.h - Definitions for binary constants
|
|
||||||
Copyright (c) 2006 David A. Mellis. All right 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.
|
|
||||||
|
|
||||||
This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Binary_h
|
|
||||||
#define Binary_h
|
|
||||||
|
|
||||||
#define B0 0
|
|
||||||
#define B00 0
|
|
||||||
#define B000 0
|
|
||||||
#define B0000 0
|
|
||||||
#define B00000 0
|
|
||||||
#define B000000 0
|
|
||||||
#define B0000000 0
|
|
||||||
#define B00000000 0
|
|
||||||
#define B1 1
|
|
||||||
#define B01 1
|
|
||||||
#define B001 1
|
|
||||||
#define B0001 1
|
|
||||||
#define B00001 1
|
|
||||||
#define B000001 1
|
|
||||||
#define B0000001 1
|
|
||||||
#define B00000001 1
|
|
||||||
#define B10 2
|
|
||||||
#define B010 2
|
|
||||||
#define B0010 2
|
|
||||||
#define B00010 2
|
|
||||||
#define B000010 2
|
|
||||||
#define B0000010 2
|
|
||||||
#define B00000010 2
|
|
||||||
#define B11 3
|
|
||||||
#define B011 3
|
|
||||||
#define B0011 3
|
|
||||||
#define B00011 3
|
|
||||||
#define B000011 3
|
|
||||||
#define B0000011 3
|
|
||||||
#define B00000011 3
|
|
||||||
#define B100 4
|
|
||||||
#define B0100 4
|
|
||||||
#define B00100 4
|
|
||||||
#define B000100 4
|
|
||||||
#define B0000100 4
|
|
||||||
#define B00000100 4
|
|
||||||
#define B101 5
|
|
||||||
#define B0101 5
|
|
||||||
#define B00101 5
|
|
||||||
#define B000101 5
|
|
||||||
#define B0000101 5
|
|
||||||
#define B00000101 5
|
|
||||||
#define B110 6
|
|
||||||
#define B0110 6
|
|
||||||
#define B00110 6
|
|
||||||
#define B000110 6
|
|
||||||
#define B0000110 6
|
|
||||||
#define B00000110 6
|
|
||||||
#define B111 7
|
|
||||||
#define B0111 7
|
|
||||||
#define B00111 7
|
|
||||||
#define B000111 7
|
|
||||||
#define B0000111 7
|
|
||||||
#define B00000111 7
|
|
||||||
#define B1000 8
|
|
||||||
#define B01000 8
|
|
||||||
#define B001000 8
|
|
||||||
#define B0001000 8
|
|
||||||
#define B00001000 8
|
|
||||||
#define B1001 9
|
|
||||||
#define B01001 9
|
|
||||||
#define B001001 9
|
|
||||||
#define B0001001 9
|
|
||||||
#define B00001001 9
|
|
||||||
#define B1010 10
|
|
||||||
#define B01010 10
|
|
||||||
#define B001010 10
|
|
||||||
#define B0001010 10
|
|
||||||
#define B00001010 10
|
|
||||||
#define B1011 11
|
|
||||||
#define B01011 11
|
|
||||||
#define B001011 11
|
|
||||||
#define B0001011 11
|
|
||||||
#define B00001011 11
|
|
||||||
#define B1100 12
|
|
||||||
#define B01100 12
|
|
||||||
#define B001100 12
|
|
||||||
#define B0001100 12
|
|
||||||
#define B00001100 12
|
|
||||||
#define B1101 13
|
|
||||||
#define B01101 13
|
|
||||||
#define B001101 13
|
|
||||||
#define B0001101 13
|
|
||||||
#define B00001101 13
|
|
||||||
#define B1110 14
|
|
||||||
#define B01110 14
|
|
||||||
#define B001110 14
|
|
||||||
#define B0001110 14
|
|
||||||
#define B00001110 14
|
|
||||||
#define B1111 15
|
|
||||||
#define B01111 15
|
|
||||||
#define B001111 15
|
|
||||||
#define B0001111 15
|
|
||||||
#define B00001111 15
|
|
||||||
#define B10000 16
|
|
||||||
#define B010000 16
|
|
||||||
#define B0010000 16
|
|
||||||
#define B00010000 16
|
|
||||||
#define B10001 17
|
|
||||||
#define B010001 17
|
|
||||||
#define B0010001 17
|
|
||||||
#define B00010001 17
|
|
||||||
#define B10010 18
|
|
||||||
#define B010010 18
|
|
||||||
#define B0010010 18
|
|
||||||
#define B00010010 18
|
|
||||||
#define B10011 19
|
|
||||||
#define B010011 19
|
|
||||||
#define B0010011 19
|
|
||||||
#define B00010011 19
|
|
||||||
#define B10100 20
|
|
||||||
#define B010100 20
|
|
||||||
#define B0010100 20
|
|
||||||
#define B00010100 20
|
|
||||||
#define B10101 21
|
|
||||||
#define B010101 21
|
|
||||||
#define B0010101 21
|
|
||||||
#define B00010101 21
|
|
||||||
#define B10110 22
|
|
||||||
#define B010110 22
|
|
||||||
#define B0010110 22
|
|
||||||
#define B00010110 22
|
|
||||||
#define B10111 23
|
|
||||||
#define B010111 23
|
|
||||||
#define B0010111 23
|
|
||||||
#define B00010111 23
|
|
||||||
#define B11000 24
|
|
||||||
#define B011000 24
|
|
||||||
#define B0011000 24
|
|
||||||
#define B00011000 24
|
|
||||||
#define B11001 25
|
|
||||||
#define B011001 25
|
|
||||||
#define B0011001 25
|
|
||||||
#define B00011001 25
|
|
||||||
#define B11010 26
|
|
||||||
#define B011010 26
|
|
||||||
#define B0011010 26
|
|
||||||
#define B00011010 26
|
|
||||||
#define B11011 27
|
|
||||||
#define B011011 27
|
|
||||||
#define B0011011 27
|
|
||||||
#define B00011011 27
|
|
||||||
#define B11100 28
|
|
||||||
#define B011100 28
|
|
||||||
#define B0011100 28
|
|
||||||
#define B00011100 28
|
|
||||||
#define B11101 29
|
|
||||||
#define B011101 29
|
|
||||||
#define B0011101 29
|
|
||||||
#define B00011101 29
|
|
||||||
#define B11110 30
|
|
||||||
#define B011110 30
|
|
||||||
#define B0011110 30
|
|
||||||
#define B00011110 30
|
|
||||||
#define B11111 31
|
|
||||||
#define B011111 31
|
|
||||||
#define B0011111 31
|
|
||||||
#define B00011111 31
|
|
||||||
#define B100000 32
|
|
||||||
#define B0100000 32
|
|
||||||
#define B00100000 32
|
|
||||||
#define B100001 33
|
|
||||||
#define B0100001 33
|
|
||||||
#define B00100001 33
|
|
||||||
#define B100010 34
|
|
||||||
#define B0100010 34
|
|
||||||
#define B00100010 34
|
|
||||||
#define B100011 35
|
|
||||||
#define B0100011 35
|
|
||||||
#define B00100011 35
|
|
||||||
#define B100100 36
|
|
||||||
#define B0100100 36
|
|
||||||
#define B00100100 36
|
|
||||||
#define B100101 37
|
|
||||||
#define B0100101 37
|
|
||||||
#define B00100101 37
|
|
||||||
#define B100110 38
|
|
||||||
#define B0100110 38
|
|
||||||
#define B00100110 38
|
|
||||||
#define B100111 39
|
|
||||||
#define B0100111 39
|
|
||||||
#define B00100111 39
|
|
||||||
#define B101000 40
|
|
||||||
#define B0101000 40
|
|
||||||
#define B00101000 40
|
|
||||||
#define B101001 41
|
|
||||||
#define B0101001 41
|
|
||||||
#define B00101001 41
|
|
||||||
#define B101010 42
|
|
||||||
#define B0101010 42
|
|
||||||
#define B00101010 42
|
|
||||||
#define B101011 43
|
|
||||||
#define B0101011 43
|
|
||||||
#define B00101011 43
|
|
||||||
#define B101100 44
|
|
||||||
#define B0101100 44
|
|
||||||
#define B00101100 44
|
|
||||||
#define B101101 45
|
|
||||||
#define B0101101 45
|
|
||||||
#define B00101101 45
|
|
||||||
#define B101110 46
|
|
||||||
#define B0101110 46
|
|
||||||
#define B00101110 46
|
|
||||||
#define B101111 47
|
|
||||||
#define B0101111 47
|
|
||||||
#define B00101111 47
|
|
||||||
#define B110000 48
|
|
||||||
#define B0110000 48
|
|
||||||
#define B00110000 48
|
|
||||||
#define B110001 49
|
|
||||||
#define B0110001 49
|
|
||||||
#define B00110001 49
|
|
||||||
#define B110010 50
|
|
||||||
#define B0110010 50
|
|
||||||
#define B00110010 50
|
|
||||||
#define B110011 51
|
|
||||||
#define B0110011 51
|
|
||||||
#define B00110011 51
|
|
||||||
#define B110100 52
|
|
||||||
#define B0110100 52
|
|
||||||
#define B00110100 52
|
|
||||||
#define B110101 53
|
|
||||||
#define B0110101 53
|
|
||||||
#define B00110101 53
|
|
||||||
#define B110110 54
|
|
||||||
#define B0110110 54
|
|
||||||
#define B00110110 54
|
|
||||||
#define B110111 55
|
|
||||||
#define B0110111 55
|
|
||||||
#define B00110111 55
|
|
||||||
#define B111000 56
|
|
||||||
#define B0111000 56
|
|
||||||
#define B00111000 56
|
|
||||||
#define B111001 57
|
|
||||||
#define B0111001 57
|
|
||||||
#define B00111001 57
|
|
||||||
#define B111010 58
|
|
||||||
#define B0111010 58
|
|
||||||
#define B00111010 58
|
|
||||||
#define B111011 59
|
|
||||||
#define B0111011 59
|
|
||||||
#define B00111011 59
|
|
||||||
#define B111100 60
|
|
||||||
#define B0111100 60
|
|
||||||
#define B00111100 60
|
|
||||||
#define B111101 61
|
|
||||||
#define B0111101 61
|
|
||||||
#define B00111101 61
|
|
||||||
#define B111110 62
|
|
||||||
#define B0111110 62
|
|
||||||
#define B00111110 62
|
|
||||||
#define B111111 63
|
|
||||||
#define B0111111 63
|
|
||||||
#define B00111111 63
|
|
||||||
#define B1000000 64
|
|
||||||
#define B01000000 64
|
|
||||||
#define B1000001 65
|
|
||||||
#define B01000001 65
|
|
||||||
#define B1000010 66
|
|
||||||
#define B01000010 66
|
|
||||||
#define B1000011 67
|
|
||||||
#define B01000011 67
|
|
||||||
#define B1000100 68
|
|
||||||
#define B01000100 68
|
|
||||||
#define B1000101 69
|
|
||||||
#define B01000101 69
|
|
||||||
#define B1000110 70
|
|
||||||
#define B01000110 70
|
|
||||||
#define B1000111 71
|
|
||||||
#define B01000111 71
|
|
||||||
#define B1001000 72
|
|
||||||
#define B01001000 72
|
|
||||||
#define B1001001 73
|
|
||||||
#define B01001001 73
|
|
||||||
#define B1001010 74
|
|
||||||
#define B01001010 74
|
|
||||||
#define B1001011 75
|
|
||||||
#define B01001011 75
|
|
||||||
#define B1001100 76
|
|
||||||
#define B01001100 76
|
|
||||||
#define B1001101 77
|
|
||||||
#define B01001101 77
|
|
||||||
#define B1001110 78
|
|
||||||
#define B01001110 78
|
|
||||||
#define B1001111 79
|
|
||||||
#define B01001111 79
|
|
||||||
#define B1010000 80
|
|
||||||
#define B01010000 80
|
|
||||||
#define B1010001 81
|
|
||||||
#define B01010001 81
|
|
||||||
#define B1010010 82
|
|
||||||
#define B01010010 82
|
|
||||||
#define B1010011 83
|
|
||||||
#define B01010011 83
|
|
||||||
#define B1010100 84
|
|
||||||
#define B01010100 84
|
|
||||||
#define B1010101 85
|
|
||||||
#define B01010101 85
|
|
||||||
#define B1010110 86
|
|
||||||
#define B01010110 86
|
|
||||||
#define B1010111 87
|
|
||||||
#define B01010111 87
|
|
||||||
#define B1011000 88
|
|
||||||
#define B01011000 88
|
|
||||||
#define B1011001 89
|
|
||||||
#define B01011001 89
|
|
||||||
#define B1011010 90
|
|
||||||
#define B01011010 90
|
|
||||||
#define B1011011 91
|
|
||||||
#define B01011011 91
|
|
||||||
#define B1011100 92
|
|
||||||
#define B01011100 92
|
|
||||||
#define B1011101 93
|
|
||||||
#define B01011101 93
|
|
||||||
#define B1011110 94
|
|
||||||
#define B01011110 94
|
|
||||||
#define B1011111 95
|
|
||||||
#define B01011111 95
|
|
||||||
#define B1100000 96
|
|
||||||
#define B01100000 96
|
|
||||||
#define B1100001 97
|
|
||||||
#define B01100001 97
|
|
||||||
#define B1100010 98
|
|
||||||
#define B01100010 98
|
|
||||||
#define B1100011 99
|
|
||||||
#define B01100011 99
|
|
||||||
#define B1100100 100
|
|
||||||
#define B01100100 100
|
|
||||||
#define B1100101 101
|
|
||||||
#define B01100101 101
|
|
||||||
#define B1100110 102
|
|
||||||
#define B01100110 102
|
|
||||||
#define B1100111 103
|
|
||||||
#define B01100111 103
|
|
||||||
#define B1101000 104
|
|
||||||
#define B01101000 104
|
|
||||||
#define B1101001 105
|
|
||||||
#define B01101001 105
|
|
||||||
#define B1101010 106
|
|
||||||
#define B01101010 106
|
|
||||||
#define B1101011 107
|
|
||||||
#define B01101011 107
|
|
||||||
#define B1101100 108
|
|
||||||
#define B01101100 108
|
|
||||||
#define B1101101 109
|
|
||||||
#define B01101101 109
|
|
||||||
#define B1101110 110
|
|
||||||
#define B01101110 110
|
|
||||||
#define B1101111 111
|
|
||||||
#define B01101111 111
|
|
||||||
#define B1110000 112
|
|
||||||
#define B01110000 112
|
|
||||||
#define B1110001 113
|
|
||||||
#define B01110001 113
|
|
||||||
#define B1110010 114
|
|
||||||
#define B01110010 114
|
|
||||||
#define B1110011 115
|
|
||||||
#define B01110011 115
|
|
||||||
#define B1110100 116
|
|
||||||
#define B01110100 116
|
|
||||||
#define B1110101 117
|
|
||||||
#define B01110101 117
|
|
||||||
#define B1110110 118
|
|
||||||
#define B01110110 118
|
|
||||||
#define B1110111 119
|
|
||||||
#define B01110111 119
|
|
||||||
#define B1111000 120
|
|
||||||
#define B01111000 120
|
|
||||||
#define B1111001 121
|
|
||||||
#define B01111001 121
|
|
||||||
#define B1111010 122
|
|
||||||
#define B01111010 122
|
|
||||||
#define B1111011 123
|
|
||||||
#define B01111011 123
|
|
||||||
#define B1111100 124
|
|
||||||
#define B01111100 124
|
|
||||||
#define B1111101 125
|
|
||||||
#define B01111101 125
|
|
||||||
#define B1111110 126
|
|
||||||
#define B01111110 126
|
|
||||||
#define B1111111 127
|
|
||||||
#define B01111111 127
|
|
||||||
#define B10000000 128
|
|
||||||
#define B10000001 129
|
|
||||||
#define B10000010 130
|
|
||||||
#define B10000011 131
|
|
||||||
#define B10000100 132
|
|
||||||
#define B10000101 133
|
|
||||||
#define B10000110 134
|
|
||||||
#define B10000111 135
|
|
||||||
#define B10001000 136
|
|
||||||
#define B10001001 137
|
|
||||||
#define B10001010 138
|
|
||||||
#define B10001011 139
|
|
||||||
#define B10001100 140
|
|
||||||
#define B10001101 141
|
|
||||||
#define B10001110 142
|
|
||||||
#define B10001111 143
|
|
||||||
#define B10010000 144
|
|
||||||
#define B10010001 145
|
|
||||||
#define B10010010 146
|
|
||||||
#define B10010011 147
|
|
||||||
#define B10010100 148
|
|
||||||
#define B10010101 149
|
|
||||||
#define B10010110 150
|
|
||||||
#define B10010111 151
|
|
||||||
#define B10011000 152
|
|
||||||
#define B10011001 153
|
|
||||||
#define B10011010 154
|
|
||||||
#define B10011011 155
|
|
||||||
#define B10011100 156
|
|
||||||
#define B10011101 157
|
|
||||||
#define B10011110 158
|
|
||||||
#define B10011111 159
|
|
||||||
#define B10100000 160
|
|
||||||
#define B10100001 161
|
|
||||||
#define B10100010 162
|
|
||||||
#define B10100011 163
|
|
||||||
#define B10100100 164
|
|
||||||
#define B10100101 165
|
|
||||||
#define B10100110 166
|
|
||||||
#define B10100111 167
|
|
||||||
#define B10101000 168
|
|
||||||
#define B10101001 169
|
|
||||||
#define B10101010 170
|
|
||||||
#define B10101011 171
|
|
||||||
#define B10101100 172
|
|
||||||
#define B10101101 173
|
|
||||||
#define B10101110 174
|
|
||||||
#define B10101111 175
|
|
||||||
#define B10110000 176
|
|
||||||
#define B10110001 177
|
|
||||||
#define B10110010 178
|
|
||||||
#define B10110011 179
|
|
||||||
#define B10110100 180
|
|
||||||
#define B10110101 181
|
|
||||||
#define B10110110 182
|
|
||||||
#define B10110111 183
|
|
||||||
#define B10111000 184
|
|
||||||
#define B10111001 185
|
|
||||||
#define B10111010 186
|
|
||||||
#define B10111011 187
|
|
||||||
#define B10111100 188
|
|
||||||
#define B10111101 189
|
|
||||||
#define B10111110 190
|
|
||||||
#define B10111111 191
|
|
||||||
#define B11000000 192
|
|
||||||
#define B11000001 193
|
|
||||||
#define B11000010 194
|
|
||||||
#define B11000011 195
|
|
||||||
#define B11000100 196
|
|
||||||
#define B11000101 197
|
|
||||||
#define B11000110 198
|
|
||||||
#define B11000111 199
|
|
||||||
#define B11001000 200
|
|
||||||
#define B11001001 201
|
|
||||||
#define B11001010 202
|
|
||||||
#define B11001011 203
|
|
||||||
#define B11001100 204
|
|
||||||
#define B11001101 205
|
|
||||||
#define B11001110 206
|
|
||||||
#define B11001111 207
|
|
||||||
#define B11010000 208
|
|
||||||
#define B11010001 209
|
|
||||||
#define B11010010 210
|
|
||||||
#define B11010011 211
|
|
||||||
#define B11010100 212
|
|
||||||
#define B11010101 213
|
|
||||||
#define B11010110 214
|
|
||||||
#define B11010111 215
|
|
||||||
#define B11011000 216
|
|
||||||
#define B11011001 217
|
|
||||||
#define B11011010 218
|
|
||||||
#define B11011011 219
|
|
||||||
#define B11011100 220
|
|
||||||
#define B11011101 221
|
|
||||||
#define B11011110 222
|
|
||||||
#define B11011111 223
|
|
||||||
#define B11100000 224
|
|
||||||
#define B11100001 225
|
|
||||||
#define B11100010 226
|
|
||||||
#define B11100011 227
|
|
||||||
#define B11100100 228
|
|
||||||
#define B11100101 229
|
|
||||||
#define B11100110 230
|
|
||||||
#define B11100111 231
|
|
||||||
#define B11101000 232
|
|
||||||
#define B11101001 233
|
|
||||||
#define B11101010 234
|
|
||||||
#define B11101011 235
|
|
||||||
#define B11101100 236
|
|
||||||
#define B11101101 237
|
|
||||||
#define B11101110 238
|
|
||||||
#define B11101111 239
|
|
||||||
#define B11110000 240
|
|
||||||
#define B11110001 241
|
|
||||||
#define B11110010 242
|
|
||||||
#define B11110011 243
|
|
||||||
#define B11110100 244
|
|
||||||
#define B11110101 245
|
|
||||||
#define B11110110 246
|
|
||||||
#define B11110111 247
|
|
||||||
#define B11111000 248
|
|
||||||
#define B11111001 249
|
|
||||||
#define B11111010 250
|
|
||||||
#define B11111011 251
|
|
||||||
#define B11111100 252
|
|
||||||
#define B11111101 253
|
|
||||||
#define B11111110 254
|
|
||||||
#define B11111111 255
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -16,62 +16,14 @@
|
|||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "itoa.h"
|
#include "api/itoa.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"{
|
extern "C"{
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
|
||||||
#if 0
|
extern char* ltoa(long value, char *string, int radix)
|
||||||
/* reverse: reverse string s in place */
|
|
||||||
static void reverse( char s[] )
|
|
||||||
{
|
|
||||||
int i, j ;
|
|
||||||
char c ;
|
|
||||||
|
|
||||||
for ( i = 0, j = strlen(s)-1 ; i < j ; i++, j-- )
|
|
||||||
{
|
|
||||||
c = s[i] ;
|
|
||||||
s[i] = s[j] ;
|
|
||||||
s[j] = c ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* itoa: convert n to characters in s */
|
|
||||||
extern void itoa( int n, char s[] )
|
|
||||||
{
|
|
||||||
int i, sign ;
|
|
||||||
|
|
||||||
if ( (sign = n) < 0 ) /* record sign */
|
|
||||||
{
|
|
||||||
n = -n; /* make n positive */
|
|
||||||
}
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
do
|
|
||||||
{ /* generate digits in reverse order */
|
|
||||||
s[i++] = n % 10 + '0'; /* get next digit */
|
|
||||||
} while ((n /= 10) > 0) ; /* delete it */
|
|
||||||
|
|
||||||
if (sign < 0 )
|
|
||||||
{
|
|
||||||
s[i++] = '-';
|
|
||||||
}
|
|
||||||
|
|
||||||
s[i] = '\0';
|
|
||||||
|
|
||||||
reverse( s ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
extern char* itoa( int value, char *string, int radix )
|
|
||||||
{
|
|
||||||
return ltoa( value, string, radix ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern char* ltoa( long value, char *string, int radix )
|
|
||||||
{
|
{
|
||||||
char tmp[33];
|
char tmp[33];
|
||||||
char *tp = tmp;
|
char *tp = tmp;
|
||||||
@@ -121,12 +73,7 @@ extern char* ltoa( long value, char *string, int radix )
|
|||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern char* utoa( unsigned long value, char *string, int radix )
|
extern char* ultoa(unsigned long value, char *string, int radix)
|
||||||
{
|
|
||||||
return ultoa( value, string, radix ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern char* ultoa( unsigned long value, char *string, int radix )
|
|
||||||
{
|
{
|
||||||
char tmp[33];
|
char tmp[33];
|
||||||
char *tp = tmp;
|
char *tp = tmp;
|
||||||
@@ -163,7 +110,6 @@ extern char* ultoa( unsigned long value, char *string, int radix )
|
|||||||
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
#endif /* 0 */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _ITOA_
|
|
||||||
#define _ITOA_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
extern void itoa( int n, char s[] ) ;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
extern char* itoa( int value, char *string, int radix ) ;
|
|
||||||
extern char* ltoa( long value, char *string, int radix ) ;
|
|
||||||
extern char* utoa( unsigned long value, char *string, int radix ) ;
|
|
||||||
extern char* ultoa( unsigned long value, char *string, int radix ) ;
|
|
||||||
#endif /* 0 */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // _ITOA_
|
|
||||||
@@ -23,18 +23,22 @@
|
|||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif // __cplusplus
|
||||||
#include "rtl8710b.h"
|
|
||||||
extern void HalCpuClkConfig(u8 CpuType);
|
|
||||||
extern void SystemCoreClockUpdate(void);
|
|
||||||
extern void En32KCalibration(void);
|
|
||||||
|
|
||||||
|
#include "rtl8710b.h"
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include "diag.h"
|
#include "diag.h"
|
||||||
|
extern void HalCpuClkConfig(u8 CpuType);
|
||||||
|
extern void SystemCoreClockUpdate(void);
|
||||||
|
extern void En32KCalibration(void);
|
||||||
extern int tcm_heap_freeSpace(void);
|
extern int tcm_heap_freeSpace(void);
|
||||||
extern void console_init(void);
|
extern void console_init(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
osThreadId main_tid = 0;
|
osThreadId main_tid = 0;
|
||||||
|
|
||||||
// Weak empty variant initialization function.
|
// Weak empty variant initialization function.
|
||||||
@@ -42,12 +46,8 @@ osThreadId main_tid = 0;
|
|||||||
void initVariant() __attribute__((weak));
|
void initVariant() __attribute__((weak));
|
||||||
void initVariant() { }
|
void initVariant() { }
|
||||||
|
|
||||||
/*
|
// Initialize C library
|
||||||
* \brief User PreInit of Arduino application
|
extern "C" void __libc_init_array(void);
|
||||||
*/
|
|
||||||
void UserPreInit(void) __attribute__((weak));
|
|
||||||
void UserPreInit(void) { }
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* \brief Init Random()
|
* \brief Init Random()
|
||||||
@@ -70,17 +70,8 @@ void Init_Rand(void)
|
|||||||
*/
|
*/
|
||||||
void main_task( void const *arg )
|
void main_task( void const *arg )
|
||||||
{
|
{
|
||||||
|
|
||||||
setup();
|
setup();
|
||||||
|
|
||||||
/*
|
|
||||||
ConfigDebugErr = -1;
|
|
||||||
ConfigDebugInfo = ~_DBG_SPI_FLASH_;
|
|
||||||
ConfigDebugWarn = -1;
|
|
||||||
CfgSysDebugErr = -1;
|
|
||||||
CfgSysDebugInfo = -1;
|
|
||||||
CfgSysDebugWarn = -1;
|
|
||||||
*/
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
loop();
|
loop();
|
||||||
@@ -95,16 +86,11 @@ void main_task( void const *arg )
|
|||||||
*/
|
*/
|
||||||
int main( void )
|
int main( void )
|
||||||
{
|
{
|
||||||
UserPreInit();
|
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
||||||
initVariant();
|
__libc_init_array();
|
||||||
|
|
||||||
#if 0 // pvvx: add start info
|
initVariant();
|
||||||
vPortFree(pvPortMalloc(4)); // Init RAM heap
|
|
||||||
sys_info();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
osThreadDef(main_task, osPriorityRealtime, 1, 4096*4);
|
osThreadDef(main_task, osPriorityRealtime, 1, 4096*4);
|
||||||
main_tid = osThreadCreate(osThread (main_task), NULL);
|
main_tid = osThreadCreate(osThread (main_task), NULL);
|
||||||
@@ -115,7 +101,3 @@ int main( void )
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -1,165 +0,0 @@
|
|||||||
/*
|
|
||||||
* ROM calls
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _INC_RTL_LIBC_
|
|
||||||
#define _INC_RTL_LIBC_
|
|
||||||
/*
|
|
||||||
#undef malloc
|
|
||||||
#define malloc(size) pvPortMalloc(size)
|
|
||||||
#undef free
|
|
||||||
#define free(pbuf) vPortFree(pbuf)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define atoi(str) prvAtoi(str)
|
|
||||||
|
|
||||||
#define calloc(nelements, elementSize) calloc_freertos(nelements, elementSize)
|
|
||||||
|
|
||||||
#define snprintf rtl_snprintf
|
|
||||||
#define sprintf rtl_sprintf
|
|
||||||
#define printf rtl_printf
|
|
||||||
//#define vprintf rtl_vprintf
|
|
||||||
//#define vsnprintf rtl_vsnprintf
|
|
||||||
//#define vfprintf rtl_vfprintf
|
|
||||||
#define memchr rtl_memchr
|
|
||||||
#define memcmp rtl_memcmp
|
|
||||||
#define memcpy rtl_memcpy
|
|
||||||
#define memmove rtl_memmove
|
|
||||||
#define memset rtl_memset
|
|
||||||
#define strcat rtl_strcat
|
|
||||||
#define strchr rtl_strchr
|
|
||||||
#define strcmp rtl_strcmp
|
|
||||||
#define strcpy rtl_strcpy
|
|
||||||
#define strlen rtl_strlen
|
|
||||||
#define strncat rtl_strncat
|
|
||||||
#define strncmp rtl_strncmp
|
|
||||||
#define strncpy rtl_strncpy
|
|
||||||
#define strstr rtl_strstr
|
|
||||||
#define strsep rtl_strsep
|
|
||||||
#define strtok rtl_strtok
|
|
||||||
|
|
||||||
#define dtoi rtl_dtoi
|
|
||||||
#define dtoui rtl_dtoui
|
|
||||||
#define i2f rtl_i2f
|
|
||||||
#define i2d rtl_i2d
|
|
||||||
#define ui2f rtl_ui2f
|
|
||||||
#define ui2d rtl_ui2d
|
|
||||||
#define itoa rtl_itoa
|
|
||||||
#define ltoa rtl_ltoa
|
|
||||||
#define utoa rtl_utoa
|
|
||||||
#define ultoa rtl_ultoa
|
|
||||||
#define ftol rtl_ftol
|
|
||||||
#define ftod rtl_ftod
|
|
||||||
#define dtof rtl_dtof
|
|
||||||
#define fadd rtl_fadd
|
|
||||||
#define fsub rtl_fsub
|
|
||||||
#define fmul rtl_fmul
|
|
||||||
#define fdiv rtl_fdiv
|
|
||||||
#define dadd rtl_dadd
|
|
||||||
#define dsub rtl_dsub
|
|
||||||
#define dmul rtl_dmul
|
|
||||||
#define ddiv rtl_ddiv
|
|
||||||
#define dcmpeq rtl_dcmpeq
|
|
||||||
#define dcmplt rtl_dcmplt
|
|
||||||
#define dcmple rtl_dcmple
|
|
||||||
#define dcmpgt rtl_dcmpgt
|
|
||||||
#define fcmplt rtl_fcmplt
|
|
||||||
#define fcmpgt rtl_fcmpgt
|
|
||||||
|
|
||||||
#define fabsf rtl_fabsf
|
|
||||||
#define fabs rtl_fabs
|
|
||||||
#define cos_f32 rtl_cos_f32
|
|
||||||
#define sin_f32 rtl_sin_f32
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
extern void *calloc_freertos(size_t nelements, size_t elementSize);
|
|
||||||
// ram_libc.c
|
|
||||||
extern int rtl_snprintf(char *str, size_t size, const char *fmt, ...);
|
|
||||||
extern int rtl_sprintf(char *str, const char *fmt, ...);
|
|
||||||
extern int rtl_printf(const char *fmt, ...);
|
|
||||||
extern int rtl_vprintf(const char *fmt, void *param);
|
|
||||||
extern int rtl_vsnprintf(char *str, size_t size, const char *fmt, void *param);
|
|
||||||
extern int rtl_vfprintf(FILE *fp, const char *fmt0, va_list ap);
|
|
||||||
extern int rtl_memchr(const void *src_void, int c, size_t length);
|
|
||||||
extern int rtl_memcmp(const void *m1, const void *m2, size_t n);
|
|
||||||
extern int rtl_memcpy(void *dst0, const void *src0, size_t len0);
|
|
||||||
extern int rtl_memmove(void *dst_void, const void *src_void, size_t length);
|
|
||||||
extern int rtl_memset(void *m, int c, size_t n);
|
|
||||||
extern char * rtl_strcat(char *s1, const char *s2);
|
|
||||||
extern char * rtl_strchr(const char *s1, int i);
|
|
||||||
extern int rtl_strcmp(const char *s1, const char *s2);
|
|
||||||
extern char * rtl_strcpy(char *dst0, const char *src0);
|
|
||||||
extern int rtl_strlen(const char *str);
|
|
||||||
extern char * rtl_strncat(char *s1, const char *s2, size_t n);
|
|
||||||
extern int rtl_strncmp(const char *s1, const char *s2, size_t n);
|
|
||||||
extern char * rtl_strncpy(char *dst0, const char *src0, size_t count);
|
|
||||||
extern char * rtl_strstr(const char *searchee, const char *lookfor);
|
|
||||||
extern char * rtl_strsep(char **source_ptr, const char *delim);
|
|
||||||
extern char * rtl_strtok(char *s, const char *delim);
|
|
||||||
|
|
||||||
//rtl_eabi_cast_ram.c
|
|
||||||
extern int rtl_dtoi(double d);
|
|
||||||
extern int rtl_dtoui(double d);
|
|
||||||
extern float rtl_i2f(int val);
|
|
||||||
extern int rtl_i2d(int val);
|
|
||||||
extern float rtl_ui2f(unsigned int val);
|
|
||||||
extern int rtl_ui2d(unsigned int val);
|
|
||||||
extern char *rtl_itoa(int value, char *string, int radix);
|
|
||||||
extern char *rtl_ltoa(int value, char *string, int radix);
|
|
||||||
extern char *rtl_utoa(unsigned int value, char *string, int radix);
|
|
||||||
extern char *rtl_ultoa(unsigned int value, char *string, int radix);
|
|
||||||
extern int rtl_ftol(float f);
|
|
||||||
extern int rtl_ftod(float f);
|
|
||||||
extern float rtl_dtof(double d);
|
|
||||||
extern float rtl_fadd(float a, float b);
|
|
||||||
extern float rtl_fsub(float a, float b);
|
|
||||||
extern float rtl_fmul(float a, float b);
|
|
||||||
extern float rtl_fdiv(float a, float b);
|
|
||||||
extern int rtl_dadd(double a, double b);
|
|
||||||
extern int rtl_dsub(double a, double b);
|
|
||||||
extern int rtl_dmul(double a, double b);
|
|
||||||
extern int rtl_ddiv(double a, double b);
|
|
||||||
extern int rtl_dcmpeq(double a, double b);
|
|
||||||
extern int rtl_dcmplt(double a, double b);
|
|
||||||
extern int rtl_dcmple(double a, double b);
|
|
||||||
extern int rtl_dcmpgt(double a, double b);
|
|
||||||
extern int rtl_fcmplt(float a, float b);
|
|
||||||
extern int rtl_fcmpgt(float a, float b);
|
|
||||||
|
|
||||||
// rtl_math_ram.c
|
|
||||||
extern float rtl_fabsf(float a);
|
|
||||||
extern int rtl_fabs(double a);
|
|
||||||
extern float rtl_cos_f32(float a);
|
|
||||||
extern float rtl_sin_f32(float a);
|
|
||||||
|
|
||||||
// ram_pvvx_libc.c
|
|
||||||
extern int snprintf(char *str, size_t size, const char *fmt, ...);
|
|
||||||
extern int sprintf(char *str, const char *fmt, ...);
|
|
||||||
extern int printf(const char *fmt, ...);
|
|
||||||
extern int vprintf(const char *fmt, void *param);
|
|
||||||
extern int vsnprintf(char *str, size_t size, const char *fmt, void *param);
|
|
||||||
extern int vfprintf(FILE *fp, const char *fmt0, va_list ap);
|
|
||||||
extern int memchr(const void *src_void, int c, size_t length);
|
|
||||||
extern int memcmp(const void *m1, const void *m2, size_t n);
|
|
||||||
extern int memcpy(void *dst0, const void *src0, size_t len0);
|
|
||||||
extern int memmove(void *dst_void, const void *src_void, size_t length);
|
|
||||||
extern int memset(void *m, int c, size_t n);
|
|
||||||
extern char * strcat(char *s1, const char *s2);
|
|
||||||
extern char * strchr(const char *s1, int i);
|
|
||||||
extern int strcmp(const char *s1, const char *s2);
|
|
||||||
extern char * strcpy(char *dst0, const char *src0);
|
|
||||||
extern int strlen(const char *str);
|
|
||||||
extern char * strncat(char *s1, const char *s2, size_t n);
|
|
||||||
extern int strncmp(const char *s1, const char *s2, size_t n);
|
|
||||||
extern char * strncpy(char *dst0, const char *src0, size_t count);
|
|
||||||
extern char * strstr(const char *searchee, const char *lookfor);
|
|
||||||
extern char * strsep(char **source_ptr, const char *delim);
|
|
||||||
extern char * strtok(char *s, const char *delim);
|
|
||||||
extern int sscanf(const char *buf, const char *fmt, ...);
|
|
||||||
extern char toupper(char ch);
|
|
||||||
extern int _stricmp (const char *s1, const char *s2);
|
|
||||||
extern unsigned long long __aeabi_llsr(unsigned long long val, unsigned int shift);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // _INC_RTL_LIBC_
|
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
// arduino includes
|
// arduino includes
|
||||||
#include "wl_definitions.h"
|
#include "wl_definitions.h"
|
||||||
#include "wl_types.h"
|
#include "wl_types.h"
|
||||||
#include "wiring.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
#define WiFi_Drv_h
|
#define WiFi_Drv_h
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include "IPAddress.h"
|
#include "api/IPAddress.h"
|
||||||
#include "wl_definitions.h"
|
#include "wl_definitions.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ static __inline uint32_t __get_ipsr__(void)
|
|||||||
return(__regIPSR);
|
return(__regIPSR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void init(void)
|
||||||
|
{
|
||||||
|
// nop
|
||||||
|
}
|
||||||
|
|
||||||
void delay( uint32_t ms )
|
void delay( uint32_t ms )
|
||||||
{
|
{
|
||||||
osStatus ret;
|
osStatus ret;
|
||||||
@@ -47,7 +52,7 @@ void delay( uint32_t ms )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void delayMicroseconds(uint32_t us)
|
void delayMicroseconds(unsigned int us)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
uint32_t t0, tn;
|
uint32_t t0, tn;
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WIRING_
|
|
||||||
#define _WIRING_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
extern void initVariant( void ) ;
|
|
||||||
extern void init( void ) ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Returns the number of milliseconds since the Arduino board began running the current program.
|
|
||||||
*
|
|
||||||
* This number will overflow (go back to zero), after approximately 50 days.
|
|
||||||
*
|
|
||||||
* \return Number of milliseconds since the program started (uint32_t)
|
|
||||||
*/
|
|
||||||
extern uint32_t millis( void ) ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Returns the number of microseconds since the Arduino board began running the current program.
|
|
||||||
*
|
|
||||||
* This number will overflow (go back to zero), after approximately 70 minutes. On 16 MHz Arduino boards
|
|
||||||
* (e.g. Duemilanove and Nano), this function has a resolution of four microseconds (i.e. the value returned is
|
|
||||||
* always a multiple of four). On 8 MHz Arduino boards (e.g. the LilyPad), this function has a resolution
|
|
||||||
* of eight microseconds.
|
|
||||||
*
|
|
||||||
* \note There are 1,000 microseconds in a millisecond and 1,000,000 microseconds in a second.
|
|
||||||
*/
|
|
||||||
extern uint32_t micros( void ) ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Pauses the program for the amount of time (in miliseconds) specified as parameter.
|
|
||||||
* (There are 1000 milliseconds in a second.)
|
|
||||||
*
|
|
||||||
* \param dwMs the number of milliseconds to pause (uint32_t)
|
|
||||||
*/
|
|
||||||
extern void delay( uint32_t dwMs ) ;
|
|
||||||
extern void delayMicroseconds(uint32_t usec);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _WIRING_ */
|
|
||||||
@@ -74,14 +74,14 @@ static inline uint32_t mapResolution(uint32_t value, uint32_t from, uint32_t to)
|
|||||||
return value << (to-from);
|
return value << (to-from);
|
||||||
}
|
}
|
||||||
|
|
||||||
eAnalogReference analog_reference = AR_DEFAULT;
|
uint8_t analog_reference = AR_DEFAULT;
|
||||||
|
|
||||||
void analogReference(eAnalogReference ulMode)
|
void analogReference(uint8_t mode)
|
||||||
{
|
{
|
||||||
analog_reference = ulMode;
|
analog_reference = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t analogRead(uint32_t ulPin)
|
int analogRead(pin_size_t pinNumber)
|
||||||
{
|
{
|
||||||
uint32_t ulValue = 0;
|
uint32_t ulValue = 0;
|
||||||
uint32_t ulChannel;
|
uint32_t ulChannel;
|
||||||
@@ -89,14 +89,14 @@ uint32_t analogRead(uint32_t ulPin)
|
|||||||
float voltage;
|
float voltage;
|
||||||
float adc_value;
|
float adc_value;
|
||||||
|
|
||||||
switch ( ulPin ) {
|
switch ( pinNumber ) {
|
||||||
case A0:
|
case PIN_A0:
|
||||||
if (g_adc_enabled[0] == false)
|
if (g_adc_enabled[0] == false)
|
||||||
{
|
{
|
||||||
analogin_init(&adc1, AD_1);
|
analogin_init(&adc1, AD_1);
|
||||||
g_adc_enabled[0] = true;
|
g_adc_enabled[0] = true;
|
||||||
}
|
}
|
||||||
case A1:
|
case PIN_A1:
|
||||||
if (g_adc_enabled[1] == false)
|
if (g_adc_enabled[1] == false)
|
||||||
{
|
{
|
||||||
analogin_init(&adc2, AD_2);
|
analogin_init(&adc2, AD_2);
|
||||||
@@ -104,7 +104,7 @@ uint32_t analogRead(uint32_t ulPin)
|
|||||||
}
|
}
|
||||||
ret = analogin_read_u16(&adc2);
|
ret = analogin_read_u16(&adc2);
|
||||||
break;
|
break;
|
||||||
case A2:
|
case PIN_A2:
|
||||||
if (g_adc_enabled[2] == false)
|
if (g_adc_enabled[2] == false)
|
||||||
{
|
{
|
||||||
analogin_init(&adc3, AD_3);
|
analogin_init(&adc3, AD_3);
|
||||||
@@ -113,7 +113,7 @@ uint32_t analogRead(uint32_t ulPin)
|
|||||||
ret = analogin_read_u16(&adc3);
|
ret = analogin_read_u16(&adc3);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("%s : ulPin %d wrong\n", __FUNCTION__, ulPin);
|
printf("%s : pinNumber %d wrong\n", __FUNCTION__, pinNumber);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,29 +140,29 @@ void analogOutputInit(void) {
|
|||||||
// hardware support. These are defined in the appropriate
|
// hardware support. These are defined in the appropriate
|
||||||
// pins_*.c file. For the rest of the pins, we default
|
// pins_*.c file. For the rest of the pins, we default
|
||||||
// to digital output.
|
// to digital output.
|
||||||
void analogWrite(uint32_t ulPin, uint32_t ulValue)
|
void analogWrite(pin_size_t pinNumber, int value)
|
||||||
{
|
{
|
||||||
pwmout_t *obj;
|
pwmout_t *obj;
|
||||||
|
|
||||||
if ((g_APinDescription[ulPin].ulPinAttribute & PIO_PWM) == PIO_PWM) {
|
if ((g_APinDescription[pinNumber].ulPinAttribute & PIO_PWM) == PIO_PWM) {
|
||||||
/* Handle */
|
/* Handle */
|
||||||
if ( g_APinDescription[ulPin].ulPinType != PIO_PWM )
|
if ( g_APinDescription[pinNumber].ulPinType != PIO_PWM )
|
||||||
{
|
{
|
||||||
if ( (g_APinDescription[ulPin].ulPinType == PIO_GPIO) || (g_APinDescription[ulPin].ulPinType == PIO_GPIO_IRQ) ) {
|
if ( (g_APinDescription[pinNumber].ulPinType == PIO_GPIO) || (g_APinDescription[pinNumber].ulPinType == PIO_GPIO_IRQ) ) {
|
||||||
pinRemoveMode(ulPin);
|
pinRemoveMode(pinNumber);
|
||||||
}
|
}
|
||||||
gpio_pin_struct[ulPin] = malloc ( sizeof(pwmout_t) );
|
gpio_pin_struct[pinNumber] = malloc ( sizeof(pwmout_t) );
|
||||||
pwmout_t *obj = (pwmout_t *)gpio_pin_struct[ulPin];
|
pwmout_t *obj = (pwmout_t *)gpio_pin_struct[pinNumber];
|
||||||
pwmout_init( obj, g_APinDescription[ulPin].pinname );
|
pwmout_init( obj, g_APinDescription[pinNumber].pinname );
|
||||||
pwmout_period_us( obj, _writePeriod);
|
pwmout_period_us( obj, _writePeriod);
|
||||||
pwmout_write( obj, ulValue * 1.0 / (1<<_writeResolution));
|
pwmout_write( obj, value * 1.0 / (1<<_writeResolution));
|
||||||
g_APinDescription[ulPin].ulPinType = PIO_PWM;
|
g_APinDescription[pinNumber].ulPinType = PIO_PWM;
|
||||||
g_APinDescription[ulPin].ulPinMode = PWM_MODE_ENABLED;
|
g_APinDescription[pinNumber].ulPinMode = PWM_MODE_ENABLED;
|
||||||
} else {
|
} else {
|
||||||
pwmout_t *obj = (pwmout_t *)gpio_pin_struct[ulPin];
|
pwmout_t *obj = (pwmout_t *)gpio_pin_struct[pinNumber];
|
||||||
pwmout_period_us( obj, _writePeriod);
|
pwmout_period_us( obj, _writePeriod);
|
||||||
pwmout_write( obj, ulValue * 1.0 / (1<<_writeResolution));
|
pwmout_write( obj, value * 1.0 / (1<<_writeResolution));
|
||||||
/* if ( g_APinDescription[ulPin].ulPinMode == PWM_MODE_DISABLED ) {
|
/* if ( g_APinDescription[pinNumber].ulPinMode == PWM_MODE_DISABLED ) {
|
||||||
HAL_Pwm_Enable( &obj->pwm_hal_adp );
|
HAL_Pwm_Enable( &obj->pwm_hal_adp );
|
||||||
} */
|
} */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WIRING_ANALOG_
|
|
||||||
#define _WIRING_ANALOG_
|
|
||||||
|
|
||||||
// RTL8710 module do not support ADC/DAC
|
|
||||||
#if 1 // !defined(BOARD_RTL8710)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \brief SAM3 products have only one reference for ADC
|
|
||||||
*/
|
|
||||||
typedef enum _eAnalogReference
|
|
||||||
{
|
|
||||||
AR_DEFAULT,
|
|
||||||
} eAnalogReference ;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \brief Configures the reference voltage used for analog input (i.e. the value used as the top of the input range).
|
|
||||||
* This function is kept only for compatibility with existing AVR based API.
|
|
||||||
*
|
|
||||||
* \param ulMmode Should be set to AR_DEFAULT.
|
|
||||||
*/
|
|
||||||
extern void analogReference( eAnalogReference ulMode ) ;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \brief Writes an analog value (PWM wave) to a pin.
|
|
||||||
*
|
|
||||||
* \param ulPin
|
|
||||||
* \param ulValue
|
|
||||||
*/
|
|
||||||
extern void analogWrite( uint32_t ulPin, uint32_t ulValue ) ;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \brief Reads the value from the specified analog pin.
|
|
||||||
*
|
|
||||||
* \param ulPin
|
|
||||||
*
|
|
||||||
* \return Read value from selected pin, if no error.
|
|
||||||
*/
|
|
||||||
extern uint32_t analogRead( uint32_t ulPin ) ;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \brief Set the resolution of analogRead return values. Default is 10 bits (range from 0 to 1023).
|
|
||||||
*
|
|
||||||
* \param res
|
|
||||||
*/
|
|
||||||
extern void analogReadResolution(int res);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \brief Set the resolution of analogWrite parameters. Default is 8 bits (range from 0 to 255).
|
|
||||||
*
|
|
||||||
* \param res
|
|
||||||
*/
|
|
||||||
extern void analogWriteResolution(int res);
|
|
||||||
|
|
||||||
extern void analogOutputInit( void ) ;
|
|
||||||
|
|
||||||
extern void noTone(uint32_t ulPin);
|
|
||||||
|
|
||||||
extern void analogWritePeriod(int us);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // #if !defined(BOARD_RTL8710)
|
|
||||||
|
|
||||||
#endif /* _WIRING_ANALOG_ */
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WIRING_CONSTANTS_
|
|
||||||
#define _WIRING_CONSTANTS_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#define HIGH 0x1
|
|
||||||
#define LOW 0x0
|
|
||||||
|
|
||||||
#define INPUT_PULLDOWN 0x00
|
|
||||||
#define INPUT INPUT_PULLDOWN
|
|
||||||
#define OUTPUT 0x01
|
|
||||||
#define INPUT_PULLUP 0x02
|
|
||||||
#define INPUT_PULLNONE 0x03
|
|
||||||
#define OUTPUT_OPENDRAIN 0x04
|
|
||||||
#define INPUT_IRQ_FALL 0x05
|
|
||||||
#define INPUT_IRQ_RISE 0x06
|
|
||||||
#define INPUT_IRQ_LOW 0x07
|
|
||||||
#define INPUT_IRQ_HIGH 0x08
|
|
||||||
|
|
||||||
|
|
||||||
#define true 0x1
|
|
||||||
#define false 0x0
|
|
||||||
|
|
||||||
#define PI 3.1415926535897932384626433832795
|
|
||||||
#define HALF_PI 1.5707963267948966192313216916398
|
|
||||||
#define TWO_PI 6.283185307179586476925286766559
|
|
||||||
#define DEG_TO_RAD 0.017453292519943295769236907684886
|
|
||||||
#define RAD_TO_DEG 57.295779513082320876798154814105
|
|
||||||
#define EULER 2.718281828459045235360287471352
|
|
||||||
|
|
||||||
#define SERIAL 0x0
|
|
||||||
#define DISPLAY 0x1
|
|
||||||
|
|
||||||
enum BitOrder {
|
|
||||||
LSBFIRST = 0,
|
|
||||||
MSBFIRST = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
// LOW 0
|
|
||||||
// HIGH 1
|
|
||||||
#define CHANGE 2
|
|
||||||
#define FALLING 3
|
|
||||||
#define RISING 4
|
|
||||||
|
|
||||||
#define DEFAULT 1
|
|
||||||
#define EXTERNAL 0
|
|
||||||
|
|
||||||
// undefine stdlib's abs if encountered
|
|
||||||
#ifdef abs
|
|
||||||
#undef abs
|
|
||||||
#endif // abs
|
|
||||||
|
|
||||||
#ifndef min
|
|
||||||
#define min(a,b) ((a)<(b)?(a):(b))
|
|
||||||
#endif // min
|
|
||||||
|
|
||||||
#ifndef max
|
|
||||||
#define max(a,b) ((a)>(b)?(a):(b))
|
|
||||||
#endif // max
|
|
||||||
|
|
||||||
#define abs(x) ((x)>0?(x):-(x))
|
|
||||||
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
|
|
||||||
#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
|
|
||||||
#define radians(deg) ((deg)*DEG_TO_RAD)
|
|
||||||
#define degrees(rad) ((rad)*RAD_TO_DEG)
|
|
||||||
#define sq(x) ((x)*(x))
|
|
||||||
|
|
||||||
extern uint32_t ulPortSetInterruptMask( void );
|
|
||||||
extern void vPortClearInterruptMask( uint32_t ulNewMask );
|
|
||||||
|
|
||||||
#define interrupts() vPortClearInterruptMask(0)
|
|
||||||
#define noInterrupts() ulPortSetInterruptMask()
|
|
||||||
|
|
||||||
#define lowByte(w) ((uint8_t) ((w) & 0xff))
|
|
||||||
#define highByte(w) ((uint8_t) ((w) >> 8))
|
|
||||||
|
|
||||||
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
|
|
||||||
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
|
|
||||||
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
|
|
||||||
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
|
|
||||||
|
|
||||||
typedef unsigned int word;
|
|
||||||
|
|
||||||
#define bit(b) (1UL << (b))
|
|
||||||
|
|
||||||
// TODO: to be checked
|
|
||||||
typedef uint8_t boolean ;
|
|
||||||
typedef uint8_t byte ;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif /* _WIRING_CONSTANTS_ */
|
|
||||||
@@ -27,8 +27,8 @@ extern "C" {
|
|||||||
#include "gpio_irq_ex_api.h"
|
#include "gpio_irq_ex_api.h"
|
||||||
#include "pwmout_api.h"
|
#include "pwmout_api.h"
|
||||||
|
|
||||||
extern void *gpio_pin_struct[TOTAL_GPIO_PIN_NUM];
|
extern void *gpio_pin_struct[PINS_COUNT];
|
||||||
extern void *gpio_irq_handler_list[TOTAL_GPIO_PIN_NUM];
|
extern void *gpio_irq_handler_list[PINS_COUNT];
|
||||||
|
|
||||||
void gpioIrqHandler(uint32_t id, gpio_irq_event event) {
|
void gpioIrqHandler(uint32_t id, gpio_irq_event event) {
|
||||||
if ( gpio_irq_handler_list[id] != NULL ) {
|
if ( gpio_irq_handler_list[id] != NULL ) {
|
||||||
@@ -36,67 +36,67 @@ void gpioIrqHandler(uint32_t id, gpio_irq_event event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pinMode( uint32_t ulPin, uint32_t ulMode)
|
void pinMode(pin_size_t pinNumber, PinModeArduino pinMode)
|
||||||
{
|
{
|
||||||
void *pGpio_t;
|
void *pGpio_t;
|
||||||
|
|
||||||
if ( ulPin < 0 || ulPin > TOTAL_GPIO_PIN_NUM || (g_APinDescription[ulPin].pinname == NC) )
|
if ( pinNumber < 0 || pinNumber > PINS_COUNT || (g_APinDescription[pinNumber].pinname == NC) )
|
||||||
{
|
{
|
||||||
// Invalid pin
|
// Invalid pin
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (g_APinDescription[ulPin].ulPinType == PIO_GPIO || g_APinDescription[ulPin].ulPinType == PIO_GPIO_IRQ)
|
if ( (g_APinDescription[pinNumber].ulPinType == PIO_GPIO || g_APinDescription[pinNumber].ulPinType == PIO_GPIO_IRQ)
|
||||||
&& g_APinDescription[ulPin].ulPinMode == ulMode)
|
&& g_APinDescription[pinNumber].ulPinMode == pinMode)
|
||||||
{
|
{
|
||||||
// Nothing changes in pin mode
|
// Nothing changes in pin mode
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_APinDescription[ulPin].ulPinType == PIO_PWM ) {
|
if ( g_APinDescription[pinNumber].ulPinType == PIO_PWM ) {
|
||||||
// If this pin has been configured as PWM, then it cannot change to another mode
|
// If this pin has been configured as PWM, then it cannot change to another mode
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_APinDescription[ulPin].ulPinType == PIO_GPIO &&
|
if ( g_APinDescription[pinNumber].ulPinType == PIO_GPIO &&
|
||||||
(ulMode == INPUT_IRQ_FALL || ulMode == INPUT_IRQ_RISE) ) {
|
(pinMode == INPUT_IRQ_FALL || pinMode == INPUT_IRQ_RISE) ) {
|
||||||
// Pin mode changes from gpio_t to gpio_irq_t
|
// Pin mode changes from gpio_t to gpio_irq_t
|
||||||
pinRemoveMode(ulPin);
|
pinRemoveMode(pinNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_APinDescription[ulPin].ulPinType == PIO_GPIO_IRQ &&
|
if ( g_APinDescription[pinNumber].ulPinType == PIO_GPIO_IRQ &&
|
||||||
(ulMode == INPUT || ulMode == OUTPUT || ulMode == INPUT_PULLUP || ulMode == INPUT_PULLNONE || ulMode == OUTPUT_OPENDRAIN) ) {
|
(pinMode == INPUT || pinMode == OUTPUT || pinMode == INPUT_PULLUP || pinMode == INPUT_PULLDOWN || pinMode == OUTPUT_OPENDRAIN) ) {
|
||||||
// Pin mode changes from gpio_irq_t to gpio_t
|
// Pin mode changes from gpio_irq_t to gpio_t
|
||||||
pinRemoveMode(ulPin);
|
pinRemoveMode(pinNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_APinDescription[ulPin].ulPinType == NOT_INITIAL ) {
|
if ( g_APinDescription[pinNumber].ulPinType == NOT_INITIAL ) {
|
||||||
if (ulMode == INPUT_IRQ_FALL || ulMode == INPUT_IRQ_RISE || ulMode == INPUT_IRQ_LOW || ulMode == INPUT_IRQ_HIGH) {
|
if (pinMode == INPUT_IRQ_FALL || pinMode == INPUT_IRQ_RISE || pinMode == INPUT_IRQ_LOW || pinMode == INPUT_IRQ_HIGH) {
|
||||||
gpio_pin_struct[ulPin] = malloc ( sizeof(gpio_irq_t) );
|
gpio_pin_struct[pinNumber] = malloc ( sizeof(gpio_irq_t) );
|
||||||
pGpio_t = gpio_pin_struct[ulPin];
|
pGpio_t = gpio_pin_struct[pinNumber];
|
||||||
gpio_irq_init( pGpio_t, g_APinDescription[ulPin].pinname, gpioIrqHandler, ulPin);
|
gpio_irq_init( pGpio_t, g_APinDescription[pinNumber].pinname, gpioIrqHandler, pinNumber);
|
||||||
g_APinDescription[ulPin].ulPinType = PIO_GPIO_IRQ;
|
g_APinDescription[pinNumber].ulPinType = PIO_GPIO_IRQ;
|
||||||
} else {
|
} else {
|
||||||
gpio_pin_struct[ulPin] = malloc ( sizeof(gpio_t) );
|
gpio_pin_struct[pinNumber] = malloc ( sizeof(gpio_t) );
|
||||||
pGpio_t = gpio_pin_struct[ulPin];
|
pGpio_t = gpio_pin_struct[pinNumber];
|
||||||
gpio_init( pGpio_t, g_APinDescription[ulPin].pinname );
|
gpio_init( pGpio_t, g_APinDescription[pinNumber].pinname );
|
||||||
g_APinDescription[ulPin].ulPinType = PIO_GPIO;
|
g_APinDescription[pinNumber].ulPinType = PIO_GPIO;
|
||||||
}
|
}
|
||||||
g_APinDescription[ulPin].ulPinMode = ulMode;
|
g_APinDescription[pinNumber].ulPinMode = pinMode;
|
||||||
} else {
|
} else {
|
||||||
pGpio_t = gpio_pin_struct[ulPin];
|
pGpio_t = gpio_pin_struct[pinNumber];
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( ulMode )
|
switch ( pinMode )
|
||||||
{
|
{
|
||||||
case INPUT:
|
case INPUT:
|
||||||
gpio_dir( (gpio_t *)pGpio_t, PIN_INPUT );
|
gpio_dir( (gpio_t *)pGpio_t, PIN_INPUT );
|
||||||
gpio_mode( (gpio_t *)pGpio_t, PullDown );
|
gpio_mode( (gpio_t *)pGpio_t, PullNone );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INPUT_PULLNONE:
|
case INPUT_PULLDOWN:
|
||||||
gpio_dir( (gpio_t *)pGpio_t, PIN_INPUT );
|
gpio_dir( (gpio_t *)pGpio_t, PIN_INPUT );
|
||||||
gpio_mode( (gpio_t *)pGpio_t, PullNone );
|
gpio_mode( (gpio_t *)pGpio_t, PullDown );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INPUT_PULLUP:
|
case INPUT_PULLUP:
|
||||||
@@ -139,41 +139,41 @@ void pinMode( uint32_t ulPin, uint32_t ulMode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void digitalWrite( uint32_t ulPin, uint32_t ulVal )
|
void digitalWrite(pin_size_t pinNumber, PinStatus status)
|
||||||
{
|
{
|
||||||
gpio_t *pGpio_t;
|
gpio_t *pGpio_t;
|
||||||
|
|
||||||
if ( ulPin < 0 || ulPin > TOTAL_GPIO_PIN_NUM || (g_APinDescription[ulPin].pinname == NC) )
|
if ( pinNumber < 0 || pinNumber > PINS_COUNT || (g_APinDescription[pinNumber].pinname == NC) )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_APinDescription[ulPin].ulPinType != PIO_GPIO )
|
if ( g_APinDescription[pinNumber].ulPinType != PIO_GPIO )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pGpio_t = (gpio_t *)gpio_pin_struct[ulPin];
|
pGpio_t = (gpio_t *)gpio_pin_struct[pinNumber];
|
||||||
|
|
||||||
gpio_write( pGpio_t, ulVal );
|
gpio_write( pGpio_t, status );
|
||||||
}
|
}
|
||||||
|
|
||||||
int digitalRead( uint32_t ulPin )
|
PinStatus digitalRead(pin_size_t pinNumber)
|
||||||
{
|
{
|
||||||
gpio_t *pGpio_t;
|
gpio_t *pGpio_t;
|
||||||
int pin_status;
|
int pin_status;
|
||||||
|
|
||||||
if ( ulPin < 0 || ulPin > TOTAL_GPIO_PIN_NUM || (g_APinDescription[ulPin].pinname == NC) )
|
if ( pinNumber < 0 || pinNumber > PINS_COUNT || (g_APinDescription[pinNumber].pinname == NC) )
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_APinDescription[ulPin].ulPinType != PIO_GPIO )
|
if ( g_APinDescription[pinNumber].ulPinType != PIO_GPIO )
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pGpio_t = (gpio_t *)gpio_pin_struct[ulPin];
|
pGpio_t = (gpio_t *)gpio_pin_struct[pinNumber];
|
||||||
|
|
||||||
pin_status = gpio_read( pGpio_t );
|
pin_status = gpio_read( pGpio_t );
|
||||||
|
|
||||||
@@ -185,7 +185,7 @@ void digitalChangeDir( uint32_t ulPin, uint8_t direction)
|
|||||||
gpio_t *pGpio_t;
|
gpio_t *pGpio_t;
|
||||||
u32 RegValue;
|
u32 RegValue;
|
||||||
|
|
||||||
if ( ulPin < 0 || ulPin > TOTAL_GPIO_PIN_NUM || (g_APinDescription[ulPin].pinname == NC) )
|
if ( ulPin < 0 || ulPin > PINS_COUNT || (g_APinDescription[ulPin].pinname == NC) )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -206,7 +206,7 @@ uint32_t digitalPinToPort( uint32_t ulPin )
|
|||||||
{
|
{
|
||||||
uint32_t pin_name;
|
uint32_t pin_name;
|
||||||
|
|
||||||
if ( ulPin < 0 || ulPin > TOTAL_GPIO_PIN_NUM || (g_APinDescription[ulPin].pinname == NC) )
|
if ( ulPin < 0 || ulPin > PINS_COUNT || (g_APinDescription[ulPin].pinname == NC) )
|
||||||
{
|
{
|
||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
@@ -219,7 +219,7 @@ uint32_t digitalPinToBitMask( uint32_t ulPin )
|
|||||||
{
|
{
|
||||||
uint32_t pin_name;
|
uint32_t pin_name;
|
||||||
|
|
||||||
if ( ulPin < 0 || ulPin > TOTAL_GPIO_PIN_NUM || (g_APinDescription[ulPin].pinname == NC) )
|
if ( ulPin < 0 || ulPin > PINS_COUNT || (g_APinDescription[ulPin].pinname == NC) )
|
||||||
{
|
{
|
||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WIRING_DIGITAL_
|
|
||||||
#define _WIRING_DIGITAL_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Configures the specified pin to behave either as an input or an output. See the description of digital pins for details.
|
|
||||||
*
|
|
||||||
* \param ulPin The number of the pin whose mode you wish to set
|
|
||||||
* \param ulMode Either INPUT or OUTPUT
|
|
||||||
*/
|
|
||||||
extern void pinMode( uint32_t dwPin, uint32_t dwMode ) ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Write a HIGH or a LOW value to a digital pin.
|
|
||||||
*
|
|
||||||
* If the pin has been configured as an OUTPUT with pinMode(), its voltage will be set to the
|
|
||||||
* corresponding value: 5V (or 3.3V on 3.3V boards) for HIGH, 0V (ground) for LOW.
|
|
||||||
*
|
|
||||||
* If the pin is configured as an INPUT, writing a HIGH value with digitalWrite() will enable an internal
|
|
||||||
* 20K pullup resistor (see the tutorial on digital pins). Writing LOW will disable the pullup. The pullup
|
|
||||||
* resistor is enough to light an LED dimly, so if LEDs appear to work, but very dimly, this is a likely
|
|
||||||
* cause. The remedy is to set the pin to an output with the pinMode() function.
|
|
||||||
*
|
|
||||||
* \note Digital pin PIN_LED is harder to use as a digital input than the other digital pins because it has an LED
|
|
||||||
* and resistor attached to it that's soldered to the board on most boards. If you enable its internal 20k pull-up
|
|
||||||
* resistor, it will hang at around 1.7 V instead of the expected 5V because the onboard LED and series resistor
|
|
||||||
* pull the voltage level down, meaning it always returns LOW. If you must use pin PIN_LED as a digital input, use an
|
|
||||||
* external pull down resistor.
|
|
||||||
*
|
|
||||||
* \param dwPin the pin number
|
|
||||||
* \param dwVal HIGH or LOW
|
|
||||||
*/
|
|
||||||
extern void digitalWrite( uint32_t dwPin, uint32_t dwVal ) ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Reads the value from a specified digital pin, either HIGH or LOW.
|
|
||||||
*
|
|
||||||
* \param ulPin The number of the digital pin you want to read (int)
|
|
||||||
*
|
|
||||||
* \return HIGH or LOW
|
|
||||||
*/
|
|
||||||
extern int digitalRead( uint32_t ulPin ) ;
|
|
||||||
|
|
||||||
extern void digitalChangeDir( uint32_t ulPin, uint8_t direction);
|
|
||||||
/**************************** Extend API by RTK ***********************************/
|
|
||||||
extern uint32_t digitalPinToPort( uint32_t ulPin );
|
|
||||||
extern uint32_t digitalPinToBitMask( uint32_t ulPin );
|
|
||||||
extern uint32_t digitalSetIrqHandler( uint32_t ulPin, void (*handler)(uint32_t id, uint32_t event) );
|
|
||||||
extern uint32_t digitalClearIrqHandler( uint32_t ulPin );
|
|
||||||
extern void pinRemoveMode(uint32_t ulPin);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _WIRING_DIGITAL_ */
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef WiringPrivate_h
|
|
||||||
#define WiringPrivate_h
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Includes Atmel CMSIS
|
|
||||||
//#include <chip.h>
|
|
||||||
|
|
||||||
#include "wiring_constants.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
|
|
||||||
#include "HardwareSerial.h"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -17,8 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
#include "wiring_private.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -35,7 +33,7 @@ extern void *gpio_pin_struct[];
|
|||||||
* or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds
|
* or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds
|
||||||
* to 3 minutes in length, but must be called at least a few dozen microseconds
|
* to 3 minutes in length, but must be called at least a few dozen microseconds
|
||||||
* before the start of the pulse. */
|
* before the start of the pulse. */
|
||||||
extern uint32_t pulseIn( uint32_t ulPin, uint32_t state, uint32_t timeout )
|
extern unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
|
||||||
{
|
{
|
||||||
// cache the port and bit of the pin in order to speed up the
|
// cache the port and bit of the pin in order to speed up the
|
||||||
// pulse width measuring loop and achieve finer resolution. calling
|
// pulse width measuring loop and achieve finer resolution. calling
|
||||||
@@ -44,15 +42,15 @@ extern uint32_t pulseIn( uint32_t ulPin, uint32_t state, uint32_t timeout )
|
|||||||
|
|
||||||
uint32_t start_ticks, cur_ticks;
|
uint32_t start_ticks, cur_ticks;
|
||||||
|
|
||||||
if ( ulPin < 0 || ulPin > TOTAL_GPIO_PIN_NUM || (g_APinDescription[ulPin].pinname == NC) ) return 0;
|
if ( pin < 0 || pin > PINS_COUNT || (g_APinDescription[pin].pinname == NC) ) return 0;
|
||||||
|
|
||||||
/* Handle */
|
/* Handle */
|
||||||
if ( g_APinDescription[ulPin].ulPinType != PIO_GPIO )
|
if ( g_APinDescription[pin].ulPinType != PIO_GPIO )
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pGpio_t = (gpio_t *)gpio_pin_struct[ulPin];
|
pGpio_t = (gpio_t *)gpio_pin_struct[pin];
|
||||||
|
|
||||||
// wait for any previous pulse to end
|
// wait for any previous pulse to end
|
||||||
start_ticks = us_ticker_read();
|
start_ticks = us_ticker_read();
|
||||||
@@ -86,4 +84,3 @@ extern uint32_t pulseIn( uint32_t ulPin, uint32_t state, uint32_t timeout )
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WIRING_PULSE_
|
|
||||||
#define _WIRING_PULSE_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \brief Measures the length (in microseconds) of a pulse on the pin; state is HIGH
|
|
||||||
* or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds
|
|
||||||
* to 3 minutes in length, but must be called at least a few dozen microseconds
|
|
||||||
* before the start of the pulse.
|
|
||||||
*/
|
|
||||||
extern uint32_t pulseIn( uint32_t ulPin, uint32_t ulState, uint32_t ulTimeout = 1000000L );
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _WIRING_PULSE_ */
|
|
||||||
@@ -22,47 +22,47 @@
|
|||||||
extern "C"{
|
extern "C"{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t shiftIn( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder )
|
uint8_t shiftIn(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder)
|
||||||
{
|
{
|
||||||
uint8_t value = 0 ;
|
uint8_t value = 0 ;
|
||||||
uint8_t i ;
|
uint8_t i ;
|
||||||
|
|
||||||
for ( i=0 ; i < 8 ; ++i )
|
for ( i=0 ; i < 8 ; ++i )
|
||||||
{
|
{
|
||||||
digitalWrite( ulClockPin, HIGH ) ;
|
digitalWrite( dataPin, HIGH ) ;
|
||||||
|
|
||||||
if ( ulBitOrder == LSBFIRST )
|
if ( bitOrder == LSBFIRST )
|
||||||
{
|
{
|
||||||
value |= digitalRead( ulDataPin ) << i ;
|
value |= digitalRead( dataPin ) << i ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
value |= digitalRead( ulDataPin ) << (7 - i) ;
|
value |= digitalRead( dataPin ) << (7 - i) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
digitalWrite( ulClockPin, LOW ) ;
|
digitalWrite( clockPin, LOW ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return value ;
|
return value ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shiftOut( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder, uint32_t ulVal )
|
void shiftOut(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder, uint8_t val)
|
||||||
{
|
{
|
||||||
uint8_t i ;
|
uint8_t i ;
|
||||||
|
|
||||||
for ( i=0 ; i < 8 ; i++ )
|
for ( i=0 ; i < 8 ; i++ )
|
||||||
{
|
{
|
||||||
if ( ulBitOrder == LSBFIRST )
|
if ( bitOrder == LSBFIRST )
|
||||||
{
|
{
|
||||||
digitalWrite( ulDataPin, !!(ulVal & (1 << i)) ) ;
|
digitalWrite( dataPin, !!(val & (1 << i)) ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
digitalWrite( ulDataPin, !!(ulVal & (1 << (7 - i))) ) ;
|
digitalWrite( dataPin, !!(val & (1 << (7 - i))) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
digitalWrite( ulClockPin, HIGH ) ;
|
digitalWrite( clockPin, HIGH ) ;
|
||||||
digitalWrite( ulClockPin, LOW ) ;
|
digitalWrite( clockPin, LOW ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2011 Arduino. All right 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.
|
|
||||||
|
|
||||||
This library 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WIRING_SHIFT_
|
|
||||||
#define _WIRING_SHIFT_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \brief
|
|
||||||
*/
|
|
||||||
extern uint32_t shiftIn( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder ) ;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \brief
|
|
||||||
*/
|
|
||||||
extern void shiftOut( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder, uint32_t ulVal ) ;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _WIRING_SHIFT_ */
|
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
#include "variant.h"
|
#include "variant.h"
|
||||||
|
#include "Arduino.h"
|
||||||
#include "gpio_api.h"
|
#include "gpio_api.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -24,12 +25,10 @@ extern "C" {
|
|||||||
|
|
||||||
#include "PinNames.h"
|
#include "PinNames.h"
|
||||||
|
|
||||||
void __libc_init_array(void);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pins descriptions
|
* Pins descriptions
|
||||||
*/
|
*/
|
||||||
PinDescription g_APinDescription[TOTAL_GPIO_PIN_NUM] = {
|
PinDescription g_APinDescription[PINS_COUNT] = {
|
||||||
// D0: UART0_RTS, SPI1_MISO, SPI0_MISO, I2C0_SCL, SD_D0, PWM5, I2S_WS, WAKEUP_2
|
// D0: UART0_RTS, SPI1_MISO, SPI0_MISO, I2C0_SCL, SD_D0, PWM5, I2S_WS, WAKEUP_2
|
||||||
{PA_22, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
|
{PA_22, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
|
||||||
// D1: UART0_CTS, SPI1_CS, SPI0_CS, I2C0_SDA, SD_D3, TIMER5_TRIG, I2S_SD_TX, ADC1
|
// D1: UART0_CTS, SPI1_CS, SPI0_CS, I2C0_SDA, SD_D3, TIMER5_TRIG, I2S_SD_TX, ADC1
|
||||||
@@ -56,19 +55,8 @@ PinDescription g_APinDescription[TOTAL_GPIO_PIN_NUM] = {
|
|||||||
{PA_23, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
|
{PA_23, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
|
||||||
};
|
};
|
||||||
|
|
||||||
void *gpio_pin_struct[TOTAL_GPIO_PIN_NUM] = {NULL};
|
void *gpio_pin_struct[PINS_COUNT] = {NULL};
|
||||||
void *gpio_irq_handler_list[TOTAL_GPIO_PIN_NUM] = {NULL};
|
void *gpio_irq_handler_list[PINS_COUNT] = {NULL};
|
||||||
|
|
||||||
/** The heap API in OS layer */
|
|
||||||
// extern int vPortAddHeapRegion(uint8_t *addr, size_t size);
|
|
||||||
|
|
||||||
// it should be the last symbol in SRAM in link result
|
|
||||||
// extern void *__HeapLimit;
|
|
||||||
|
|
||||||
// it should be the last symbol in SDRAM in link result
|
|
||||||
// extern void *__sdram_bss_end__;
|
|
||||||
|
|
||||||
// extern int HalPinCtrlRtl8195A(int Function, int PinLocation, int Operation);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern C
|
} // extern C
|
||||||
@@ -77,20 +65,11 @@ void *gpio_irq_handler_list[TOTAL_GPIO_PIN_NUM] = {NULL};
|
|||||||
void serialEvent() __attribute__((weak));
|
void serialEvent() __attribute__((weak));
|
||||||
bool Serial_available() __attribute__((weak));
|
bool Serial_available() __attribute__((weak));
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void serialEventRun(void) {
|
void serialEventRun(void) {
|
||||||
if (Serial_available && serialEvent && Serial_available())
|
if (Serial_available && serialEvent && Serial_available())
|
||||||
serialEvent();
|
serialEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
void init(void) {
|
|
||||||
// Initialize C library
|
|
||||||
__libc_init_array();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void wait_for_debug() {
|
void wait_for_debug() {
|
||||||
while (((CoreDebug->DHCSR) & CoreDebug_DHCSR_C_DEBUGEN_Msk) == 0) {
|
while (((CoreDebug->DHCSR) & CoreDebug_DHCSR_C_DEBUGEN_Msk) == 0) {
|
||||||
asm("nop");
|
asm("nop");
|
||||||
|
|||||||
@@ -16,44 +16,71 @@
|
|||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _VARIANT_ARDUINO_AMEBA_
|
#pragma once
|
||||||
#define _VARIANT_ARDUINO_AMEBA_
|
|
||||||
|
|
||||||
#include "Arduino.h"
|
#include <WVariant.h>
|
||||||
#include <stdarg.h>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#include "LOGUARTClass.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Analog pin mapping */
|
// Pins
|
||||||
#define A0 1 // PA_19
|
// ----
|
||||||
#define A1 0 // dummy, this is NOT usable
|
|
||||||
#define A2 5 // PA_20
|
|
||||||
|
|
||||||
// LOGUARTClass
|
// Number of pins defined in PinDescription array
|
||||||
#define UART2_TX PA_30
|
#define PINS_COUNT (12u)
|
||||||
#define UART2_RX PA_29
|
#define NUM_DIGITAL_PINS (12u)
|
||||||
// UARTClassOne
|
#define NUM_ANALOG_INPUTS (2u)
|
||||||
#define UART0_TX PA_23
|
#define NUM_ANALOG_OUTPUTS (0u)
|
||||||
#define UART0_RX PA_18
|
|
||||||
// UARTClassTwo
|
|
||||||
// #define UART3_TX PB_1
|
|
||||||
// #define UART3_RX PB_2
|
|
||||||
|
|
||||||
#define TOTAL_GPIO_PIN_NUM (12)
|
|
||||||
#define TOTAL_PWM_PIN_NUM (9)
|
|
||||||
|
|
||||||
#define LED_BUILTIN 4
|
|
||||||
#define SS 8
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
|
// Low-level pin register query macros
|
||||||
|
// -----------------------------------
|
||||||
#define portOutputRegister(P) ((volatile uint32_t *)(0x40001000 + (P)*0x0C))
|
#define portOutputRegister(P) ((volatile uint32_t *)(0x40001000 + (P)*0x0C))
|
||||||
#define portInputRegister(P) ((volatile uint32_t *)(0x40001050 + (P)*4))
|
#define portInputRegister(P) ((volatile uint32_t *)(0x40001050 + (P)*4))
|
||||||
#define portModeRegister(P) ((volatile uint32_t *)(0x40001004 + (P)*0x0C))
|
#define portModeRegister(P) ((volatile uint32_t *)(0x40001004 + (P)*0x0C))
|
||||||
|
|
||||||
|
// LEDs
|
||||||
|
// ----
|
||||||
|
#define PIN_LED (4u)
|
||||||
|
#define LED_BUILTIN PIN_LED
|
||||||
|
|
||||||
|
// Analog pins
|
||||||
|
// -----------
|
||||||
|
#define PIN_A0 (1u) // PA_19
|
||||||
|
#define PIN_A1 (0u) // dummy, this is NOT usable
|
||||||
|
#define PIN_A2 (5u) // PA_20
|
||||||
|
|
||||||
|
static const uint8_t A0 = PIN_A0;
|
||||||
|
static const uint8_t A1 = PIN_A1;
|
||||||
|
static const uint8_t A2 = PIN_A2;
|
||||||
|
|
||||||
|
// SPI Interfaces
|
||||||
|
// --------------
|
||||||
|
#define SPI_INTERFACES_COUNT 0
|
||||||
|
|
||||||
|
// Wire Interfaces
|
||||||
|
// ---------------
|
||||||
|
#define WIRE_INTERFACES_COUNT 0
|
||||||
|
|
||||||
|
// Serial ports
|
||||||
|
// ------------
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#include "LOGUARTClass.h"
|
||||||
|
extern LOGUARTClass Serial;
|
||||||
|
// LOGUARTClass
|
||||||
|
#define PIN_SERIAL2_RX PA_29
|
||||||
|
#define PIN_SERIAL2_TX PA_30
|
||||||
|
// UARTClassOne
|
||||||
|
#define PIN_SERIAL0_RX PA_18
|
||||||
|
#define PIN_SERIAL0_TX PA_23
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#define SERIAL_PORT_USBVIRTUAL Serial
|
||||||
|
#define SERIAL_PORT_MONITOR Serial
|
||||||
|
#define SERIAL_PORT_HARDWARE Serial
|
||||||
|
#define SERIAL_PORT_HARDWARE_OPEN Serial
|
||||||
|
|
||||||
|
// Misc
|
||||||
|
// ----
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif // __cplusplus
|
||||||
/*
|
/*
|
||||||
* Wait until enter debug mode
|
* Wait until enter debug mode
|
||||||
*
|
*
|
||||||
@@ -61,15 +88,6 @@ extern "C" {
|
|||||||
* Use this function along with J-LINK or other debug tool
|
* Use this function along with J-LINK or other debug tool
|
||||||
**/
|
**/
|
||||||
extern void wait_for_debug();
|
extern void wait_for_debug();
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
extern LOGUARTClass Serial;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _VARIANT_ARDUINO_AMEBA_ */
|
|
||||||
|
|||||||
38
builder/arduino-api.py
Normal file
38
builder/arduino-api.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
from os.path import isdir, join
|
||||||
|
|
||||||
|
from SCons.Script import DefaultEnvironment
|
||||||
|
|
||||||
|
env = DefaultEnvironment()
|
||||||
|
platform = env.PioPlatform()
|
||||||
|
board = env.BoardConfig()
|
||||||
|
|
||||||
|
API_DIR = platform.get_package_dir("framework-arduino-api")
|
||||||
|
assert isdir(API_DIR)
|
||||||
|
|
||||||
|
# Includes
|
||||||
|
env.Prepend(
|
||||||
|
CPPPATH=[
|
||||||
|
# fmt: off
|
||||||
|
join(API_DIR),
|
||||||
|
# fmt: on
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
sources_api = [
|
||||||
|
# fmt: off
|
||||||
|
"+<" + API_DIR + "/api/Common.cpp>",
|
||||||
|
"+<" + API_DIR + "/api/IPAddress.cpp>",
|
||||||
|
"+<" + API_DIR + "/api/PluggableUSB.cpp>",
|
||||||
|
"+<" + API_DIR + "/api/Print.cpp>",
|
||||||
|
"+<" + API_DIR + "/api/Stream.cpp>",
|
||||||
|
"+<" + API_DIR + "/api/String.cpp>",
|
||||||
|
# fmt: on
|
||||||
|
]
|
||||||
|
|
||||||
|
# Arduino API library target
|
||||||
|
target_api = env.BuildLibrary(
|
||||||
|
join("$BUILD_DIR", "arduino_api"),
|
||||||
|
API_DIR,
|
||||||
|
sources_api,
|
||||||
|
)
|
||||||
|
env.Prepend(LIBS=[target_api])
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
from os.path import join, isdir
|
from os.path import isdir, join
|
||||||
|
|
||||||
from SCons.Script import DefaultEnvironment
|
from SCons.Script import DefaultEnvironment
|
||||||
|
|
||||||
env = DefaultEnvironment()
|
env = DefaultEnvironment()
|
||||||
@@ -6,6 +7,7 @@ platform = env.PioPlatform()
|
|||||||
board = env.BoardConfig()
|
board = env.BoardConfig()
|
||||||
|
|
||||||
env.SConscript("realtek-ambz-sdk.py", exports="env")
|
env.SConscript("realtek-ambz-sdk.py", exports="env")
|
||||||
|
env.SConscript("../arduino-api.py", exports="env")
|
||||||
|
|
||||||
mcu = board.get("build.mcu").upper()
|
mcu = board.get("build.mcu").upper()
|
||||||
family = board.get("build.family").upper()
|
family = board.get("build.family").upper()
|
||||||
@@ -102,13 +104,11 @@ sources_core = [
|
|||||||
"+<" + CORE_DIR + "/cores/arduino/b64.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/b64.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/cxxabi-compat.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/cxxabi-compat.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/hooks.c>",
|
"+<" + CORE_DIR + "/cores/arduino/hooks.c>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/IPAddress.cpp>",
|
|
||||||
"+<" + CORE_DIR + "/cores/arduino/itoa.c>",
|
"+<" + CORE_DIR + "/cores/arduino/itoa.c>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/LOGUARTClass.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/LOGUARTClass.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/lwip_info.c>",
|
"+<" + CORE_DIR + "/cores/arduino/lwip_info.c>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/main.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/main.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/PowerManagement.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/PowerManagement.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/Print.cpp>",
|
|
||||||
"+<" + CORE_DIR + "/cores/arduino/RingBuffer.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/RingBuffer.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/rtl_sys.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/rtl_sys.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/server_drv.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/server_drv.cpp>",
|
||||||
@@ -118,7 +118,6 @@ sources_core = [
|
|||||||
"+<" + CORE_DIR + "/cores/arduino/spiffs/spiffs_hydrogen.c>",
|
"+<" + CORE_DIR + "/cores/arduino/spiffs/spiffs_hydrogen.c>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/spiffs/spiffs_nucleus.c>",
|
"+<" + CORE_DIR + "/cores/arduino/spiffs/spiffs_nucleus.c>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/ssl_drv.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/ssl_drv.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/Stream.cpp>",
|
|
||||||
"+<" + CORE_DIR + "/cores/arduino/Tone.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/Tone.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/WebSocketClient.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/WebSocketClient.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/wifi_drv.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/wifi_drv.cpp>",
|
||||||
@@ -131,7 +130,6 @@ sources_core = [
|
|||||||
"+<" + CORE_DIR + "/cores/arduino/wiring_shift.c>",
|
"+<" + CORE_DIR + "/cores/arduino/wiring_shift.c>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/wiring_watchdog.c>",
|
"+<" + CORE_DIR + "/cores/arduino/wiring_watchdog.c>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/WMath.cpp>",
|
"+<" + CORE_DIR + "/cores/arduino/WMath.cpp>",
|
||||||
"+<" + CORE_DIR + "/cores/arduino/WString.cpp>",
|
|
||||||
"+<" + BOARD_DIR + "/variant.cpp>",
|
"+<" + BOARD_DIR + "/variant.cpp>",
|
||||||
# fmt: on
|
# fmt: on
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from os.path import join, isdir
|
from os.path import isdir, join
|
||||||
from SCons.Script import DefaultEnvironment, Builder
|
|
||||||
|
from SCons.Script import Builder, DefaultEnvironment
|
||||||
|
|
||||||
env = DefaultEnvironment()
|
env = DefaultEnvironment()
|
||||||
platform = env.PioPlatform()
|
platform = env.PioPlatform()
|
||||||
@@ -360,6 +361,7 @@ sources = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
# Fixups
|
# Fixups
|
||||||
|
env.Append(CPPPATH=[FIXUPS_DIR])
|
||||||
sources += [
|
sources += [
|
||||||
"+<" + FIXUPS_DIR + "/app_start_patch.c>",
|
"+<" + FIXUPS_DIR + "/app_start_patch.c>",
|
||||||
"+<" + FIXUPS_DIR + "/cmsis_ipsr.c>",
|
"+<" + FIXUPS_DIR + "/cmsis_ipsr.c>",
|
||||||
|
|||||||
15
fixups/realtek-ambz/WCharacterFixup.h
Normal file
15
fixups/realtek-ambz/WCharacterFixup.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/* WCharacter.h uses deprecated isascii() and toascii(),
|
||||||
|
which are available in gnu++11 but not c++11 */
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
#ifdef __STRICT_ANSI__
|
||||||
|
|
||||||
|
inline bool isascii(int c) {
|
||||||
|
return ((c & ~0x7f) != 0 ? false : true);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool toascii(int c) {
|
||||||
|
return (c & 0x7f);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -28,6 +28,14 @@
|
|||||||
"description": "SDK for Ameba1"
|
"description": "SDK for Ameba1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"framework-arduino-api": {
|
||||||
|
"type": "framework",
|
||||||
|
"optional": true,
|
||||||
|
"version": "https://github.com/arduino/ArduinoCore-API",
|
||||||
|
"manifest": {
|
||||||
|
"description": "Hardware independent layer of the Arduino cores"
|
||||||
|
}
|
||||||
|
},
|
||||||
"toolchain-gccarmnoneeabi": {
|
"toolchain-gccarmnoneeabi": {
|
||||||
"type": "toolchain",
|
"type": "toolchain",
|
||||||
"optionalVersions": [
|
"optionalVersions": [
|
||||||
|
|||||||
@@ -73,6 +73,10 @@ class LibretuyaPlatform(PlatformBase):
|
|||||||
if framework.startswith("realtek-ambz"):
|
if framework.startswith("realtek-ambz"):
|
||||||
self.packages["toolchain-gccarmnoneeabi"]["version"] = "~1.50401.0"
|
self.packages["toolchain-gccarmnoneeabi"]["version"] = "~1.50401.0"
|
||||||
|
|
||||||
|
# make ArduinoCore-API required
|
||||||
|
if "arduino" in framework:
|
||||||
|
self.packages["framework-arduino-api"]["optional"] = False
|
||||||
|
|
||||||
# save platform packages for later
|
# save platform packages for later
|
||||||
global libretuya_packages
|
global libretuya_packages
|
||||||
libretuya_packages = self.packages
|
libretuya_packages = self.packages
|
||||||
|
|||||||
Reference in New Issue
Block a user