Minor header/directrory cleanup (#802)

This commit is contained in:
Earle F. Philhower, III 2022-08-27 13:04:57 -07:00 committed by GitHub
parent 257db5ac7d
commit 064dd4794f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
32 changed files with 1226 additions and 1116 deletions

View file

@ -71,8 +71,6 @@ static int __usb_task_irq;
#define EPNUM_HID 0x83 #define EPNUM_HID 0x83
#define EPNUM_MIDI 0x01
const uint8_t *tud_descriptor_device_cb(void) { const uint8_t *tud_descriptor_device_cb(void) {
static tusb_desc_device_t usbd_desc_device = { static tusb_desc_device_t usbd_desc_device = {
@ -91,7 +89,7 @@ const uint8_t *tud_descriptor_device_cb(void) {
.iSerialNumber = USBD_STR_SERIAL, .iSerialNumber = USBD_STR_SERIAL,
.bNumConfigurations = 1 .bNumConfigurations = 1
}; };
if (__USBInstallSerial && !__USBInstallKeyboard && !__USBInstallMouse && !__USBInstallJoystick && !__USBInstallMIDI) { if (__USBInstallSerial && !__USBInstallKeyboard && !__USBInstallMouse && !__USBInstallJoystick) {
// Can use as-is, this is the default USB case // Can use as-is, this is the default USB case
return (const uint8_t *)&usbd_desc_device; return (const uint8_t *)&usbd_desc_device;
} }
@ -105,9 +103,6 @@ const uint8_t *tud_descriptor_device_cb(void) {
if (__USBInstallJoystick) { if (__USBInstallJoystick) {
usbd_desc_device.idProduct |= 0x0100; usbd_desc_device.idProduct |= 0x0100;
} }
if (__USBInstallMIDI) {
usbd_desc_device.idProduct |= 0x2000;
}
// Set the device class to 0 to indicate multiple device classes // Set the device class to 0 to indicate multiple device classes
usbd_desc_device.bDeviceClass = 0; usbd_desc_device.bDeviceClass = 0;
usbd_desc_device.bDeviceSubClass = 0; usbd_desc_device.bDeviceSubClass = 0;
@ -228,7 +223,7 @@ void __SetupUSBDescriptor() {
if (!usbd_desc_cfg) { if (!usbd_desc_cfg) {
bool hasHID = __USBInstallKeyboard || __USBInstallMouse || __USBInstallJoystick; bool hasHID = __USBInstallKeyboard || __USBInstallMouse || __USBInstallJoystick;
uint8_t interface_count = (__USBInstallSerial ? 2 : 0) + (hasHID ? 1 : 0) + (__USBInstallMIDI ? 2 : 0); uint8_t interface_count = (__USBInstallSerial ? 2 : 0) + (hasHID ? 1 : 0);
uint8_t cdc_desc[TUD_CDC_DESC_LEN] = { uint8_t cdc_desc[TUD_CDC_DESC_LEN] = {
// Interface number, string index, protocol, report descriptor len, EP In & Out address, size & polling interval // Interface number, string index, protocol, report descriptor len, EP In & Out address, size & polling interval
@ -243,13 +238,7 @@ void __SetupUSBDescriptor() {
TUD_HID_DESCRIPTOR(hid_itf, 0, HID_ITF_PROTOCOL_NONE, hid_report_len, EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 10) TUD_HID_DESCRIPTOR(hid_itf, 0, HID_ITF_PROTOCOL_NONE, hid_report_len, EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 10)
}; };
uint8_t midi_itf = hid_itf + (hasHID ? 1 : 0); int usbd_desc_len = TUD_CONFIG_DESC_LEN + (__USBInstallSerial ? sizeof(cdc_desc) : 0) + (hasHID ? sizeof(hid_desc) : 0);
uint8_t midi_desc[TUD_MIDI_DESC_LEN] = {
// Interface number, string index, EP Out & EP In address, EP size
TUD_MIDI_DESCRIPTOR(midi_itf, 0, EPNUM_MIDI, 0x80 | EPNUM_MIDI, 64)
};
int usbd_desc_len = TUD_CONFIG_DESC_LEN + (__USBInstallSerial ? sizeof(cdc_desc) : 0) + (hasHID ? sizeof(hid_desc) : 0) + (__USBInstallMIDI ? sizeof(midi_desc) : 0);
uint8_t tud_cfg_desc[TUD_CONFIG_DESC_LEN] = { uint8_t tud_cfg_desc[TUD_CONFIG_DESC_LEN] = {
// Config number, interface count, string index, total length, attribute, power in mA // Config number, interface count, string index, total length, attribute, power in mA
@ -271,9 +260,6 @@ void __SetupUSBDescriptor() {
memcpy(ptr, hid_desc, sizeof(hid_desc)); memcpy(ptr, hid_desc, sizeof(hid_desc));
ptr += sizeof(hid_desc); ptr += sizeof(hid_desc);
} }
if (__USBInstallMIDI) {
memcpy(ptr, midi_desc, sizeof(midi_desc));
}
} }
} }
} }

View file

@ -26,7 +26,6 @@ extern void __USBInstallSerial() __attribute__((weak));
extern void __USBInstallKeyboard() __attribute__((weak)); extern void __USBInstallKeyboard() __attribute__((weak));
extern void __USBInstallJoystick() __attribute__((weak)); extern void __USBInstallJoystick() __attribute__((weak));
extern void __USBInstallMouse() __attribute__((weak)); extern void __USBInstallMouse() __attribute__((weak));
extern void __USBInstallMIDI() __attribute__((weak));
// Big, global USB mutex, shared with all USB devices to make sure we don't // Big, global USB mutex, shared with all USB devices to make sure we don't
// have multiple cores updating the TUSB state in parallel // have multiple cores updating the TUSB state in parallel

View file

@ -1,3 +1,24 @@
/*
Arduino OTA.cpp - Simple Arduino IDE OTA handler
Modified 2022 Earle F. Philhower, III. All rights reserved.
Taken from the ESP8266 core libraries, (c) various authors.
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 <functional> #include <functional>
#include <WiFiUdp.h> #include <WiFiUdp.h>
#include "ArduinoOTA.h" #include "ArduinoOTA.h"

View file

@ -1,3 +1,24 @@
/*
Arduino OTA.h - Simple Arduino IDE OTA handler
Modified 2022 Earle F. Philhower, III. All rights reserved.
Taken from the ESP8266 core libraries, (c) various authors.
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
*/
#pragma once #pragma once
#include <WiFi.h> #include <WiFi.h>

View file

@ -133,7 +133,9 @@ void loop() {
WiFi.disconnect(); WiFi.disconnect();
} }
} }
if (s == WL_CONNECTED) { MDNS.update(); } if (s == WL_CONNECTED) {
MDNS.update();
}
} }
// Do work: // Do work:
// DNS // DNS

View file

