@@ -4,54 +4,52 @@ | |||
IPAddress::IPAddress() | |||
{ | |||
memset(_address, 0, sizeof(_address)); | |||
_address.dword = 0; | |||
} | |||
IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) | |||
{ | |||
_address[0] = first_octet; | |||
_address[1] = second_octet; | |||
_address[2] = third_octet; | |||
_address[3] = 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) | |||
{ | |||
memcpy(_address, &address, sizeof(_address)); | |||
_address.dword = address; | |||
} | |||
IPAddress::IPAddress(const uint8_t *address) | |||
{ | |||
memcpy(_address, address, sizeof(_address)); | |||
memcpy(_address.bytes, address, sizeof(_address)); | |||
} | |||
IPAddress& IPAddress::operator=(const uint8_t *address) | |||
{ | |||
memcpy(_address, address, sizeof(_address)); | |||
memcpy(_address.bytes, address, sizeof(_address.bytes)); | |||
return *this; | |||
} | |||
IPAddress& IPAddress::operator=(uint32_t address) | |||
{ | |||
memcpy(_address, (const uint8_t *)&address, sizeof(_address)); | |||
_address.dword = address; | |||
return *this; | |||
} | |||
bool IPAddress::operator==(const uint8_t* addr) | |||
{ | |||
return memcmp(addr, _address, sizeof(_address)) == 0; | |||
return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0; | |||
} | |||
size_t IPAddress::printTo(Print& p) const | |||
{ | |||
size_t n = 0; | |||
for (int i =0; i < 3; i++) | |||
{ | |||
n += p.print(_address[i], DEC); | |||
n += p.print('.'); | |||
for (int i= 0; i < 3; i++) { | |||
p.print(_address.bytes[i], DEC); | |||
p.print('.'); | |||
} | |||
n += p.print(_address[3], DEC); | |||
return n; | |||
p.print(_address.bytes[3], DEC); | |||
return 4; | |||
} | |||
#endif |
@@ -32,13 +32,16 @@ | |||
// A class to make it easier to handle and pass around IP addresses | |||
class IPAddress : public Printable { | |||
private: | |||
uint8_t _address[4]; // IPv4 address | |||
private: | |||
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; }; | |||
uint8_t* raw_address() { return _address.bytes; }; | |||
public: | |||
// Constructors | |||
@@ -49,13 +52,13 @@ public: | |||
// 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() { return *((uint32_t*)_address); }; | |||
bool operator==(const IPAddress& addr) { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); }; | |||
operator uint32_t() { return _address.dword; }; | |||
bool operator==(const IPAddress& addr) { return _address.dword == addr._address.dword; }; | |||
bool operator==(const uint8_t* addr); | |||
// Overloaded index operator to allow getting and setting individual octets of the address | |||
uint8_t operator[](int index) const { return _address[index]; }; | |||
uint8_t& operator[](int index) { return _address[index]; }; | |||
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); |
@@ -58,7 +58,7 @@ size_t Print::print(const __FlashStringHelper *ifsh) | |||
{ | |||
uint8_t buffer[32]; | |||
size_t count = 0; | |||
const char PROGMEM *p = (const char PROGMEM *)ifsh; | |||
const char *p = (const char *)ifsh; | |||
unsigned int len = strlen_P(p); | |||
while (len > 0) { | |||
unsigned int nbytes = len; |
@@ -1,57 +1,13 @@ | |||
#if ARDUINO >= 100 | |||
#include "Arduino.h" | |||
#include "IPAddress.h" | |||
IPAddress::IPAddress() | |||
{ | |||
memset(_address, 0, sizeof(_address)); | |||
} | |||
IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) | |||
{ | |||
_address[0] = first_octet; | |||
_address[1] = second_octet; | |||
_address[2] = third_octet; | |||
_address[3] = fourth_octet; | |||
} | |||
IPAddress::IPAddress(uint32_t address) | |||
{ | |||
memcpy(_address, &address, sizeof(_address)); | |||
} | |||
IPAddress::IPAddress(const uint8_t *address) | |||
{ | |||
memcpy(_address, address, sizeof(_address)); | |||
} | |||
IPAddress& IPAddress::operator=(const uint8_t *address) | |||
{ | |||
memcpy(_address, address, sizeof(_address)); | |||
return *this; | |||
} | |||
IPAddress& IPAddress::operator=(uint32_t address) | |||
{ | |||
memcpy(_address, (const uint8_t *)&address, sizeof(_address)); | |||
return *this; | |||
} | |||
bool IPAddress::operator==(const uint8_t* addr) | |||
{ | |||
return memcmp(addr, _address, sizeof(_address)) == 0; | |||
} | |||
size_t IPAddress::printTo(Print& p) const | |||
{ | |||
size_t n = 0; | |||
for (int i =0; i < 3; i++) | |||
{ | |||
n += p.print(_address[i], DEC); | |||
n += p.print('.'); | |||
} | |||
n += p.print(_address[3], DEC); | |||
return n; | |||
int i=0; | |||
while (1) { | |||
p.print(_address.bytes[i], DEC); | |||
if (++i >= 4) return 4; | |||
p.write('.'); | |||
} | |||
} | |||
#endif |
@@ -23,7 +23,6 @@ | |||
* adrianm@mcqn.com 1/1/2011 | |||
*/ | |||
#if ARDUINO >= 100 | |||
#ifndef IPAddress_h | |||
#define IPAddress_h | |||
@@ -33,50 +32,88 @@ | |||
class IPAddress : public Printable { | |||
private: | |||
uint8_t _address[4]; // IPv4 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; }; | |||
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); | |||
// Constructors | |||
IPAddress() { | |||
_address.dword = 0; | |||
} | |||
IPAddress(uint8_t b1, uint8_t b2, uint8_t b3, uint8_t b4) { | |||
_address.bytes[0] = b1; | |||
_address.bytes[1] = b2; | |||
_address.bytes[2] = b3; | |||
_address.bytes[3] = b4; | |||
} | |||
IPAddress(uint32_t address) { | |||
_address.dword = address; | |||
} | |||
IPAddress(const uint8_t *address) { | |||
// TODO: use unaligned read on Cortex-M4 | |||
_address.bytes[0] = *address++; | |||
_address.bytes[1] = *address++; | |||
_address.bytes[2] = *address++; | |||
_address.bytes[3] = *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 () { return _address[0] | (_address[1] << 8) | |||
| (_address[2] << 16) | (_address[3] << 24); } | |||
bool operator==(const IPAddress& addr) { return _address[0] == addr._address[0] | |||
&& _address[1] == addr._address[1] | |||
&& _address[2] == addr._address[2] | |||
&& _address[3] == addr._address[3]; } | |||
bool operator==(const uint8_t* addr); | |||
// 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 () { | |||
return _address.dword; | |||
} | |||
bool operator==(const IPAddress& addr) { | |||
return _address.dword == addr._address.dword; | |||
} | |||
bool operator==(const uint8_t* addr) { | |||
// TODO: use unaligned read on Cortex-M4 | |||
return (_address.bytes[0] == addr[0] | |||
&& _address.bytes[1] == addr[1] | |||
&& _address.bytes[2] == addr[2] | |||
&& _address.bytes[3] == addr[3]); | |||
} | |||
// Overloaded index operator to allow getting and setting individual octets of the address | |||
uint8_t operator[](int index) const { return _address[index]; }; | |||
uint8_t& operator[](int index) { return _address[index]; }; | |||
// 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); | |||
// Overloaded copy operators to allow initialisation of IPAddress objects from other types | |||
IPAddress& operator=(const uint8_t *address) { | |||
// TODO: use unaligned read on Cortex-M4 | |||
_address.bytes[0] = *address++; | |||
_address.bytes[1] = *address++; | |||
_address.bytes[2] = *address++; | |||
_address.bytes[3] = *address++; | |||
return *this; | |||
} | |||
IPAddress& operator=(uint32_t address) { | |||
_address.dword = address; | |||
return *this; | |||
} | |||
virtual size_t printTo(Print& p) const; | |||
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; | |||
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); | |||
const IPAddress INADDR_NONE((uint32_t)0); | |||
#endif | |||
#endif |
@@ -105,7 +105,8 @@ void usb_midi_write_packed(uint32_t n) | |||
} | |||
transmit_previous_timeout = 0; | |||
index = tx_packet->index; | |||
*((uint32_t *)(tx_packet->buf) + index++) = n; | |||
//*((uint32_t *)(tx_packet->buf) + index++) = n; | |||
((uint32_t *)(tx_packet->buf))[index++] = n; | |||
if (index < MIDI_TX_SIZE/4) { | |||
tx_packet->index = index; | |||
} else { | |||
@@ -172,7 +173,8 @@ int usb_midi_read(uint32_t channel) | |||
} | |||
} | |||
index = rx_packet->index; | |||
n = *(uint32_t *)(rx_packet->buf + index); | |||
//n = *(uint32_t *)(rx_packet->buf + index); | |||
n = ((uint32_t *)rx_packet->buf)[index/4]; | |||
//serial_print("midi rx, n="); | |||
//serial_phex32(n); | |||
//serial_print("\n"); |
@@ -371,6 +371,7 @@ ISR(USB_COM_vect) | |||
uint16_t wIndex; | |||
uint16_t wLength; | |||
uint16_t desc_val; | |||
uint32_t baud; | |||
const uint8_t *desc_addr; | |||
uint8_t desc_length; | |||
@@ -488,8 +489,12 @@ ISR(USB_COM_vect) | |||
} | |||
usb_ack_out(); | |||
usb_send_in(); | |||
if (*(long *)cdc_line_coding == 134L) reboot_timer = 15; | |||
if (*(long *)cdc_line_coding == 150L) { | |||
baud = (uint32_t)cdc_line_coding[0] | |||
| ((uint32_t)cdc_line_coding[1] << 8) | |||
| ((uint32_t)cdc_line_coding[2] << 16) | |||
| ((uint32_t)cdc_line_coding[3] << 24); | |||
if (baud == 134UL) reboot_timer = 15; | |||
if (baud == 150UL) { | |||
UENUM = CDC_TX_ENDPOINT; | |||
while (UESTA0X & 0x03) { | |||
UEINTX = 0xFF; |
@@ -409,7 +409,11 @@ void usb_serial_class::send_now(void) | |||
uint32_t usb_serial_class::baud(void) | |||
{ | |||
return *(uint32_t *)cdc_line_coding; | |||
//return *(uint32_t *)cdc_line_coding; | |||
return (uint32_t)cdc_line_coding[0] | |||
| ((uint32_t)cdc_line_coding[1] << 8) | |||
| ((uint32_t)cdc_line_coding[2] << 16) | |||
| ((uint32_t)cdc_line_coding[3] << 24); | |||
} | |||
uint8_t usb_serial_class::stopbits(void) |