更新硬件SDK

This commit is contained in:
kerwincui
2023-03-04 03:44:56 +08:00
parent dcdf6e1b7c
commit e39d3d2f03
1900 changed files with 663153 additions and 0 deletions

View File

@@ -0,0 +1,208 @@
/*******************************************************************************
* Copyright (c) 2013, 2014
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Sam Grove - initial API and implementation and/or initial documentation
* Ian Craggs - added attached and detached member functions
* Sam Grove - removed need for FP.cpp
*******************************************************************************/
#ifndef FP_H
#define FP_H
/** Example using the FP Class with global functions
* @code
* #include "mbed.h"
* #include "FP.h"
*
* FP<void,bool>fp;
* DigitalOut myled(LED1);
*
* void handler(bool value)
* {
* myled = value;
* return;
* }
*
* int main()
* {
* fp.attach(&handler);
*
* while(1)
* {
* fp(1);
* wait(0.2);
* fp(0);
* wait(0.2);
* }
* }
* @endcode
*/
/** Example using the FP Class with different class member functions
* @code
* #include "mbed.h"
* #include "FP.h"
*
* FP<void,bool>fp;
* DigitalOut myled(LED4);
*
* class Wrapper
* {
* public:
* Wrapper(){}
*
* void handler(bool value)
* {
* myled = value;
* return;
* }
* };
*
* int main()
* {
* Wrapper wrapped;
* fp.attach(&wrapped, &Wrapper::handler);
*
* while(1)
* {
* fp(1);
* wait(0.2);
* fp(0);
* wait(0.2);
* }
* }
* @endcode
*/
/** Example using the FP Class with member FP and member function
* @code
* #include "mbed.h"
* #include "FP.h"
*
* DigitalOut myled(LED2);
*
* class Wrapper
* {
* public:
* Wrapper()
* {
* fp.attach(this, &Wrapper::handler);
* }
*
* void handler(bool value)
* {
* myled = value;
* return;
* }
*
* FP<void,bool>fp;
* };
*
* int main()
* {
* Wrapper wrapped;
*
* while(1)
* {
* wrapped.fp(1);
* wait(0.2);
* wrapped.fp(0);
* wait(0.2);
* }
* }
* @endcode
*/
/**
* @class FP
* @brief API for managing Function Pointers
*/
template<class retT, class argT>
class FP
{
public:
/** Create the FP object - only one callback can be attached to the object, that is
* a member function or a global function, not both at the same time
*/
FP()
{
obj_callback = 0;
c_callback = 0;
}
/** Add a callback function to the object
* @param item - Address of the initialized object
* @param member - Address of the member function (dont forget the scope that the function is defined in)
*/
template<class T>
void attach(T *item, retT (T::*method)(argT))
{
obj_callback = (FPtrDummy *)(item);
method_callback = (retT (FPtrDummy::*)(argT))(method);
return;
}
/** Add a callback function to the object
* @param function - The address of a globally defined function
*/
void attach(retT (*function)(argT))
{
c_callback = function;
}
/** Invoke the function attached to the class
* @param arg - An argument that is passed into the function handler that is called
* @return The return from the function hanlder called by this class
*/
retT operator()(argT arg) const
{
if( 0 != c_callback ) {
return obj_callback ? (obj_callback->*method_callback)(arg) : (*c_callback)(arg);
}
return (retT)0;
}
/** Determine if an callback is currently hooked
* @return 1 if a method is hooked, 0 otherwise
*/
bool attached()
{
return obj_callback || c_callback;
}
/** Release a function from the callback hook
*/
void detach()
{
obj_callback = 0;
c_callback = 0;
}
private:
// empty type used for casting
class FPtrDummy;
FPtrDummy *obj_callback;
/**
* @union Funciton
* @brief Member or global callback function
*/
union {
retT (*c_callback)(argT); /*!< Footprint for a global function */
retT (FPtrDummy::*method_callback)(argT); /*!< Footprint for a member function */
};
};
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,55 @@
/*******************************************************************************
* Copyright (c) 2014 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
*******************************************************************************/
#if !defined(MQTT_LOGGING_H)
#define MQTT_LOGGING_H
#define STREAM stdout
#if !defined(DEBUG)
#define DEBUG(...) \
{\
fprintf(STREAM, "DEBUG: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \
fprintf(STREAM, ##__VA_ARGS__); \
fflush(STREAM); \
}
#endif
#if !defined(LOG)
#define LOG(...) \
{\
fprintf(STREAM, "LOG: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \
fprintf(STREAM, ##__VA_ARGS__); \
fflush(STREAM); \
}
#endif
#if !defined(WARN)
#define WARN(...) \
{ \
fprintf(STREAM, "WARN: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \
fprintf(STREAM, ##__VA_ARGS__); \
fflush(STREAM); \
}
#endif
#if !defined(ERROR)
#define ERROR(...) \
{ \
fprintf(STREAM, "ERROR: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \
fprintf(STREAM, ##__VA_ARGS__); \
fflush(STREAM); \
exit(1); \
}
#endif
#endif

View File

@@ -0,0 +1,57 @@
/*******************************************************************************
* Copyright (c) 2014 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
*******************************************************************************/
#if !defined(COUNTDOWN_H)
#define COUNTDOWN_H
class Countdown
{
public:
Countdown()
{
interval_end_ms = 0L;
}
Countdown(int ms)
{
countdown_ms(ms);
}
bool expired()
{
return (interval_end_ms > 0L) && (millis() >= interval_end_ms);
}
void countdown_ms(unsigned long ms)
{
interval_end_ms = millis() + ms;
}
void countdown(int seconds)
{
countdown_ms((unsigned long)seconds * 1000L);
}
int left_ms()
{
return interval_end_ms - millis();
}
private:
unsigned long interval_end_ms;
};
#endif

View File

@@ -0,0 +1,79 @@
/*******************************************************************************
* Copyright (c) 2014, 2017 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
* Benjamin Cabe - generic IPStack
*******************************************************************************/
#if !defined(IPSTACK_H)
#define IPSTACK_H
#ifndef WiFi_h
#include <SPI.h>
#endif
#include <Client.h>
class IPStack
{
public:
IPStack(Client& client) : client(&client)
{
}
int connect(char* hostname, int port)
{
return client->connect(hostname, port);
}
int connect(uint32_t hostname, int port)
{
return client->connect(hostname, port);
}
int read(unsigned char* buffer, int len, int timeout)
{
int interval = 10; // all times are in milliseconds
int total = 0, rc = -1;
if (timeout < 30)
interval = 2;
while (client->available() < len && total < timeout)
{
delay(interval);
total += interval;
}
if (client->available() >= len)
rc = client->readBytes((char*)buffer, len);
return rc;
}
int write(unsigned char* buffer, int len, int timeout)
{
client->setTimeout(timeout);
return client->write((uint8_t*)buffer, len);
}
int disconnect()
{
client->stop();
return 0;
}
private:
Client* client;
};
#endif

View File

@@ -0,0 +1,69 @@
/*******************************************************************************
* Copyright (c) 2014 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
*******************************************************************************/
#ifndef ARDUINOWIFIIPSTACK_H
#define ARDUINOWIFIIPSTACK_H
#include <WiFi.h>
class WifiIPStack
{
public:
WifiIPStack()
{
//WiFi.begin(); // Use DHCP
iface.setTimeout(1000); // 1 second Timeout
}
int connect(char* hostname, int port)
{
return iface.connect(hostname, port);
}
int connect(uint32_t hostname, int port)
{
return iface.connect(hostname, port);
}
int read(char* buffer, int len, int timeout)
{
iface.setTimeout(timeout);
while(!iface.available());
return iface.readBytes(buffer, len);
}
int write(char* buffer, int len, int timeout)
{
iface.setTimeout(timeout);
return iface.write((uint8_t*)buffer, len);
}
int disconnect()
{
iface.stop();
return 0;
}
private:
WiFiClient iface;
};
#endif

View File

@@ -0,0 +1,213 @@
/*******************************************************************************
* Copyright (c) 2014, 2017 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
* Ian Craggs - ensure read returns if no bytes read
*******************************************************************************/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/param.h>
#include <sys/time.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
class IPStack
{
public:
IPStack()
{
}
int connect(const char* hostname, int port)
{
int type = SOCK_STREAM;
struct sockaddr_in address;
int rc = -1;
sa_family_t family = AF_INET;
struct addrinfo *result = NULL;
struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};
if ((rc = getaddrinfo(hostname, NULL, &hints, &result)) == 0)
{
struct addrinfo* res = result;
/* prefer ip4 addresses */
while (res)
{
if (res->ai_family == AF_INET)
{
result = res;
break;
}
res = res->ai_next;
}
if (result->ai_family == AF_INET)
{
address.sin_port = htons(port);
address.sin_family = family = AF_INET;
address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;
}
else
rc = -1;
freeaddrinfo(result);
}
if (rc == 0)
{
mysock = socket(family, type, 0);
if (mysock != -1)
{
int opt = 1;
//if (setsockopt(mysock, SOL_SOCKET, SO_NOSIGPIPE, (void*)&opt, sizeof(opt)) != 0)
// printf("Could not set SO_NOSIGPIPE for socket %d", mysock);
rc = ::connect(mysock, (struct sockaddr*)&address, sizeof(address));
}
}
return rc;
}
// return -1 on error, or the number of bytes read
// which could be 0 on a read timeout
int read(unsigned char* buffer, int len, int timeout_ms)
{
struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};
if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))
{
interval.tv_sec = 0;
interval.tv_usec = 100;
}
setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));
int bytes = 0;
int i = 0; const int max_tries = 10;
while (bytes < len)
{
int rc = ::recv(mysock, &buffer[bytes], (size_t)(len - bytes), 0);
if (rc == -1)
{
if (errno != EAGAIN && errno != EWOULDBLOCK)
bytes = -1;
break;
}
else
bytes += rc;
if (++i >= max_tries)
break;
if (rc == 0)
break;
}
return bytes;
}
int write(unsigned char* buffer, int len, int timeout)
{
struct timeval tv;
tv.tv_sec = 0; /* 30 Secs Timeout */
tv.tv_usec = timeout * 1000; // Not init'ing this can cause strange errors
setsockopt(mysock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(struct timeval));
int rc = ::write(mysock, buffer, len);
//printf("write rc %d\n", rc);
return rc;
}
int disconnect()
{
return ::close(mysock);
}
private:
int mysock;
};
class Countdown
{
public:
Countdown()
{
}
Countdown(int ms)
{
countdown_ms(ms);
}
bool expired()
{
struct timeval now, res;
gettimeofday(&now, NULL);
timersub(&end_time, &now, &res);
//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
//if (res.tv_sec > 0 || res.tv_usec > 0)
// printf("expired %d %d\n", res.tv_sec, res.tv_usec);
return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);
}
void countdown_ms(int ms)
{
struct timeval now;
gettimeofday(&now, NULL);
struct timeval interval = {ms / 1000, (ms % 1000) * 1000};
//printf("interval %d %d\n", interval.tv_sec, interval.tv_usec);
timeradd(&now, &interval, &end_time);
}
void countdown(int seconds)
{
struct timeval now;
gettimeofday(&now, NULL);
struct timeval interval = {seconds, 0};
timeradd(&now, &interval, &end_time);
}
int left_ms()
{
struct timeval now, res;
gettimeofday(&now, NULL);
timersub(&end_time, &now, &res);
//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;
}
private:
struct timeval end_time;
};

View File

@@ -0,0 +1,29 @@
#if !defined(MQTTETHERNET_H)
#define MQTTETHERNET_H
#include "MQTTmbed.h"
#include "EthernetInterface.h"
#include "MQTTSocket.h"
class MQTTEthernet : public MQTTSocket
{
public:
MQTTEthernet() : MQTTSocket(&eth)
{
eth.connect();
}
EthernetInterface& getEth()
{
return eth;
}
private:
EthernetInterface eth;
};
#endif

View File

@@ -0,0 +1,97 @@
#if !defined(MQTTSOCKET_H)
#define MQTTSOCKET_H
#include "MQTTmbed.h"
#include <EthernetInterface.h>
#include <Timer.h>
class MQTTSocket
{
public:
MQTTSocket(EthernetInterface *anet)
{
net = anet;
open = false;
}
int connect(char* hostname, int port, int timeout=1000)
{
if (open)
disconnect();
nsapi_error_t rc = mysock.open(net);
open = true;
mysock.set_blocking(true);
mysock.set_timeout((unsigned int)timeout);
rc = mysock.connect(hostname, port);
mysock.set_blocking(false); // blocking timeouts seem not to work
return rc;
}
// common read/write routine, avoiding blocking timeouts
int common(unsigned char* buffer, int len, int timeout, bool read)
{
timer.start();
mysock.set_blocking(false); // blocking timeouts seem not to work
int bytes = 0;
bool first = true;
do
{
if (first)
first = false;
else
wait_ms(timeout < 100 ? timeout : 100);
int rc;
if (read)
rc = mysock.recv((char*)buffer, len);
else
rc = mysock.send((char*)buffer, len);
if (rc < 0)
{
if (rc != NSAPI_ERROR_WOULD_BLOCK)
{
bytes = -1;
break;
}
}
else
bytes += rc;
}
while (bytes < len && timer.read_ms() < timeout);
timer.stop();
return bytes;
}
/* returns the number of bytes read, which could be 0.
-1 if there was an error on the socket
*/
int read(unsigned char* buffer, int len, int timeout)
{
return common(buffer, len, timeout, true);
}
int write(unsigned char* buffer, int len, int timeout)
{
return common(buffer, len, timeout, false);
}
int disconnect()
{
open = false;
return mysock.close();
}
/*bool is_connected()
{
return mysock.is_connected();
}*/
private:
bool open;
TCPSocket mysock;
EthernetInterface *net;
Timer timer;
};
#endif

View File

@@ -0,0 +1,65 @@
/*******************************************************************************
* Copyright (c) 2014, 2017 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
* Ian Craggs - change Timer member initialization to avoid copy constructor
*******************************************************************************/
#if !defined(MQTT_MBED_H)
#define MQTT_MBED_H
#include "mbed.h"
class Countdown
{
public:
Countdown() : t()
{
}
Countdown(int ms) : t()
{
countdown_ms(ms);
}
bool expired()
{
return t.read_ms() >= interval_end_ms;
}
void countdown_ms(unsigned long ms)
{
t.stop();
interval_end_ms = ms;
t.reset();
t.start();
}
void countdown(int seconds)
{
countdown_ms((unsigned long)seconds * 1000L);
}
int left_ms()
{
return interval_end_ms - t.read_ms();
}
private:
Timer t;
unsigned long interval_end_ms;
};
#endif