@ -71,7 +71,9 @@ void handleWifi() {
int n = WiFi.scanNetworks(); int n = WiFi.scanNetworks();
Serial.println("scan done"); Serial.println("scan done");
if (n > 0) { if (n > 0) {
for (int i = 0; i < n; i++) { Page += String(F("\r\n<tr><td>SSID ")) + WiFi.SSID(i) + ((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? F(" ") : F(" *")) + F(" (") + WiFi.RSSI(i) + F(")</td></tr>"); } for (int i = 0; i < n; i++) {
Page += String(F("\r\n<tr><td>SSID ")) + WiFi.SSID(i) + ((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? F(" ") : F(" *")) + F(" (") + WiFi.RSSI(i) + F(")</td></tr>");
}
} else { } else {
Page += F("<tr><td>No WLAN found</td></tr>"); Page += F("<tr><td>No WLAN found</td></tr>");
} }
@ -114,7 +116,9 @@ void handleNotFound() {
message += server.args(); message += server.args();
message += F("\n"); message += F("\n");
for (uint8_t i = 0; i < server.args(); i++) { message += String(F(" ")) + server.argName(i) + F(": ") + server.arg(i) + F("\n"); } for (uint8_t i = 0; i < server.args(); i++) {
message += String(F(" ")) + server.argName(i) + F(": ") + server.arg(i) + F("\n");
}
server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
server.sendHeader("Pragma", "no-cache"); server.sendHeader("Pragma", "no-cache");
server.sendHeader("Expires", "-1"); server.sendHeader("Expires", "-1");

View file

@ -2,7 +2,9 @@
boolean isIp(String str) { boolean isIp(String str) {
for (size_t i = 0; i < str.length(); i++) { for (size_t i = 0; i < str.length(); i++) {
int c = str.charAt(i); int c = str.charAt(i);
if (c != '.' && (c < '0' || c > '9')) { return false; } if (c != '.' && (c < '0' || c > '9')) {
return false;
}
} }
return true; return true;
} }
@ -10,7 +12,9 @@ boolean isIp(String str) {
/** IP to String? */ /** IP to String? */
String toStringIp(IPAddress ip) { String toStringIp(IPAddress ip) {
String res = ""; String res = "";
for (int i = 0; i < 3; i++) { res += String((ip >> (8 * i)) & 0xFF) + "."; } for (int i = 0; i < 3; i++) {
res += String((ip >> (8 * i)) & 0xFF) + ".";
}
res += String(((ip >> 8 * 3)) & 0xFF); res += String(((ip >> 8 * 3)) & 0xFF);
return res; return res;
} }

View file

@ -1,10 +1,29 @@
/*
DNSServer.cpp - Simple DNS server for the Pico
Modified 2022 Earle F. Philhower, III. All rights reserved.
Taken from the ESP8266 core libraries, (c) various authors.
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 "WiFi.h" #include "WiFi.h"
#include "DNSServer.h" #include "DNSServer.h"
#include <lwip/def.h> #include <lwip/def.h>
#include <Arduino.h> #include <Arduino.h>
extern struct rst_info resetInfo;
#ifdef DEBUG_ESP_PORT #ifdef DEBUG_ESP_PORT
#define CONSOLE DEBUG_ESP_PORT #define CONSOLE DEBUG_ESP_PORT
#else #else
@ -49,8 +68,7 @@ extern struct rst_info resetInfo;
// Want to keep IDs unique across restarts and continquious // Want to keep IDs unique across restarts and continquious
static uint32_t _ids __attribute__((section(".noinit"))); static uint32_t _ids __attribute__((section(".noinit")));
DNSServer::DNSServer() DNSServer::DNSServer() {
{
// I have observed that using 0 for captive and non-zero (600) when // I have observed that using 0 for captive and non-zero (600) when
// forwarding, will help Android devices recognize the change in connectivity. // forwarding, will help Android devices recognize the change in connectivity.
// They will then report connected. // They will then report connected.
@ -62,8 +80,7 @@ DNSServer::DNSServer()
_errorReplyCode = DNSReplyCode::NonExistentDomain; _errorReplyCode = DNSReplyCode::NonExistentDomain;
} }
void DNSServer::disableForwarder(const String &domainName, bool freeResources) void DNSServer::disableForwarder(const String &domainName, bool freeResources) {
{
_forwarder = false; _forwarder = false;
if (domainName != "") { if (domainName != "") {
_domainName = domainName; _domainName = domainName;
@ -86,8 +103,7 @@ void DNSServer::disableForwarder(const String &domainName, bool freeResources)
} }
} }
bool DNSServer::enableForwarder(const String &domainName, const IPAddress &dns) bool DNSServer::enableForwarder(const String &domainName, const IPAddress &dns) {
{
disableForwarder(domainName, false); // Just happens to have the same logic needed here. disableForwarder(domainName, false); // Just happens to have the same logic needed here.
if (dns.isSet()) { if (dns.isSet()) {
@ -114,8 +130,7 @@ bool DNSServer::enableForwarder(const String &domainName, const IPAddress &dns)
} }
bool DNSServer::start(const uint16_t &port, const String &domainName, bool DNSServer::start(const uint16_t &port, const String &domainName,
const IPAddress &resolvedIP, const IPAddress &dns) const IPAddress &resolvedIP, const IPAddress &dns) {
{
_port = (port) ? port : IANA_DNS_PORT; _port = (port) ? port : IANA_DNS_PORT;
_resolvedIP[0] = resolvedIP[0]; _resolvedIP[0] = resolvedIP[0];
@ -130,36 +145,31 @@ bool DNSServer::start(const uint16_t &port, const String &domainName,
return _udp.begin(_port) == 1; return _udp.begin(_port) == 1;
} }
void DNSServer::setErrorReplyCode(const DNSReplyCode &replyCode) void DNSServer::setErrorReplyCode(const DNSReplyCode &replyCode) {
{
_errorReplyCode = replyCode; _errorReplyCode = replyCode;
} }
void DNSServer::setTTL(const uint32_t &ttl) void DNSServer::setTTL(const uint32_t &ttl) {
{
_ttl = lwip_htonl(ttl); _ttl = lwip_htonl(ttl);
} }
uint32_t DNSServer::getTTL() uint32_t DNSServer::getTTL() {
{
return lwip_ntohl(_ttl); return lwip_ntohl(_ttl);
} }
void DNSServer::stop() void DNSServer::stop() {
{
_udp.stop(); _udp.stop();
disableForwarder("", true); disableForwarder("", true);
} }
void DNSServer::downcaseAndRemoveWwwPrefix(String &domainName) void DNSServer::downcaseAndRemoveWwwPrefix(String &domainName) {
{
domainName.toLowerCase(); domainName.toLowerCase();
if (domainName.startsWith("www.")) if (domainName.startsWith("www.")) {
domainName.remove(0, 4); domainName.remove(0, 4);
}
} }
void DNSServer::forwardReply(uint8_t *buffer, size_t length) void DNSServer::forwardReply(uint8_t *buffer, size_t length) {
{
if (!_forwarder || !_que) { if (!_forwarder || !_que) {
return; return;
} }
@ -186,8 +196,7 @@ void DNSServer::forwardReply(uint8_t *buffer, size_t length)
_que[i].ip = 0; // This gets used to detect duplicate packets and overflow _que[i].ip = 0; // This gets used to detect duplicate packets and overflow
} }
void DNSServer::forwardRequest(uint8_t *buffer, size_t length) void DNSServer::forwardRequest(uint8_t *buffer, size_t length) {
{
if (!_forwarder || !_dns.isSet() || !_que) { if (!_forwarder || !_dns.isSet() || !_que) {
return; return;
} }
@ -209,8 +218,7 @@ void DNSServer::forwardRequest(uint8_t *buffer, size_t length)
DEBUG_PRINTLN2("Forward request ID: 0x", (String(dnsHeader->ID, HEX) + F(" to ") + _dns.toString())); DEBUG_PRINTLN2("Forward request ID: 0x", (String(dnsHeader->ID, HEX) + F(" to ") + _dns.toString()));
} }
bool DNSServer::respondToRequest(uint8_t *buffer, size_t length) bool DNSServer::respondToRequest(uint8_t *buffer, size_t length) {
{
DNSHeader *dnsHeader; DNSHeader *dnsHeader;
uint8_t *query, *start; uint8_t *query, *start;
const char *matchString; const char *matchString;
@ -309,8 +317,9 @@ bool DNSServer::respondToRequest(uint8_t *buffer, size_t length)
start = query; start = query;
// If there's a leading 'www', skip it // If there's a leading 'www', skip it
if (*start == 3 && strncasecmp("www", (char *) start + 1, 3) == 0) if (*start == 3 && strncasecmp("www", (char *) start + 1, 3) == 0) {
start += 4; start += 4;
}
while (*start != 0) { while (*start != 0) {
labelLength = *start; labelLength = *start;
@ -344,48 +353,48 @@ bool DNSServer::respondToRequest(uint8_t *buffer, size_t length)
return false; return false;
} }
void DNSServer::processNextRequest() void DNSServer::processNextRequest() {
{
size_t currentPacketSize; size_t currentPacketSize;
currentPacketSize = _udp.parsePacket(); currentPacketSize = _udp.parsePacket();
if (currentPacketSize == 0) if (currentPacketSize == 0) {
return; return;
}
// The DNS RFC requires that DNS packets be less than 512 bytes in size, // The DNS RFC requires that DNS packets be less than 512 bytes in size,
// so just discard them if they are larger // so just discard them if they are larger
if (currentPacketSize > MAX_DNS_PACKETSIZE) if (currentPacketSize > MAX_DNS_PACKETSIZE) {
return; return;
}
// If the packet size is smaller than the DNS header, then someone is // If the packet size is smaller than the DNS header, then someone is
// messing with us // messing with us
if (currentPacketSize < DNS_HEADER_SIZE) if (currentPacketSize < DNS_HEADER_SIZE) {
return; return;
}
std::unique_ptr<uint8_t[]> buffer(new (std::nothrow) uint8_t[currentPacketSize]); std::unique_ptr<uint8_t[]> buffer(new (std::nothrow) uint8_t[currentPacketSize]);
if (buffer == nullptr) if (buffer == nullptr) {
return; return;
}
_udp.read(buffer.get(), currentPacketSize); _udp.read(buffer.get(), currentPacketSize);
if (_dns.isSet() && _udp.remoteIP() == _dns) { if (_dns.isSet() && _udp.remoteIP() == _dns) {
// _forwarder may have been set to false; however, for now allow in-flight // _forwarder may have been set to false; however, for now allow in-flight
// replies to finish. //?? // replies to finish. //??
forwardReply(buffer.get(), currentPacketSize); forwardReply(buffer.get(), currentPacketSize);
} else } else if (respondToRequest(buffer.get(), currentPacketSize)) {
if (respondToRequest(buffer.get(), currentPacketSize)) {
forwardRequest(buffer.get(), currentPacketSize); forwardRequest(buffer.get(), currentPacketSize);
} }
} }
void DNSServer::writeNBOShort(uint16_t value) void DNSServer::writeNBOShort(uint16_t value) {
{
_udp.write((unsigned char *)&value, 2); _udp.write((unsigned char *)&value, 2);
} }
void DNSServer::replyWithIP(DNSHeader *dnsHeader, void DNSServer::replyWithIP(DNSHeader *dnsHeader,
unsigned char * query, unsigned char * query,
size_t queryLength) size_t queryLength) {
{
uint16_t value; uint16_t value;
dnsHeader->QR = DNS_QR_RESPONSE; dnsHeader->QR = DNS_QR_RESPONSE;
@ -421,27 +430,27 @@ void DNSServer::replyWithIP(DNSHeader *dnsHeader,
void DNSServer::replyWithError(DNSHeader *dnsHeader, void DNSServer::replyWithError(DNSHeader *dnsHeader,
DNSReplyCode rcode, DNSReplyCode rcode,
unsigned char *query, unsigned char *query,
size_t queryLength) size_t queryLength) {
{
dnsHeader->QR = DNS_QR_RESPONSE; dnsHeader->QR = DNS_QR_RESPONSE;
dnsHeader->RCode = (unsigned char) rcode; dnsHeader->RCode = (unsigned char) rcode;
if (query) if (query) {
dnsHeader->QDCount = lwip_htons(1); dnsHeader->QDCount = lwip_htons(1);
else } else {
dnsHeader->QDCount = 0; dnsHeader->QDCount = 0;
}
dnsHeader->ANCount = 0; dnsHeader->ANCount = 0;
dnsHeader->NSCount = 0; dnsHeader->NSCount = 0;
dnsHeader->ARCount = 0; dnsHeader->ARCount = 0;
_udp.beginPacket(_udp.remoteIP(), _udp.remotePort()); _udp.beginPacket(_udp.remoteIP(), _udp.remotePort());
_udp.write((unsigned char *)dnsHeader, sizeof(DNSHeader)); _udp.write((unsigned char *)dnsHeader, sizeof(DNSHeader));
if (query != NULL) if (query != NULL) {
_udp.write(query, queryLength); _udp.write(query, queryLength);
}
_udp.endPacket(); _udp.endPacket();
} }
void DNSServer::replyWithError(DNSHeader *dnsHeader, void DNSServer::replyWithError(DNSHeader *dnsHeader,
DNSReplyCode rcode) DNSReplyCode rcode) {
{
replyWithError(dnsHeader, rcode, NULL, 0); replyWithError(dnsHeader, rcode, NULL, 0);
} }

View file

@ -1,5 +1,25 @@
#ifndef DNSServer_h /*
#define DNSServer_h DNSServer.cwhcpp - Simple DNS server for the Pico
Modified 2022 Earle F. Philhower, III. All rights reserved.
Taken from the ESP8266 core libraries, (c) various authors.
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
*/
#pragma once
#include <memory> #include <memory>
#include <WiFiUdp.h> #include <WiFiUdp.h>
@ -25,8 +45,7 @@ constexpr inline uint16_t kIanaDnsPort = IANA_DNS_PORT;
#define MAX_DNSNAME_LENGTH 253 #define MAX_DNSNAME_LENGTH 253
#define MAX_DNS_PACKETSIZE 512 #define MAX_DNS_PACKETSIZE 512
enum class DNSReplyCode enum class DNSReplyCode {
{
NoError = 0, NoError = 0,
FormError = 1, FormError = 1,
ServerFailure = 2, ServerFailure = 2,
@ -38,8 +57,7 @@ enum class DNSReplyCode
NXRRSet = 8 NXRRSet = 8
}; };
struct DNSHeader struct DNSHeader {
{
uint16_t ID; // identification number uint16_t ID; // identification number
unsigned char RD : 1; // recursion desired unsigned char RD : 1; // recursion desired
unsigned char TC : 1; // truncated message unsigned char TC : 1; // truncated message
@ -64,9 +82,8 @@ struct DNSS_REQUESTER {
uint16_t id; uint16_t id;
}; };
class DNSServer class DNSServer {
{ public:
public:
DNSServer(); DNSServer();
~DNSServer() { ~DNSServer() {
stop(); stop();
@ -79,8 +96,8 @@ class DNSServer
Returns `true` on success. Returns `true` on success.
Returns `false`, Returns `false`,
* when forwarding `dns` is not set, or when forwarding `dns` is not set, or
* unable to allocate resources for managing the DNS forward function. unable to allocate resources for managing the DNS forward function.
*/ */
bool enableForwarder(const String &domainName = String(""), const IPAddress &dns = (uint32_t)0); bool enableForwarder(const String &domainName = String(""), const IPAddress &dns = (uint32_t)0);
/* /*
@ -89,16 +106,26 @@ class DNSServer
Optionally, resources used for the DNS forward function can be freed. Optionally, resources used for the DNS forward function can be freed.
*/ */
void disableForwarder(const String &domainName = String(""), bool freeResources = false); void disableForwarder(const String &domainName = String(""), bool freeResources = false);
bool isForwarding() { return _forwarder && _dns.isSet(); } bool isForwarding() {
void setDNS(const IPAddress& dns) { _dns = dns; } return _forwarder && _dns.isSet();
IPAddress getDNS() { return _dns; } }
bool isDNSSet() { return _dns.isSet(); } void setDNS(const IPAddress& dns) {
_dns = dns;
}
IPAddress getDNS() {
return _dns;
}
bool isDNSSet() {
return _dns.isSet();
}
void processNextRequest(); void processNextRequest();
void setErrorReplyCode(const DNSReplyCode &replyCode); void setErrorReplyCode(const DNSReplyCode &replyCode);
void setTTL(const uint32_t &ttl); void setTTL(const uint32_t &ttl);
uint32_t getTTL(); uint32_t getTTL();
String getDomainName() { return _domainName; } String getDomainName() {
return _domainName;
}
// Returns true if successful, false if there are no sockets available // Returns true if successful, false if there are no sockets available
bool start(const uint16_t &port, bool start(const uint16_t &port,
@ -108,7 +135,7 @@ class DNSServer
// stops the DNS server // stops the DNS server
void stop(); void stop();
private: private:
WiFiUDP _udp; WiFiUDP _udp;
String _domainName; String _domainName;
IPAddress _dns; IPAddress _dns;
@ -141,4 +168,3 @@ class DNSServer
void forwardReply(uint8_t *buffer, size_t length); void forwardReply(uint8_t *buffer, size_t length);
void writeNBOShort(uint16_t value); void writeNBOShort(uint16_t value);
}; };
#endif

View file

@ -19,8 +19,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
*/ */
#ifndef EEPROM_h #pragma once
#define EEPROM_h
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
@ -85,6 +84,3 @@ protected:
}; };
extern EEPROMClass EEPROM; extern EEPROMClass EEPROM;
#endif

View file

@ -1,3 +1,24 @@
/*
HTTPUpdateServer - Support simple web based OTA
Modified 2022 Earle F. Philhower, III. All rights reserved.
Ported from the ESP8266 Arduino core, (c) copyright multiple authors
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
*/
#pragma once #pragma once
#include <Arduino.h> #include <Arduino.h>

View file

@ -1,3 +1,24 @@
/*
HTTPUpdateServer - Support simple web based OTA
Modified 2022 Earle F. Philhower, III. All rights reserved.
Ported from the ESP8266 Arduino core, (c) copyright multiple authors
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
*/
#pragma once #pragma once
#include <WebServer.h> #include <WebServer.h>

View file

@ -22,8 +22,7 @@
*/ */
#ifndef MDNS_PRIV_H #pragma once
#define MDNS_PRIV_H
namespace esp8266 { namespace esp8266 {
@ -186,5 +185,3 @@ namespace MDNSImplementation {
// Include the main header, so the submodlues only need to include this header // Include the main header, so the submodlues only need to include this header
#include "LEAmDNS.h" #include "LEAmDNS.h"
#endif // MDNS_PRIV_H

View file

@ -22,9 +22,6 @@
*/ */
#ifndef MDNS_LWIPDEFS_H #pragma once
#define MDNS_LWIPDEFS_H
#include <lwip/prot/dns.h> // DNS_RRTYPE_xxx, DNS_MQUERY_PORT #include <lwip/prot/dns.h> // DNS_RRTYPE_xxx, DNS_MQUERY_PORT
#endif // MDNS_LWIPDEFS_H

View file

@ -23,9 +23,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
*/ */
#pragma once
#ifndef __LITTLEFS_H
#define __LITTLEFS_H
#include <limits> #include <limits>
#include <FS.h> #include <FS.h>
@ -681,6 +679,3 @@ protected:
extern FS LittleFS; extern FS LittleFS;
using littlefs_impl::LittleFSConfig; using littlefs_impl::LittleFSConfig;
#endif // ARDUINO #endif // ARDUINO
#endif // !defined(__LITTLEFS_H)

View file

@ -52,7 +52,7 @@ void loop() {
// Print samples to the serial monitor or plotter // Print samples to the serial monitor or plotter
for (int i = 0; i < samplesRead; i++) { for (int i = 0; i < samplesRead; i++) {
if(channels == 2) { if (channels == 2) {
Serial.print("L:"); Serial.print("L:");
Serial.print(sampleBuffer[i]); Serial.print(sampleBuffer[i]);
Serial.print(" R:"); Serial.print(" R:");
@ -67,9 +67,9 @@ void loop() {
} }
/** /**
* Callback function to process the data from the PDM microphone. Callback function to process the data from the PDM microphone.
* NOTE: This callback is executed as part of an ISR. NOTE: This callback is executed as part of an ISR.
* Therefore using `Serial` to print messages inside this function isn't supported. Therefore using `Serial` to print messages inside this function isn't supported.
* */ * */
void onPDMdata() { void onPDMdata() {
// Query the number of available bytes // Query the number of available bytes

View file

@ -16,16 +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
*/ */
#ifndef _PDM_H_INCLUDED #pragma once
#define _PDM_H_INCLUDED
#include <Arduino.h> #include <Arduino.h>
//#include <pinDefinitions.h> //#include <pinDefinitions.h>
#include "utility/PDMDoubleBuffer.h" #include "utility/PDMDoubleBuffer.h"
class PDMClass class PDMClass {
{
public: public:
PDMClass(int dinPin, int clkPin, int pwrPin); PDMClass(int dinPin, int clkPin, int pwrPin);
virtual ~PDMClass(); virtual ~PDMClass();
@ -44,7 +42,7 @@ public:
void setBufferSize(int bufferSize); void setBufferSize(int bufferSize);
size_t getBufferSize(); size_t getBufferSize();
// private: // private:
void IrqHandler(bool halftranfer); void IrqHandler(bool halftranfer);
private: private:
@ -58,7 +56,7 @@ private:
int _gain; int _gain;
int _init; int _init;
// Hardware peripherals used // Hardware peripherals used
uint _dmaChannel; uint _dmaChannel;
PIO _pio; PIO _pio;
int _smIdx; int _smIdx;
@ -68,7 +66,7 @@ private:
void (*_onReceive)(void); void (*_onReceive)(void);
}; };
#ifdef PIN_PDM_DIN #ifdef PIN_PDM_DIN
extern PDMClass PDM; extern PDMClass PDM;
#endif #endif
#endif

View file

@ -1,30 +1,30 @@
/** /**
******************************************************************************* *******************************************************************************
* @file OpenPDMFilter.c @file OpenPDMFilter.c
* @author CL @author CL
* @version V1.0.0 @version V1.0.0
* @date 9-September-2015 @date 9-September-2015
* @brief Open PDM audio software decoding Library. @brief Open PDM audio software decoding Library.
* This Library is used to decode and reconstruct the audio signal This Library is used to decode and reconstruct the audio signal
* produced by ST MEMS microphone (MP45Dxxx, MP34Dxxx). produced by ST MEMS microphone (MP45Dxxx, MP34Dxxx).
******************************************************************************* *******************************************************************************
* @attention @attention
*
* <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2> <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2>
*
* Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
* You may obtain a copy of the License at You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and See the License for the specific language governing permissions and
* limitations under the License. limitations under the License.
******************************************************************************* *******************************************************************************
*/ */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
@ -48,8 +48,7 @@ int32_t lut[256][DECIMATION_MAX / 8][SINCN];
/* Functions -----------------------------------------------------------------*/ /* Functions -----------------------------------------------------------------*/
#ifdef USE_LUT #ifdef USE_LUT
int32_t filter_table_mono_64(uint8_t *data, uint8_t sincn) int32_t filter_table_mono_64(uint8_t *data, uint8_t sincn) {
{
return (int32_t) return (int32_t)
lut[data[0]][0][sincn] + lut[data[0]][0][sincn] +
lut[data[1]][1][sincn] + lut[data[1]][1][sincn] +
@ -60,8 +59,7 @@ int32_t filter_table_mono_64(uint8_t *data, uint8_t sincn)
lut[data[6]][6][sincn] + lut[data[6]][6][sincn] +
lut[data[7]][7][sincn]; lut[data[7]][7][sincn];
} }
int32_t filter_table_stereo_64(uint8_t *data, uint8_t sincn) int32_t filter_table_stereo_64(uint8_t *data, uint8_t sincn) {
{
return (int32_t) return (int32_t)
lut[data[0]][0][sincn] + lut[data[0]][0][sincn] +
lut[data[2]][1][sincn] + lut[data[2]][1][sincn] +
@ -72,8 +70,7 @@ int32_t filter_table_stereo_64(uint8_t *data, uint8_t sincn)
lut[data[12]][6][sincn] + lut[data[12]][6][sincn] +
lut[data[14]][7][sincn]; lut[data[14]][7][sincn];
} }
int32_t filter_table_mono_128(uint8_t *data, uint8_t sincn) int32_t filter_table_mono_128(uint8_t *data, uint8_t sincn) {
{
return (int32_t) return (int32_t)
lut[data[0]][0][sincn] + lut[data[0]][0][sincn] +
lut[data[1]][1][sincn] + lut[data[1]][1][sincn] +
@ -92,8 +89,7 @@ int32_t filter_table_mono_128(uint8_t *data, uint8_t sincn)
lut[data[14]][14][sincn] + lut[data[14]][14][sincn] +
lut[data[15]][15][sincn]; lut[data[15]][15][sincn];
} }
int32_t filter_table_stereo_128(uint8_t *data, uint8_t sincn) int32_t filter_table_stereo_128(uint8_t *data, uint8_t sincn) {
{
return (int32_t) return (int32_t)
lut[data[0]][0][sincn] + lut[data[0]][0][sincn] +
lut[data[2]][1][sincn] + lut[data[2]][1][sincn] +
@ -112,11 +108,10 @@ int32_t filter_table_stereo_128(uint8_t *data, uint8_t sincn)
lut[data[28]][14][sincn] + lut[data[28]][14][sincn] +
lut[data[30]][15][sincn]; lut[data[30]][15][sincn];
} }
int32_t (* filter_tables_64[2]) (uint8_t *data, uint8_t sincn) = {filter_table_mono_64, filter_table_stereo_64}; int32_t (* filter_tables_64[2])(uint8_t *data, uint8_t sincn) = {filter_table_mono_64, filter_table_stereo_64};
int32_t (* filter_tables_128[2]) (uint8_t *data, uint8_t sincn) = {filter_table_mono_128, filter_table_stereo_128}; int32_t (* filter_tables_128[2])(uint8_t *data, uint8_t sincn) = {filter_table_mono_128, filter_table_stereo_128};
#else #else
int32_t filter_table(uint8_t *data, uint8_t sincn, TPDMFilter_InitStruct *param) int32_t filter_table(uint8_t *data, uint8_t sincn, TPDMFilter_InitStruct *param) {
{
uint8_t c, i; uint8_t c, i;
uint16_t data_index = 0; uint16_t data_index = 0;
uint32_t *coef_p = &coef[sincn][0]; uint32_t *coef_p = &coef[sincn][0];
@ -126,14 +121,14 @@ int32_t filter_table(uint8_t *data, uint8_t sincn, TPDMFilter_InitStruct *param)
for (i = 0; i < decimation; i += 8) { for (i = 0; i < decimation; i += 8) {
c = data[data_index]; c = data[data_index];
F += ((c >> 7) ) * coef_p[i ] + F += ((c >> 7)) * coef_p[i ] +
((c >> 6) & 0x01) * coef_p[i + 1] + ((c >> 6) & 0x01) * coef_p[i + 1] +
((c >> 5) & 0x01) * coef_p[i + 2] + ((c >> 5) & 0x01) * coef_p[i + 2] +
((c >> 4) & 0x01) * coef_p[i + 3] + ((c >> 4) & 0x01) * coef_p[i + 3] +
((c >> 3) & 0x01) * coef_p[i + 4] + ((c >> 3) & 0x01) * coef_p[i + 4] +
((c >> 2) & 0x01) * coef_p[i + 5] + ((c >> 2) & 0x01) * coef_p[i + 5] +
((c >> 1) & 0x01) * coef_p[i + 6] + ((c >> 1) & 0x01) * coef_p[i + 6] +
((c ) & 0x01) * coef_p[i + 7]; ((c) & 0x01) * coef_p[i + 7];
data_index += channels; data_index += channels;
} }
return F; return F;
@ -142,12 +137,10 @@ int32_t filter_table(uint8_t *data, uint8_t sincn, TPDMFilter_InitStruct *param)
void convolve(uint32_t Signal[/* SignalLen */], unsigned short SignalLen, void convolve(uint32_t Signal[/* SignalLen */], unsigned short SignalLen,
uint32_t Kernel[/* KernelLen */], unsigned short KernelLen, uint32_t Kernel[/* KernelLen */], unsigned short KernelLen,
uint32_t Result[/* SignalLen + KernelLen - 1 */]) uint32_t Result[/* SignalLen + KernelLen - 1 */]) {
{
uint16_t n; uint16_t n;
for (n = 0; n < SignalLen + KernelLen - 1; n++) for (n = 0; n < SignalLen + KernelLen - 1; n++) {
{
unsigned short kmin, kmax, k; unsigned short kmin, kmax, k;
Result[n] = 0; Result[n] = 0;
@ -161,8 +154,7 @@ void convolve(uint32_t Signal[/* SignalLen */], unsigned short SignalLen,
} }
} }
void Open_PDM_Filter_Init(TPDMFilter_InitStruct *Param) void Open_PDM_Filter_Init(TPDMFilter_InitStruct *Param) {
{
uint16_t i, j; uint16_t i, j;
int64_t sum = 0; int64_t sum = 0;
@ -177,15 +169,15 @@ void Open_PDM_Filter_Init(TPDMFilter_InitStruct *Param)
} }
Param->OldOut = Param->OldIn = Param->OldZ = 0; Param->OldOut = Param->OldIn = Param->OldZ = 0;
Param->LP_ALFA = (Param->LP_HZ != 0 ? (uint16_t) (Param->LP_HZ * 256 / (Param->LP_HZ + Param->Fs / (2 * 3.14159))) : 0); Param->LP_ALFA = (Param->LP_HZ != 0 ? (uint16_t)(Param->LP_HZ * 256 / (Param->LP_HZ + Param->Fs / (2 * 3.14159))) : 0);
Param->HP_ALFA = (Param->HP_HZ != 0 ? (uint16_t) (Param->Fs * 256 / (2 * 3.14159 * Param->HP_HZ + Param->Fs)) : 0); Param->HP_ALFA = (Param->HP_HZ != 0 ? (uint16_t)(Param->Fs * 256 / (2 * 3.14159 * Param->HP_HZ + Param->Fs)) : 0);
Param->FilterLen = decimation * SINCN; Param->FilterLen = decimation * SINCN;
sinc[0] = 0; sinc[0] = 0;
sinc[decimation * SINCN - 1] = 0; sinc[decimation * SINCN - 1] = 0;
convolve(sinc1, decimation, sinc1, decimation, sinc2); convolve(sinc1, decimation, sinc1, decimation, sinc2);
convolve(sinc2, decimation * 2 - 1, sinc1, decimation, &sinc[1]); convolve(sinc2, decimation * 2 - 1, sinc1, decimation, &sinc[1]);
for(j = 0; j < SINCN; j++) { for (j = 0; j < SINCN; j++) {
for (i = 0; i < decimation; i++) { for (i = 0; i < decimation; i++) {
coef[j][i] = sinc[j * decimation + i]; coef[j][i] = sinc[j * decimation + i];
sum += sinc[j * decimation + i]; sum += sinc[j * decimation + i];
@ -199,25 +191,23 @@ void Open_PDM_Filter_Init(TPDMFilter_InitStruct *Param)
#ifdef USE_LUT #ifdef USE_LUT
/* Look-Up Table. */ /* Look-Up Table. */
uint16_t c, d, s; uint16_t c, d, s;
for (s = 0; s < SINCN; s++) for (s = 0; s < SINCN; s++) {
{
uint32_t *coef_p = &coef[s][0]; uint32_t *coef_p = &coef[s][0];
for (c = 0; c < 256; c++) for (c = 0; c < 256; c++)
for (d = 0; d < decimation / 8; d++) for (d = 0; d < decimation / 8; d++)
lut[c][d][s] = ((c >> 7) ) * coef_p[d * 8 ] + lut[c][d][s] = ((c >> 7)) * coef_p[d * 8 ] +
((c >> 6) & 0x01) * coef_p[d * 8 + 1] + ((c >> 6) & 0x01) * coef_p[d * 8 + 1] +
((c >> 5) & 0x01) * coef_p[d * 8 + 2] + ((c >> 5) & 0x01) * coef_p[d * 8 + 2] +
((c >> 4) & 0x01) * coef_p[d * 8 + 3] + ((c >> 4) & 0x01) * coef_p[d * 8 + 3] +
((c >> 3) & 0x01) * coef_p[d * 8 + 4] + ((c >> 3) & 0x01) * coef_p[d * 8 + 4] +
((c >> 2) & 0x01) * coef_p[d * 8 + 5] + ((c >> 2) & 0x01) * coef_p[d * 8 + 5] +
((c >> 1) & 0x01) * coef_p[d * 8 + 6] + ((c >> 1) & 0x01) * coef_p[d * 8 + 6] +
((c ) & 0x01) * coef_p[d * 8 + 7]; ((c) & 0x01) * coef_p[d * 8 + 7];
} }
#endif #endif
} }
void Open_PDM_Filter_64(uint8_t* data, int16_t* dataOut, uint16_t volume, TPDMFilter_InitStruct *Param) void Open_PDM_Filter_64(uint8_t* data, int16_t* dataOut, uint16_t volume, TPDMFilter_InitStruct *Param) {
{
uint8_t i, data_out_index; uint8_t i, data_out_index;
uint8_t channels = Param->In_MicChannels; uint8_t channels = Param->In_MicChannels;
uint8_t data_inc = ((DECIMATION_MAX >> 4) * channels); uint8_t data_inc = ((DECIMATION_MAX >> 4) * channels);
@ -264,8 +254,7 @@ void Open_PDM_Filter_64(uint8_t* data, int16_t* dataOut, uint16_t volume, TPDMFi
Param->OldZ = OldZ; Param->OldZ = OldZ;
} }
void Open_PDM_Filter_128(uint8_t* data, int16_t* dataOut, uint16_t volume, TPDMFilter_InitStruct *Param) void Open_PDM_Filter_128(uint8_t* data, int16_t* dataOut, uint16_t volume, TPDMFilter_InitStruct *Param) {
{
uint8_t i, data_out_index; uint8_t i, data_out_index;
uint8_t channels = Param->In_MicChannels; uint8_t channels = Param->In_MicChannels;
uint8_t data_inc = ((DECIMATION_MAX >> 3) * channels); uint8_t data_inc = ((DECIMATION_MAX >> 3) * channels);

View file

@ -1,30 +1,30 @@
/** /**
******************************************************************************* *******************************************************************************
* @file OpenPDMFilter.h @file OpenPDMFilter.h
* @author CL @author CL
* @version V1.0.0 @version V1.0.0
* @date 9-September-2015 @date 9-September-2015
* @brief Header file for Open PDM audio software decoding Library. @brief Header file for Open PDM audio software decoding Library.
* This Library is used to decode and reconstruct the audio signal This Library is used to decode and reconstruct the audio signal
* produced by ST MEMS microphone (MP45Dxxx, MP34Dxxx). produced by ST MEMS microphone (MP45Dxxx, MP34Dxxx).
******************************************************************************* *******************************************************************************
* @attention @attention
*
* <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2> <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2>
*
* Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
* You may obtain a copy of the License at You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and See the License for the specific language governing permissions and
* limitations under the License. limitations under the License.
******************************************************************************* *******************************************************************************
*/ */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
@ -33,7 +33,7 @@
#define __OPENPDMFILTER_H #define __OPENPDMFILTER_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -45,10 +45,10 @@
/* Definitions ---------------------------------------------------------------*/ /* Definitions ---------------------------------------------------------------*/
/* /*
* Enable to use a Look-Up Table to improve performances while using more FLASH Enable to use a Look-Up Table to improve performances while using more FLASH
* and RAM memory. and RAM memory.
* Note: Without Look-Up Table up to stereo@16KHz configuration is supported. Note: Without Look-Up Table up to stereo@16KHz configuration is supported.
*/ */
#define USE_LUT #define USE_LUT
#define SINCN 3 #define SINCN 3

View file

@ -30,8 +30,7 @@ int16_t* volatile finalBuffer;
TPDMFilter_InitStruct filter; TPDMFilter_InitStruct filter;
extern "C" { extern "C" {
__attribute__((__used__)) void dmaHandler(void) __attribute__((__used__)) void dmaHandler(void) {
{
PDM.IrqHandler(true); PDM.IrqHandler(true);
} }
} }
@ -49,16 +48,13 @@ PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) :
_dmaChannel(0), _dmaChannel(0),
_pio(nullptr), _pio(nullptr),
_smIdx(-1), _smIdx(-1),
_pgmOffset(-1) _pgmOffset(-1) {
{
} }
PDMClass::~PDMClass() PDMClass::~PDMClass() {
{
} }
int PDMClass::begin(int channels, int sampleRate) int PDMClass::begin(int channels, int sampleRate) {
{
//_channels = channels; // only one channel available //_channels = channels; // only one channel available
// clear the final buffers // clear the final buffers
@ -76,12 +72,12 @@ int PDMClass::begin(int channels, int sampleRate)
/* Initialize Open PDM library */ /* Initialize Open PDM library */
filter.Fs = sampleRate; filter.Fs = sampleRate;
filter.nSamples = rawBufferLength; filter.nSamples = rawBufferLength;
filter.LP_HZ = sampleRate/2; filter.LP_HZ = sampleRate / 2;
filter.HP_HZ = 10; filter.HP_HZ = 10;
filter.In_MicChannels = 1; filter.In_MicChannels = 1;
filter.Out_MicChannels = 1; filter.Out_MicChannels = 1;
filter.Decimation = decimation; filter.Decimation = decimation;
if(_gain == -1) { if (_gain == -1) {
_gain = FILTER_GAIN; _gain = FILTER_GAIN;
} }
filter.filterGain = _gain; filter.filterGain = _gain;
@ -127,14 +123,12 @@ int PDMClass::begin(int channels, int sampleRate)
return 1; return 1;
} }
void PDMClass::end() void PDMClass::end() {
{
dma_channel_abort(_dmaChannel); dma_channel_abort(_dmaChannel);
pinMode(_clkPin, INPUT); pinMode(_clkPin, INPUT);
} }
int PDMClass::available() int PDMClass::available() {
{
//NVIC_DisableIRQ(DMA_IRQ_0n); //NVIC_DisableIRQ(DMA_IRQ_0n);
//uint32_t interrupts = save_and_disable_interrupts(); //uint32_t interrupts = save_and_disable_interrupts();
irq_set_enabled(DMA_IRQ_0, false); irq_set_enabled(DMA_IRQ_0, false);
@ -145,35 +139,30 @@ int PDMClass::available()
return avail; return avail;
} }
int PDMClass::read(void* buffer, size_t size) int PDMClass::read(void* buffer, size_t size) {
{
irq_set_enabled(DMA_IRQ_0, false); irq_set_enabled(DMA_IRQ_0, false);
int read = _doubleBuffer.read(buffer, size); int read = _doubleBuffer.read(buffer, size);
irq_set_enabled(DMA_IRQ_0, true); irq_set_enabled(DMA_IRQ_0, true);
return read; return read;
} }
void PDMClass::onReceive(void(*function)(void)) void PDMClass::onReceive(void(*function)(void)) {
{
_onReceive = function; _onReceive = function;
} }
void PDMClass::setGain(int gain) void PDMClass::setGain(int gain) {
{
_gain = gain; _gain = gain;
if(_init == 1) { if (_init == 1) {
filter.filterGain = _gain; filter.filterGain = _gain;
Open_PDM_Filter_Init(&filter); Open_PDM_Filter_Init(&filter);
} }
} }
void PDMClass::setBufferSize(int bufferSize) void PDMClass::setBufferSize(int bufferSize) {
{
_doubleBuffer.setSize(bufferSize); _doubleBuffer.setSize(bufferSize);
} }
void PDMClass::IrqHandler(bool halftranfer) void PDMClass::IrqHandler(bool halftranfer) {
{
static int cutSamples = 100; static int cutSamples = 100;
// Clear the interrupt request. // Clear the interrupt request.

View file

@ -46,7 +46,7 @@ static inline void pdm_pio_program_init(PIO pio, uint sm, uint offset, uint clkP
sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_RX); sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_RX);
pio_sm_set_consecutive_pindirs(pio, sm, dataPin, 1, false); pio_sm_set_consecutive_pindirs(pio, sm, dataPin, 1, false);
pio_sm_set_consecutive_pindirs(pio, sm, clkPin, 1, true); pio_sm_set_consecutive_pindirs(pio, sm, clkPin, 1, true);
pio_sm_set_pins_with_mask(pio, sm, 0, (1u << clkPin) ); pio_sm_set_pins_with_mask(pio, sm, 0, (1u << clkPin));
//pio_gpio_init(pio, dataPin); //pio_gpio_init(pio, dataPin);
pio_gpio_init(pio, clkPin); pio_gpio_init(pio, clkPin);
pio_sm_init(pio, sm, offset, &c); pio_sm_init(pio, sm, offset, &c);

View file

@ -22,28 +22,23 @@
#include "PDMDoubleBuffer.h" #include "PDMDoubleBuffer.h"
PDMDoubleBuffer::PDMDoubleBuffer() : PDMDoubleBuffer::PDMDoubleBuffer() :
_size(DEFAULT_PDM_BUFFER_SIZE) _size(DEFAULT_PDM_BUFFER_SIZE) {
{
reset(); reset();
} }
PDMDoubleBuffer::~PDMDoubleBuffer() PDMDoubleBuffer::~PDMDoubleBuffer() {
{
} }
void PDMDoubleBuffer::setSize(int size) void PDMDoubleBuffer::setSize(int size) {
{
_size = size; _size = size;
reset(); reset();
} }
size_t PDMDoubleBuffer::getSize() size_t PDMDoubleBuffer::getSize() {
{
return _size; return _size;
} }
void PDMDoubleBuffer::reset() void PDMDoubleBuffer::reset() {
{
_buffer[0] = (uint8_t*)realloc(_buffer[0], _size); _buffer[0] = (uint8_t*)realloc(_buffer[0], _size);
_buffer[1] = (uint8_t*)realloc(_buffer[1], _size); _buffer[1] = (uint8_t*)realloc(_buffer[1], _size);
@ -57,13 +52,11 @@ void PDMDoubleBuffer::reset()
_readOffset[1] = 0; _readOffset[1] = 0;
} }
size_t PDMDoubleBuffer::availableForWrite() size_t PDMDoubleBuffer::availableForWrite() {
{
return (_size - (_length[_index] - _readOffset[_index])); return (_size - (_length[_index] - _readOffset[_index]));
} }
size_t PDMDoubleBuffer::write(const void *buffer, size_t size) size_t PDMDoubleBuffer::write(const void *buffer, size_t size) {
{
size_t space = availableForWrite(); size_t space = availableForWrite();
if (size > space) { if (size > space) {
@ -81,8 +74,7 @@ size_t PDMDoubleBuffer::write(const void *buffer, size_t size)
return size; return size;
} }
size_t PDMDoubleBuffer::read(void *buffer, size_t size) size_t PDMDoubleBuffer::read(void *buffer, size_t size) {
{
size_t avail = available(); size_t avail = available();
if (size > avail) { if (size > avail) {
@ -99,8 +91,7 @@ size_t PDMDoubleBuffer::read(void *buffer, size_t size)
return size; return size;
} }
size_t PDMDoubleBuffer::peek(void *buffer, size_t size) size_t PDMDoubleBuffer::peek(void *buffer, size_t size) {
{
size_t avail = available(); size_t avail = available();
if (size > avail) { if (size > avail) {
@ -116,18 +107,15 @@ size_t PDMDoubleBuffer::peek(void *buffer, size_t size)
return size; return size;
} }
void* PDMDoubleBuffer::data() void* PDMDoubleBuffer::data() {
{
return (void*)_buffer[_index]; return (void*)_buffer[_index];
} }
size_t PDMDoubleBuffer::available() size_t PDMDoubleBuffer::available() {
{
return _length[_index] - _readOffset[_index]; return _length[_index] - _readOffset[_index];
} }
void PDMDoubleBuffer::swap(int length) void PDMDoubleBuffer::swap(int length) {
{
if (_index == 0) { if (_index == 0) {
_index = 1; _index = 1;
} else { } else {

View file

@ -24,8 +24,7 @@
#define DEFAULT_PDM_BUFFER_SIZE 512 #define DEFAULT_PDM_BUFFER_SIZE 512
class PDMDoubleBuffer class PDMDoubleBuffer {
{
public: public:
PDMDoubleBuffer(); PDMDoubleBuffer();
virtual ~PDMDoubleBuffer(); virtual ~PDMDoubleBuffer();
@ -44,7 +43,7 @@ public:
void swap(int length = 0); void swap(int length = 0);
private: private:
uint8_t* _buffer[2] __attribute__((aligned (16))); uint8_t* _buffer[2] __attribute__((aligned(16)));
int _size; int _size;
volatile int _length[2]; volatile int _length[2];
volatile int _readOffset[2]; volatile int _readOffset[2];

View file

@ -17,8 +17,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
*/ */
#ifndef __SD_H__ #pragma once
#define __SD_H__
#include <Arduino.h> #include <Arduino.h>
#include <FS.h> #include <FS.h>
@ -218,5 +217,3 @@ static inline uint8_t FAT_SECOND(uint16_t fatTime) {
#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SD) #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SD)
extern SDClass SD; extern SDClass SD;
#endif #endif
#endif

View file

@ -1,6 +1,3 @@
#ifndef SDFS_H
#define SDFS_H
/* /*
SDFS.h - file system wrapper for SdLib SDFS.h - file system wrapper for SdLib
Copyright (c) 2019 Earle F. Philhower, III. All rights reserved. Copyright (c) 2019 Earle F. Philhower, III. All rights reserved.
@ -27,6 +24,9 @@
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#pragma once
#include <limits> #include <limits>
#include <assert.h> #include <assert.h>
#include "FS.h" #include "FS.h"
@ -508,5 +508,3 @@ protected:
extern FS SDFS; extern FS SDFS;
using sdfs::SDFSConfig; using sdfs::SDFSConfig;
#endif #endif
#endif // SDFS.h

View file

@ -37,8 +37,7 @@
detach() - Stops an attached servos from pulsing its i/o pin. detach() - Stops an attached servos from pulsing its i/o pin.
*/ */
#ifndef Servo_h #pragma once
#define Servo_h
#include <Arduino.h> #include <Arduino.h>
#include <hardware/pio.h> #include <hardware/pio.h>
@ -89,5 +88,3 @@ private:
}; };
#endif

View file

@ -1,3 +1,22 @@
/*
StackThunk - Implements a simple 2nd stack for BSSL and others
Copyright (c) 2022 Earle F. Philhower, III. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
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 <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>

View file

@ -1,3 +1,22 @@
/*
StackThunk - Implements a simple 2nd stack for BSSL and others
Copyright (c) 2022 Earle F. Philhower, III. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
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
*/
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>

View file

@ -72,8 +72,7 @@
} }
*/ */
#ifndef __ADDRLIST_H #pragma once
#define __ADDRLIST_H
#include <IPAddress.h> #include <IPAddress.h>
#include <api/String.h> #include <api/String.h>
@ -254,6 +253,3 @@ inline AddressList::const_iterator end(const AddressList& a) {
} // esp8266 } // esp8266
extern esp8266::AddressListImplementation::AddressList addrList; extern esp8266::AddressListImplementation::AddressList addrList;
#endif

View file

@ -1,3 +1,25 @@
/*
LwipEthernet.h
Arduino interface for lwIP generic callbacks and functions
Original Copyright (c) 2020 esp8266 Arduino All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
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 <ESP8266WiFi.h> // tcp API //#include <ESP8266WiFi.h> // tcp API
//#include <debug.h> //#include <debug.h>

View file

@ -3,12 +3,12 @@
for dir in ./cores/rp2040 ./libraries/EEPROM ./libraries/I2S \ for dir in ./cores/rp2040 ./libraries/EEPROM ./libraries/I2S \
./libraries/LittleFS/src ./libraries/LittleFS/examples \ ./libraries/LittleFS/src ./libraries/LittleFS/examples \
./libraries/rp2040 ./libraries/SD ./libraries/ESP8266SdFat \ ./libraries/rp2040 ./libraries/SD ./libraries/ESP8266SdFat \
./libraries/Servo ./libraries/SPI ./libraries/Wire \ ./libraries/Servo ./libraries/SPI ./libraries/Wire ./libraries/PDM \
./libraries/WiFi ./libraries/lwIP_Ethernet ./libraries/lwIP_CYW43 \ ./libraries/WiFi ./libraries/lwIP_Ethernet ./libraries/lwIP_CYW43 \
./libraries/FreeRTOS/src ./libraries/LEAmDNS ./libraries/MD5Builder \ ./libraries/FreeRTOS/src ./libraries/LEAmDNS ./libraries/MD5Builder \
./libraries/PicoOTA ./libraries/SDFS ./libraries/ArduinoOTA \ ./libraries/PicoOTA ./libraries/SDFS ./libraries/ArduinoOTA \
./libraries/Updater ./libraries/HTTPClient ./libraries/HTTPUpdate \ ./libraries/Updater ./libraries/HTTPClient ./libraries/HTTPUpdate \
./libraries/WebServer ./libraries/HTTPUpdateServer ; do ./libraries/WebServer ./libraries/HTTPUpdateServer ./libraries/DNSServer ; do
find $dir -type f \( -name "*.c" -o -name "*.h" -o -name "*.cpp" \) -a \! -path '*api*' -exec astyle --suffix=none --options=./tests/astyle_core.conf \{\} \; find $dir -type f \( -name "*.c" -o -name "*.h" -o -name "*.cpp" \) -a \! -path '*api*' -exec astyle --suffix=none --options=./tests/astyle_core.conf \{\} \;
find $dir -type f -name "*.ino" -exec astyle --suffix=none --options=./tests/astyle_examples.conf \{\} \; find $dir -type f -name "*.ino" -exec astyle --suffix=none --options=./tests/astyle_examples.conf \{\} \;
done done