diff --git a/README.md b/README.md index ec8ed7d..cde0fb6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ +#This my HACK version +This is my development version ... please see the original authors code https://github.com/Coopdis/easyMesh + +This branch of the easyMesh Library is for setting all of the mesh nodes to have one (the same) SSID instead of embbeding the chipid within the SSID of each node. This is accomplished by using part (the last 4 octets) of the bssid(mac address) of the AP wireless interface of each node to poulate a uint32 interger that is used for the unique node id. + +![Encode easyMesh NodeId](/easymesh_nodeid.png?raw=true "Encode easyMesh NodeId") + +I have tested setting all APs to a single IP address ... but it didn't work ...the two nodes stop responding to one another ... although the client wifi device connectes fine ... + #Intro to easyMesh easyMesh is a library that takes care of the particulars for creating a simple mesh network using Arduino and esp8266. The goal is to allow the programmer to work with a mesh network without having to worry about how the network is structured or managed. @@ -11,7 +20,7 @@ easyMesh uses JSON objects for all its messaging. There a couple of reasons for easyMesh is designed to be used with Arduino, but it does not use the Arduino WiFi libraries, as I was running into performance issues (primarily latency) with them. Rather the networking is all done using the native esp8266 SDK libraries, which are available through the Arduino IDE. Hopefully though, which networking libraries are used won’t matter to most users much as you can just include the .h, run the init() and then work the library through the API. ###easyMesh is not IP networking -easyMesh does not create a TCP/IP network of nodes. Rather each of the nodes is uniquely identified by its 32bit chipId which is retrieved from the esp8266 using the system_get_chip_id() call in the SDK. Every esp8266 will have a unique number. Messages can either be broadcast to all of the nodes on the mesh, or sent specifically to an individual node which is identified by its chipId. +easyMesh does not create a TCP/IP network of nodes. Rather each of the nodes is uniquely identified by its 32bit nodeId which is retrieved from the esp8266 using the wifi_get_macaddr(SOFTAP_IF) call from the SDK and encoding it into a 32bit interger. Every esp8266 will have a unique number. Messages can either be broadcast to all of the nodes on the mesh, or sent specifically to an individual node which is identified by its nodeId. ###Examples demoToy is currently the only example. It is kind of complex, uses a web server, web sockets, and neopixel animations, so it is not really a great entry level example. That said, it does some pretty cools stuff… here is a video of the demo. @@ -35,14 +44,14 @@ easyMesh mesh; ##Member Functions -###void easyMesh::init( String prefix, String password, uint16_t port ) +###void easyMesh::init( String ssid, String password, uint16_t port ) Add this to your setup() function. Initialize the mesh network. This routine does the following things… - Starts a wifi network - Begins searching for other wifi networks that are part of the mesh - Logs on to the best mesh network node it finds… if it doesn’t find anything, it starts a new search in 5 seconds. -prefix = the name of your mesh. The wifi ssid of this node will be prefix + chipId +ssid = the ssid of your mesh. password = wifi password to your mesh port = the TCP port that you want the mesh server to run on @@ -87,8 +96,8 @@ returns true if everything works, false if not. Prints an error message to Seri ###uint16_t easyMesh::connectionCount() Returns the total number of nodes connected to this mesh. -###uint32_t easyMesh::getChipId( void ) -Return the chipId of the node that we are running on. +###uint32_t easyMesh::getNodeId( void ) +Return the nodeId of the node that we are running on. ###uint32_t easyMesh::getNodeTime( void ) Returns the mesh timebase microsecond counter. Rolls over 71 minutes from startup of the first node. diff --git a/docs/html/annotated.html b/docs/html/annotated.html new file mode 100644 index 0000000..c102f00 --- /dev/null +++ b/docs/html/annotated.html @@ -0,0 +1,126 @@ + + + + + + +easyMesh: Class List + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+ All Classes Files Functions Variables Enumerations Enumerator Macros
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
+
+ + + + diff --git a/docs/html/annotated.js b/docs/html/annotated.js new file mode 100644 index 0000000..d2b8aab --- /dev/null +++ b/docs/html/annotated.js @@ -0,0 +1,6 @@ +var annotated = +[ + [ "easyMesh", "classeasy_mesh.html", "classeasy_mesh" ], + [ "meshConnectionType", "structmesh_connection_type.html", "structmesh_connection_type" ], + [ "timeSync", "classtime_sync.html", "classtime_sync" ] +]; \ No newline at end of file diff --git a/docs/html/bc_s.png b/docs/html/bc_s.png new file mode 100644 index 0000000..224b29a Binary files /dev/null and b/docs/html/bc_s.png differ diff --git a/docs/html/bdwn.png b/docs/html/bdwn.png new file mode 100644 index 0000000..940a0b9 Binary files /dev/null and b/docs/html/bdwn.png differ diff --git a/docs/html/classeasy_mesh-members.html b/docs/html/classeasy_mesh-members.html new file mode 100644 index 0000000..ad2cb7c --- /dev/null +++ b/docs/html/classeasy_mesh-members.html @@ -0,0 +1,184 @@ + + + + + + +easyMesh: Member List + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+ All Classes Files Functions Variables Enumerations Enumerator Macros
+ + +
+ +
+ +
+
+
easyMesh Member List
+
+
+ +

This is the complete list of members for easyMesh, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
_connectionseasyMesh
_meshAPseasyMesh
_meshAuthModeeasyMeshprotected
_meshChanneleasyMeshprotected
_meshHiddeneasyMeshprotected
_meshMaxConneasyMeshprotected
_meshPasswordeasyMeshprotected
_meshPorteasyMeshprotected
_meshServerConneasyMeshprotected
_meshServerTcpeasyMeshprotected
_meshSSIDeasyMeshprotected
_nodeIdeasyMeshprotected
_nodeStatuseasyMesh
_scanStatuseasyMesh
_scanTimereasyMeshprotected
_stationConneasyMeshprotected
_stationTcpeasyMeshprotected
adoptionCalc(meshConnectionType *conn)easyMeshprotected
apInit(void)easyMeshprotected
broadcastMessage(uint32_t fromId, meshPackageType type, String &msg, meshConnectionType *exclude=NULL)easyMeshprotected
buildMeshPackage(uint32_t destId, meshPackageType type, String &msg)easyMeshprotected
cleanDeadConnections(void)easyMeshprotected
closeConnection(meshConnectionType *conn)easyMeshprotected
connectionCount(meshConnectionType *exclude=NULL)easyMesh
connectToBestAP(void)easyMeshprotected
debugMsg(debugType type, const char *format...)easyMesh
encodeNodeId(uint8_t *hwaddr)easyMeshprotected
findConnection(uint32_t nodeId)easyMeshprotected
findConnection(espconn *conn)easyMeshprotected
getNodeId(void)easyMeshinline
getNodeTime(void)easyMesh
handleNodeSync(meshConnectionType *conn, JsonObject &root)easyMeshprotected
handleTimeSync(meshConnectionType *conn, JsonObject &root)easyMeshprotected
init(String ssid, String password, uint16_t port, _auth_mode authmode=AUTH_WPA2_PSK, uint8_t channel=0, phy_mode_t phymode=PHY_MODE_11G, uint8_t maxtpw=82, uint8_t hidden=0, uint8_t maxconn=4)easyMesh
jsonSubConnCount(String &subConns)easyMeshprotected
manageConnections(void)easyMeshprotected
manageStation(void)easyMeshprotected
meshConnectedCb(void *arg)easyMeshprotectedstatic
meshDisconCb(void *arg)easyMeshprotectedstatic
meshReconCb(void *arg, sint8 err)easyMeshprotectedstatic
meshRecvCb(void *arg, char *data, unsigned short length)easyMeshprotectedstatic
meshSentCb(void *arg)easyMeshprotectedstatic
scanTimerCallback(void *arg)easyMeshprotectedstatic
sendBroadcast(String &msg)easyMesh
sendMessage(meshConnectionType *conn, uint32_t destId, meshPackageType type, String &msg)easyMeshprotected
sendMessage(uint32_t destId, meshPackageType type, String &msg)easyMeshprotected
sendPackage(meshConnectionType *connection, String &package)easyMeshprotected
sendSingle(uint32_t &destId, String &msg)easyMesh
setDebugMsgTypes(uint16_t types)easyMesh
setNewConnectionCallback(void(*onNewConnection)(bool adopt))easyMesh
setReceiveCallback(void(*onReceive)(uint32_t from, String &msg))easyMesh
startNodeSync(meshConnectionType *conn)easyMeshprotected
startStationScan(void)easyMeshprotected
startTimeSync(meshConnectionType *conn)easyMeshprotected
stationConnect(void)easyMeshprotected
stationInit(void)easyMeshprotected
stationScanCb(void *arg, STATUS status)easyMeshprotectedstatic
subConnectionJson(meshConnectionType *exclude)easyMeshprotected
tcpConnect(void)easyMeshprotected
tcpServerInit(espconn &serverConn, esp_tcp &serverTcp, espconn_connect_callback connectCb, uint32 port)easyMeshprotected
update(void)easyMesh
wifiEventCb(System_Event_t *event)easyMeshprotectedstatic
+
+ + + + diff --git a/docs/html/classeasy_mesh.html b/docs/html/classeasy_mesh.html new file mode 100644 index 0000000..e431c07 --- /dev/null +++ b/docs/html/classeasy_mesh.html @@ -0,0 +1,2605 @@ + + + + + + +easyMesh: easyMesh Class Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+ All Classes Files Functions Variables Enumerations Enumerator Macros
+ + +
+ +
+ +
+ +
+
easyMesh Class Reference
+
+
+ +

#include <easyMesh.h>

+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

uint32_t getNodeId (void)
 
void setDebugMsgTypes (uint16_t types)
 
void debugMsg (debugType type, const char *format...)
 
void init (String ssid, String password, uint16_t port, _auth_mode authmode=AUTH_WPA2_PSK, uint8_t channel=0, phy_mode_t phymode=PHY_MODE_11G, uint8_t maxtpw=82, uint8_t hidden=0, uint8_t maxconn=4)
 
void update (void)
 
bool sendSingle (uint32_t &destId, String &msg)
 
bool sendBroadcast (String &msg)
 
void setReceiveCallback (void(*onReceive)(uint32_t from, String &msg))
 
void setNewConnectionCallback (void(*onNewConnection)(bool adopt))
 
uint16_t connectionCount (meshConnectionType *exclude=NULL)
 
uint32_t getNodeTime (void)
 
+ + + + + + + + + +

+Public Attributes

scanStatusType _scanStatus = IDLE
 
nodeStatusType _nodeStatus = INITIALIZING
 
SimpleList< bss_info > _meshAPs
 
SimpleList< meshConnectionType_connections
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

bool sendMessage (meshConnectionType *conn, uint32_t destId, meshPackageType type, String &msg)
 
bool sendMessage (uint32_t destId, meshPackageType type, String &msg)
 
bool broadcastMessage (uint32_t fromId, meshPackageType type, String &msg, meshConnectionType *exclude=NULL)
 
bool sendPackage (meshConnectionType *connection, String &package)
 
String buildMeshPackage (uint32_t destId, meshPackageType type, String &msg)
 
void startNodeSync (meshConnectionType *conn)
 
void handleNodeSync (meshConnectionType *conn, JsonObject &root)
 
void startTimeSync (meshConnectionType *conn)
 
void handleTimeSync (meshConnectionType *conn, JsonObject &root)
 
bool adoptionCalc (meshConnectionType *conn)
 
void manageConnections (void)
 
String subConnectionJson (meshConnectionType *exclude)
 
meshConnectionTypefindConnection (uint32_t nodeId)
 
meshConnectionTypefindConnection (espconn *conn)
 
void cleanDeadConnections (void)
 
void tcpConnect (void)
 
bool connectToBestAP (void)
 
uint16_t jsonSubConnCount (String &subConns)
 
meshConnectionTypecloseConnection (meshConnectionType *conn)
 
void manageStation (void)
 
void stationInit (void)
 
bool stationConnect (void)
 
void startStationScan (void)
 
uint32_t encodeNodeId (uint8_t *hwaddr)
 
void apInit (void)
 
void tcpServerInit (espconn &serverConn, esp_tcp &serverTcp, espconn_connect_callback connectCb, uint32 port)
 
+ + + + + + + + + + + + + + + + + +

+Static Protected Member Functions

static void stationScanCb (void *arg, STATUS status)
 
static void scanTimerCallback (void *arg)
 
static void wifiEventCb (System_Event_t *event)
 
static void meshConnectedCb (void *arg)
 
static void meshSentCb (void *arg)
 
static void meshRecvCb (void *arg, char *data, unsigned short length)
 
static void meshDisconCb (void *arg)
 
static void meshReconCb (void *arg, sint8 err)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Attributes

uint32_t _nodeId
 
String _meshSSID
 
String _meshPassword
 
uint16_t _meshPort
 
uint8_t _meshChannel
 
_auth_mode _meshAuthMode
 
uint8_t _meshHidden
 
uint8_t _meshMaxConn
 
os_timer_t _scanTimer
 
espconn _meshServerConn
 
esp_tcp _meshServerTcp
 
espconn _stationConn
 
esp_tcp _stationTcp
 
+

Detailed Description

+
+

Definition at line 89 of file easyMesh.h.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
bool ICACHE_FLASH_ATTR easyMesh::adoptionCalc (meshConnectionTypeconn)
+
+protected
+
+ +

Definition at line 197 of file easyMeshSync.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::apInit (void )
+
+protected
+
+ +

Definition at line 21 of file easyMeshAP.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bool ICACHE_FLASH_ATTR easyMesh::broadcastMessage (uint32_t fromId,
meshPackageType type,
String & msg,
meshConnectionTypeexclude = NULL 
)
+
+protected
+
+ +

Definition at line 45 of file easyMeshComm.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
String ICACHE_FLASH_ATTR easyMesh::buildMeshPackage (uint32_t destId,
meshPackageType type,
String & msg 
)
+
+protected
+
+ +

Definition at line 94 of file easyMeshComm.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void easyMesh::cleanDeadConnections (void )
+
+protected
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
meshConnectionType *ICACHE_FLASH_ATTR easyMesh::closeConnection (meshConnectionTypeconn)
+
+protected
+
+ +

Definition at line 39 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + +
uint16_t ICACHE_FLASH_ATTR easyMesh::connectionCount (meshConnectionTypeexclude = NULL)
+
+ +

Definition at line 197 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool ICACHE_FLASH_ATTR easyMesh::connectToBestAP (void )
+
+protected
+
+ +

Definition at line 123 of file easyMeshSTA.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void easyMesh::debugMsg (debugType type,
const char * format... 
)
+
+ +

Definition at line 22 of file easyMeshDebug.cpp.

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
uint32_t ICACHE_FLASH_ATTR easyMesh::encodeNodeId (uint8_t * hwaddr)
+
+protected
+
+ +

Definition at line 230 of file easyMeshSTA.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
meshConnectionType *ICACHE_FLASH_ATTR easyMesh::findConnection (uint32_t nodeId)
+
+protected
+
+ +

Definition at line 115 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
meshConnectionType *ICACHE_FLASH_ATTR easyMesh::findConnection (espconn * conn)
+
+protected
+
+ +

Definition at line 139 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
uint32_t easyMesh::getNodeId (void )
+
+inline
+
+ +

Definition at line 92 of file easyMesh.h.

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + +
uint32_t ICACHE_FLASH_ATTR easyMesh::getNodeTime (void )
+
+ +

Definition at line 13 of file easyMeshSync.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::handleNodeSync (meshConnectionTypeconn,
JsonObject & root 
)
+
+protected
+
+ +

Definition at line 119 of file easyMeshSync.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::handleTimeSync (meshConnectionTypeconn,
JsonObject & root 
)
+
+protected
+
+ +

Definition at line 211 of file easyMeshSync.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::init (String ssid,
String password,
uint16_t port,
_auth_mode authmode = AUTH_WPA2_PSK,
uint8_t channel = 0,
phy_mode_t phymode = PHY_MODE_11G,
uint8_t maxtpw = 82,
uint8_t hidden = 0,
uint8_t maxconn = 4 
)
+
+ +

Definition at line 48 of file easyMesh.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
uint16_t ICACHE_FLASH_ATTR easyMesh::jsonSubConnCount (String & subConns)
+
+protected
+
+ +

Definition at line 213 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::manageConnections (void )
+
+protected
+
+ +

Definition at line 48 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::manageStation (void )
+
+protected
+
+ +

Definition at line 32 of file easyMeshSTA.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::meshConnectedCb (void * arg)
+
+staticprotected
+
+ +

Definition at line 247 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::meshDisconCb (void * arg)
+
+staticprotected
+
+ +

Definition at line 358 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::meshReconCb (void * arg,
sint8 err 
)
+
+staticprotected
+
+ +

Definition at line 377 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::meshRecvCb (void * arg,
char * data,
unsigned short length 
)
+
+staticprotected
+
+ +

Definition at line 273 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::meshSentCb (void * arg)
+
+staticprotected
+
+ +

Definition at line 333 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::scanTimerCallback (void * arg)
+
+staticprotected
+
+ +

Definition at line 96 of file easyMeshSTA.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + +
bool ICACHE_FLASH_ATTR easyMesh::sendBroadcast (String & msg)
+
+ +

Definition at line 102 of file easyMesh.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bool ICACHE_FLASH_ATTR easyMesh::sendMessage (meshConnectionTypeconn,
uint32_t destId,
meshPackageType type,
String & msg 
)
+
+protected
+
+ +

Definition at line 19 of file easyMeshComm.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool ICACHE_FLASH_ATTR easyMesh::sendMessage (uint32_t destId,
meshPackageType type,
String & msg 
)
+
+protected
+
+ +

Definition at line 29 of file easyMeshComm.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool ICACHE_FLASH_ATTR easyMesh::sendPackage (meshConnectionTypeconnection,
String & package 
)
+
+protected
+
+ +

Definition at line 70 of file easyMeshComm.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool ICACHE_FLASH_ATTR easyMesh::sendSingle (uint32_t & destId,
String & msg 
)
+
+ +

Definition at line 96 of file easyMesh.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + +
void easyMesh::setDebugMsgTypes (uint16_t types)
+
+ +

Definition at line 16 of file easyMeshDebug.cpp.

+ +
+
+ +
+
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::setNewConnectionCallback (void(*)(bool adopt) onNewConnection)
+
+ +

Definition at line 33 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::setReceiveCallback (void(*)(uint32_t from, String &msg) onReceive)
+
+ +

Definition at line 27 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::startNodeSync (meshConnectionTypeconn)
+
+protected
+
+ +

Definition at line 109 of file easyMeshSync.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::startStationScan (void )
+
+protected
+
+ +

Definition at line 69 of file easyMeshSTA.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::startTimeSync (meshConnectionTypeconn)
+
+protected
+
+ +

Definition at line 178 of file easyMeshSync.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool easyMesh::stationConnect (void )
+
+protected
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::stationInit (void )
+
+protected
+
+ +

Definition at line 25 of file easyMeshSTA.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::stationScanCb (void * arg,
STATUS status 
)
+
+staticprotected
+
+ +

Definition at line 103 of file easyMeshSTA.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
String ICACHE_FLASH_ATTR easyMesh::subConnectionJson (meshConnectionTypeexclude)
+
+protected
+
+ +

Definition at line 157 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::tcpConnect (void )
+
+protected
+
+ +

Definition at line 185 of file easyMeshSTA.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::tcpServerInit (espconn & serverConn,
esp_tcp & serverTcp,
espconn_connect_callback connectCb,
uint32 port 
)
+
+protected
+
+ +

Definition at line 68 of file easyMeshAP.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::update (void )
+
+ +

Definition at line 89 of file easyMesh.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ICACHE_FLASH_ATTR easyMesh::wifiEventCb (System_Event_t * event)
+
+staticprotected
+
+ +

Definition at line 382 of file easyMeshConnection.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
SimpleList<meshConnectionType> easyMesh::_connections
+
+ +

Definition at line 117 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
SimpleList<bss_info> easyMesh::_meshAPs
+
+ +

Definition at line 116 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
_auth_mode easyMesh::_meshAuthMode
+
+protected
+
+ +

Definition at line 179 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
uint8_t easyMesh::_meshChannel
+
+protected
+
+ +

Definition at line 178 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
uint8_t easyMesh::_meshHidden
+
+protected
+
+ +

Definition at line 180 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
uint8_t easyMesh::_meshMaxConn
+
+protected
+
+ +

Definition at line 181 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
String easyMesh::_meshPassword
+
+protected
+
+ +

Definition at line 176 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
uint16_t easyMesh::_meshPort
+
+protected
+
+ +

Definition at line 177 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
espconn easyMesh::_meshServerConn
+
+protected
+
+ +

Definition at line 185 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
esp_tcp easyMesh::_meshServerTcp
+
+protected
+
+ +

Definition at line 186 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
String easyMesh::_meshSSID
+
+protected
+
+ +

Definition at line 175 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
uint32_t easyMesh::_nodeId
+
+protected
+
+ +

Definition at line 174 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
nodeStatusType easyMesh::_nodeStatus = INITIALIZING
+
+ +

Definition at line 115 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
scanStatusType easyMesh::_scanStatus = IDLE
+
+ +

Definition at line 114 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
os_timer_t easyMesh::_scanTimer
+
+protected
+
+ +

Definition at line 183 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
espconn easyMesh::_stationConn
+
+protected
+
+ +

Definition at line 188 of file easyMesh.h.

+ +
+
+ +
+
+ + + + + +
+ + + + +
esp_tcp easyMesh::_stationTcp
+
+protected
+
+ +

Definition at line 189 of file easyMesh.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/docs/html/classeasy_mesh.js b/docs/html/classeasy_mesh.js new file mode 100644 index 0000000..5cc386a --- /dev/null +++ b/docs/html/classeasy_mesh.js @@ -0,0 +1,57 @@ +var classeasy_mesh = +[ + [ "adoptionCalc", "classeasy_mesh.html#a9f4349c6be8530e4d852b68183a9ff19", null ], + [ "apInit", "classeasy_mesh.html#af54a031211182ed77edb9695725ec03b", null ], + [ "broadcastMessage", "classeasy_mesh.html#a0de9f46c53e5b66236f0e850aa8ea85c", null ], + [ "buildMeshPackage", "classeasy_mesh.html#a04880721e3c916c3eff9373fdd6f1d23", null ], + [ "cleanDeadConnections", "classeasy_mesh.html#ae84c266e9e3ba7699ca8f3656e3195cc", null ], + [ "closeConnection", "classeasy_mesh.html#a7afcf120bcd05a1b329757a4fb5d6f3b", null ], + [ "connectionCount", "classeasy_mesh.html#ad86a28d45d33678d20d3afe4db634af2", null ], + [ "connectToBestAP", "classeasy_mesh.html#a3bb657241b72bfb7b3c597cff5fc93c7", null ], + [ "debugMsg", "classeasy_mesh.html#ad0acddc98f89b0b8dba7c38e60f9ea70", null ], + [ "encodeNodeId", "classeasy_mesh.html#a67727e2bcdb99c3882760106995aba5b", null ], + [ "findConnection", "classeasy_mesh.html#a8ec70e5cf7328a1331d7cb739d9ec36d", null ], + [ "findConnection", "classeasy_mesh.html#a9a104c954548ddf430fd5e829bdb7981", null ], + [ "getNodeId", "classeasy_mesh.html#a43941bbf1d5330cfd9c718d29ab951e4", null ], + [ "getNodeTime", "classeasy_mesh.html#a4c09493309363193bdd9f87ac715f8ad", null ], + [ "handleNodeSync", "classeasy_mesh.html#a8032b73d6b108d98eb4bdc4dde216325", null ], + [ "handleTimeSync", "classeasy_mesh.html#ae3faf49428321ce602daf33d14d72fcb", null ], + [ "init", "classeasy_mesh.html#ab4d86723fd9bbb34b9a2a25732c014b5", null ], + [ "jsonSubConnCount", "classeasy_mesh.html#af71b90d4f94b0007128c82a268ef7b49", null ], + [ "manageConnections", "classeasy_mesh.html#ad88d5afea9f7635c4412b34dfb7d8cb1", null ], + [ "manageStation", "classeasy_mesh.html#a3366c5ae7ff3819e65d371a668f7bfa1", null ], + [ "sendBroadcast", "classeasy_mesh.html#aac55f83f10ff79303a70bc113b496990", null ], + [ "sendMessage", "classeasy_mesh.html#a2932fef62e8ed3dd7167b33cdee54df1", null ], + [ "sendMessage", "classeasy_mesh.html#a358d11e4923393b6f497a93d52bbc0e5", null ], + [ "sendPackage", "classeasy_mesh.html#a397119595eda5269565b2169bed8f085", null ], + [ "sendSingle", "classeasy_mesh.html#a9a8d07378b879f7d6a3d6c292ae21172", null ], + [ "setDebugMsgTypes", "classeasy_mesh.html#af1ba3f2013a23bcfd5ad83a5d6eb4cd3", null ], + [ "setNewConnectionCallback", "classeasy_mesh.html#a2a5ebbd02f7cfb9c7f46f7d9776c4124", null ], + [ "setReceiveCallback", "classeasy_mesh.html#a03276020321bf2ca916f72ec91ddf80b", null ], + [ "startNodeSync", "classeasy_mesh.html#adab4f3dfda850f697a9287aa9649bb7d", null ], + [ "startStationScan", "classeasy_mesh.html#ad3a2c02205c0071ba6fdbc8eecbe5ffc", null ], + [ "startTimeSync", "classeasy_mesh.html#a48fafa71748d15fd0b804299d05d9bbb", null ], + [ "stationConnect", "classeasy_mesh.html#aecbca6f7b6af44a4ed1613ae5bd94a1e", null ], + [ "stationInit", "classeasy_mesh.html#a27aa8a3504e20baaa93fa6775e795c55", null ], + [ "subConnectionJson", "classeasy_mesh.html#adc34836b6bfb1b6a6748607e2d85e0d1", null ], + [ "tcpConnect", "classeasy_mesh.html#ab020ed8e53720b859e1cf05601e61bfb", null ], + [ "tcpServerInit", "classeasy_mesh.html#a1acb3a0babbe910aca13509e62f8b955", null ], + [ "update", "classeasy_mesh.html#add9de4d83e908cf55fe8c122c5fa38a1", null ], + [ "_connections", "classeasy_mesh.html#a19e8ccec0f39c34b31039a4b9508916c", null ], + [ "_meshAPs", "classeasy_mesh.html#a795cd58cad030c8b1606aa559aaa678a", null ], + [ "_meshAuthMode", "classeasy_mesh.html#a89b9fe9430c7240cba578104f09d097f", null ], + [ "_meshChannel", "classeasy_mesh.html#acb4f055be16e17e2aa7a1f4cb7930b32", null ], + [ "_meshHidden", "classeasy_mesh.html#a8ecbfc7355636c4090241361841ea96a", null ], + [ "_meshMaxConn", "classeasy_mesh.html#ad2fd11a255f8e5617656a7474837d9e5", null ], + [ "_meshPassword", "classeasy_mesh.html#a3f9c84c9a1957f8ecdc4c8d86d485269", null ], + [ "_meshPort", "classeasy_mesh.html#a2eece0b10f63d2ec5e37566eee625164", null ], + [ "_meshServerConn", "classeasy_mesh.html#ae11ba0cb9dac556dd421f02853210d61", null ], + [ "_meshServerTcp", "classeasy_mesh.html#a25daab837484c45ed6a462a9c4b7a019", null ], + [ "_meshSSID", "classeasy_mesh.html#ad8cea5d69ca592ccfb6087ccef0a16b1", null ], + [ "_nodeId", "classeasy_mesh.html#a9696b227665f0f0cd71616e72481dc77", null ], + [ "_nodeStatus", "classeasy_mesh.html#a12833f1fc63fdef5a03eaed14f98d0a2", null ], + [ "_scanStatus", "classeasy_mesh.html#a3bd28e5b9ea8eb79a77e50a626f38e41", null ], + [ "_scanTimer", "classeasy_mesh.html#a050bb825d50129359ea03849cd2fa12f", null ], + [ "_stationConn", "classeasy_mesh.html#acc8178a4847247cf4e864c51eef97ec2", null ], + [ "_stationTcp", "classeasy_mesh.html#af4ee44463d4e6b6d8de6da8d283bc2c8", null ] +]; \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a03276020321bf2ca916f72ec91ddf80b_cgraph.map b/docs/html/classeasy_mesh_a03276020321bf2ca916f72ec91ddf80b_cgraph.map new file mode 100644 index 0000000..bfbb724 --- /dev/null +++ b/docs/html/classeasy_mesh_a03276020321bf2ca916f72ec91ddf80b_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a03276020321bf2ca916f72ec91ddf80b_cgraph.md5 b/docs/html/classeasy_mesh_a03276020321bf2ca916f72ec91ddf80b_cgraph.md5 new file mode 100644 index 0000000..966e8c5 --- /dev/null +++ b/docs/html/classeasy_mesh_a03276020321bf2ca916f72ec91ddf80b_cgraph.md5 @@ -0,0 +1 @@ +51f8c0f886e98a256dd8aa023f0a13ca \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a03276020321bf2ca916f72ec91ddf80b_cgraph.png b/docs/html/classeasy_mesh_a03276020321bf2ca916f72ec91ddf80b_cgraph.png new file mode 100644 index 0000000..26e9d03 Binary files /dev/null and b/docs/html/classeasy_mesh_a03276020321bf2ca916f72ec91ddf80b_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a04880721e3c916c3eff9373fdd6f1d23_cgraph.map b/docs/html/classeasy_mesh_a04880721e3c916c3eff9373fdd6f1d23_cgraph.map new file mode 100644 index 0000000..de4a8bc --- /dev/null +++ b/docs/html/classeasy_mesh_a04880721e3c916c3eff9373fdd6f1d23_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a04880721e3c916c3eff9373fdd6f1d23_cgraph.md5 b/docs/html/classeasy_mesh_a04880721e3c916c3eff9373fdd6f1d23_cgraph.md5 new file mode 100644 index 0000000..89d2a80 --- /dev/null +++ b/docs/html/classeasy_mesh_a04880721e3c916c3eff9373fdd6f1d23_cgraph.md5 @@ -0,0 +1 @@ +fea97a59c85a73bd98a10eaf889ef2e1 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a04880721e3c916c3eff9373fdd6f1d23_cgraph.png b/docs/html/classeasy_mesh_a04880721e3c916c3eff9373fdd6f1d23_cgraph.png new file mode 100644 index 0000000..8e6d303 Binary files /dev/null and b/docs/html/classeasy_mesh_a04880721e3c916c3eff9373fdd6f1d23_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_cgraph.map b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_cgraph.map new file mode 100644 index 0000000..711cc35 --- /dev/null +++ b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_cgraph.md5 b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_cgraph.md5 new file mode 100644 index 0000000..ac75245 --- /dev/null +++ b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_cgraph.md5 @@ -0,0 +1 @@ +77d2737effd331f8268f985ea1115ae5 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_cgraph.png b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_cgraph.png new file mode 100644 index 0000000..a26c730 Binary files /dev/null and b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_icgraph.map b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_icgraph.map new file mode 100644 index 0000000..83d8bdf --- /dev/null +++ b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_icgraph.md5 b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_icgraph.md5 new file mode 100644 index 0000000..74b4e27 --- /dev/null +++ b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_icgraph.md5 @@ -0,0 +1 @@ +cffaec7c663a2f0edaa45f7209c12436 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_icgraph.png b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_icgraph.png new file mode 100644 index 0000000..946f526 Binary files /dev/null and b/docs/html/classeasy_mesh_a0de9f46c53e5b66236f0e850aa8ea85c_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_cgraph.map b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_cgraph.map new file mode 100644 index 0000000..bbd6443 --- /dev/null +++ b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_cgraph.md5 b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_cgraph.md5 new file mode 100644 index 0000000..bf29239 --- /dev/null +++ b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_cgraph.md5 @@ -0,0 +1 @@ +1f893e9deacebabd0907c9a6f6c26f03 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_cgraph.png b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_cgraph.png new file mode 100644 index 0000000..f406bcd Binary files /dev/null and b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_icgraph.map b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_icgraph.map new file mode 100644 index 0000000..a4cc4a6 --- /dev/null +++ b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_icgraph.md5 b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_icgraph.md5 new file mode 100644 index 0000000..4f437d7 --- /dev/null +++ b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_icgraph.md5 @@ -0,0 +1 @@ +272edd6abd691f79ebde6e468087124b \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_icgraph.png b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_icgraph.png new file mode 100644 index 0000000..5632940 Binary files /dev/null and b/docs/html/classeasy_mesh_a1acb3a0babbe910aca13509e62f8b955_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_cgraph.map b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_cgraph.map new file mode 100644 index 0000000..c0b42fd --- /dev/null +++ b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_cgraph.md5 b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_cgraph.md5 new file mode 100644 index 0000000..42aafd4 --- /dev/null +++ b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_cgraph.md5 @@ -0,0 +1 @@ +0ef2ac94d5cd6c4e64fa854d1fccb4b9 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_cgraph.png b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_cgraph.png new file mode 100644 index 0000000..927eac4 Binary files /dev/null and b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_icgraph.map b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_icgraph.map new file mode 100644 index 0000000..26a92d9 --- /dev/null +++ b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_icgraph.md5 b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_icgraph.md5 new file mode 100644 index 0000000..09b5cc3 --- /dev/null +++ b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_icgraph.md5 @@ -0,0 +1 @@ +0e83f27aed5b100673b8868251981d11 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_icgraph.png b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_icgraph.png new file mode 100644 index 0000000..d1730aa Binary files /dev/null and b/docs/html/classeasy_mesh_a25f74f2bc03bd25b0c7906aee2116cae_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_cgraph.map b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_cgraph.map new file mode 100644 index 0000000..68699e9 --- /dev/null +++ b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_cgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_cgraph.md5 b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_cgraph.md5 new file mode 100644 index 0000000..82fb86f --- /dev/null +++ b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_cgraph.md5 @@ -0,0 +1 @@ +70334b57a74599483e5920535b4d17cf \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_cgraph.png b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_cgraph.png new file mode 100644 index 0000000..ff827fc Binary files /dev/null and b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_icgraph.map b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_icgraph.map new file mode 100644 index 0000000..c9d8916 --- /dev/null +++ b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_icgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_icgraph.md5 b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_icgraph.md5 new file mode 100644 index 0000000..172293f --- /dev/null +++ b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_icgraph.md5 @@ -0,0 +1 @@ +170be3f34c5f460947b9b079111a5106 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_icgraph.png b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_icgraph.png new file mode 100644 index 0000000..18e18b6 Binary files /dev/null and b/docs/html/classeasy_mesh_a27aa8a3504e20baaa93fa6775e795c55_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_cgraph.map b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_cgraph.map new file mode 100644 index 0000000..265044f --- /dev/null +++ b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_cgraph.md5 b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_cgraph.md5 new file mode 100644 index 0000000..faee246 --- /dev/null +++ b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_cgraph.md5 @@ -0,0 +1 @@ +a767eb79ab17c99f514b6ed61ebc95d0 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_cgraph.png b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_cgraph.png new file mode 100644 index 0000000..aa84c5e Binary files /dev/null and b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_icgraph.map b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_icgraph.map new file mode 100644 index 0000000..98fa458 --- /dev/null +++ b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_icgraph.map @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_icgraph.md5 b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_icgraph.md5 new file mode 100644 index 0000000..5781010 --- /dev/null +++ b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_icgraph.md5 @@ -0,0 +1 @@ +79ba735d9e3f6eb608ed69488b00324d \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_icgraph.png b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_icgraph.png new file mode 100644 index 0000000..1ed78ce Binary files /dev/null and b/docs/html/classeasy_mesh_a2932fef62e8ed3dd7167b33cdee54df1_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a2a5ebbd02f7cfb9c7f46f7d9776c4124_cgraph.map b/docs/html/classeasy_mesh_a2a5ebbd02f7cfb9c7f46f7d9776c4124_cgraph.map new file mode 100644 index 0000000..5b8b190 --- /dev/null +++ b/docs/html/classeasy_mesh_a2a5ebbd02f7cfb9c7f46f7d9776c4124_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a2a5ebbd02f7cfb9c7f46f7d9776c4124_cgraph.md5 b/docs/html/classeasy_mesh_a2a5ebbd02f7cfb9c7f46f7d9776c4124_cgraph.md5 new file mode 100644 index 0000000..5e8b977 --- /dev/null +++ b/docs/html/classeasy_mesh_a2a5ebbd02f7cfb9c7f46f7d9776c4124_cgraph.md5 @@ -0,0 +1 @@ +f0dda3c26d6f22e16987ba3dddb4e4d3 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a2a5ebbd02f7cfb9c7f46f7d9776c4124_cgraph.png b/docs/html/classeasy_mesh_a2a5ebbd02f7cfb9c7f46f7d9776c4124_cgraph.png new file mode 100644 index 0000000..0741ed6 Binary files /dev/null and b/docs/html/classeasy_mesh_a2a5ebbd02f7cfb9c7f46f7d9776c4124_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_cgraph.map b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_cgraph.map new file mode 100644 index 0000000..628d149 --- /dev/null +++ b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_cgraph.md5 b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_cgraph.md5 new file mode 100644 index 0000000..991889c --- /dev/null +++ b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_cgraph.md5 @@ -0,0 +1 @@ +4fe232add95c0ab2d5001f545c4d9fb9 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_cgraph.png b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_cgraph.png new file mode 100644 index 0000000..53892c7 Binary files /dev/null and b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_icgraph.map b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_icgraph.map new file mode 100644 index 0000000..922c022 --- /dev/null +++ b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_icgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_icgraph.md5 b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_icgraph.md5 new file mode 100644 index 0000000..3905bd5 --- /dev/null +++ b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_icgraph.md5 @@ -0,0 +1 @@ +e3ea13205a1c51244d40fb629a9b0054 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_icgraph.png b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_icgraph.png new file mode 100644 index 0000000..373ca16 Binary files /dev/null and b/docs/html/classeasy_mesh_a3366c5ae7ff3819e65d371a668f7bfa1_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a358d11e4923393b6f497a93d52bbc0e5_cgraph.map b/docs/html/classeasy_mesh_a358d11e4923393b6f497a93d52bbc0e5_cgraph.map new file mode 100644 index 0000000..61190bc --- /dev/null +++ b/docs/html/classeasy_mesh_a358d11e4923393b6f497a93d52bbc0e5_cgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/classeasy_mesh_a358d11e4923393b6f497a93d52bbc0e5_cgraph.md5 b/docs/html/classeasy_mesh_a358d11e4923393b6f497a93d52bbc0e5_cgraph.md5 new file mode 100644 index 0000000..be1cc8c --- /dev/null +++ b/docs/html/classeasy_mesh_a358d11e4923393b6f497a93d52bbc0e5_cgraph.md5 @@ -0,0 +1 @@ +dc99d56471ba0a56770618d61d4489b7 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a358d11e4923393b6f497a93d52bbc0e5_cgraph.png b/docs/html/classeasy_mesh_a358d11e4923393b6f497a93d52bbc0e5_cgraph.png new file mode 100644 index 0000000..e5324d5 Binary files /dev/null and b/docs/html/classeasy_mesh_a358d11e4923393b6f497a93d52bbc0e5_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_cgraph.map b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_cgraph.map new file mode 100644 index 0000000..ca5de02 --- /dev/null +++ b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_cgraph.md5 b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_cgraph.md5 new file mode 100644 index 0000000..6afbade --- /dev/null +++ b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_cgraph.md5 @@ -0,0 +1 @@ +98a141a6d123159dcedc867762cb9e96 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_cgraph.png b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_cgraph.png new file mode 100644 index 0000000..788fba2 Binary files /dev/null and b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_icgraph.map b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_icgraph.map new file mode 100644 index 0000000..99975fd --- /dev/null +++ b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_icgraph.map @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_icgraph.md5 b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_icgraph.md5 new file mode 100644 index 0000000..3805b9c --- /dev/null +++ b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_icgraph.md5 @@ -0,0 +1 @@ +c7ceb133ab2a4357e46d089a0652d0fe \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_icgraph.png b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_icgraph.png new file mode 100644 index 0000000..75561eb Binary files /dev/null and b/docs/html/classeasy_mesh_a397119595eda5269565b2169bed8f085_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_cgraph.map b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_cgraph.map new file mode 100644 index 0000000..7e16c83 --- /dev/null +++ b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_cgraph.md5 b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_cgraph.md5 new file mode 100644 index 0000000..d891bbb --- /dev/null +++ b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_cgraph.md5 @@ -0,0 +1 @@ +00b4cdd713e30baab83331205f6108d0 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_cgraph.png b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_cgraph.png new file mode 100644 index 0000000..84d1b91 Binary files /dev/null and b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_icgraph.map b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_icgraph.map new file mode 100644 index 0000000..7ec0db3 --- /dev/null +++ b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_icgraph.md5 b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_icgraph.md5 new file mode 100644 index 0000000..99bd452 --- /dev/null +++ b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_icgraph.md5 @@ -0,0 +1 @@ +cf29704cbd1069ec6972ab3f8a8a32fa \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_icgraph.png b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_icgraph.png new file mode 100644 index 0000000..5f7b8aa Binary files /dev/null and b/docs/html/classeasy_mesh_a3ab5c21d95dfabaab1fb48bb87c46a77_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_cgraph.map b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_cgraph.map new file mode 100644 index 0000000..6232cc4 --- /dev/null +++ b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_cgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_cgraph.md5 b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_cgraph.md5 new file mode 100644 index 0000000..d4ea467 --- /dev/null +++ b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_cgraph.md5 @@ -0,0 +1 @@ +1434935da05d4374916d73682301a43d \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_cgraph.png b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_cgraph.png new file mode 100644 index 0000000..8496920 Binary files /dev/null and b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_icgraph.map b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_icgraph.map new file mode 100644 index 0000000..2d71329 --- /dev/null +++ b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_icgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_icgraph.md5 b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_icgraph.md5 new file mode 100644 index 0000000..7ce6c90 --- /dev/null +++ b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_icgraph.md5 @@ -0,0 +1 @@ +b97b5d02aa6f68d7e3f483e4866dfc5c \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_icgraph.png b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_icgraph.png new file mode 100644 index 0000000..23cff7e Binary files /dev/null and b/docs/html/classeasy_mesh_a3bb657241b72bfb7b3c597cff5fc93c7_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_cgraph.map b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_cgraph.map new file mode 100644 index 0000000..39756de --- /dev/null +++ b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_cgraph.md5 b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_cgraph.md5 new file mode 100644 index 0000000..75398d6 --- /dev/null +++ b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_cgraph.md5 @@ -0,0 +1 @@ +600f714ddabde81c7f17c410d0c0d5ad \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_cgraph.png b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_cgraph.png new file mode 100644 index 0000000..bf61dc9 Binary files /dev/null and b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_icgraph.map b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_icgraph.map new file mode 100644 index 0000000..3bbb572 --- /dev/null +++ b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_icgraph.md5 b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_icgraph.md5 new file mode 100644 index 0000000..a11ac15 --- /dev/null +++ b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_icgraph.md5 @@ -0,0 +1 @@ +f640206adbe37b1387c650d78ff21deb \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_icgraph.png b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_icgraph.png new file mode 100644 index 0000000..ade5035 Binary files /dev/null and b/docs/html/classeasy_mesh_a41c3b2999dfc2bdbc2edf9670eec471e_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a43941bbf1d5330cfd9c718d29ab951e4_icgraph.map b/docs/html/classeasy_mesh_a43941bbf1d5330cfd9c718d29ab951e4_icgraph.map new file mode 100644 index 0000000..8a27739 --- /dev/null +++ b/docs/html/classeasy_mesh_a43941bbf1d5330cfd9c718d29ab951e4_icgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_a43941bbf1d5330cfd9c718d29ab951e4_icgraph.md5 b/docs/html/classeasy_mesh_a43941bbf1d5330cfd9c718d29ab951e4_icgraph.md5 new file mode 100644 index 0000000..42a88ec --- /dev/null +++ b/docs/html/classeasy_mesh_a43941bbf1d5330cfd9c718d29ab951e4_icgraph.md5 @@ -0,0 +1 @@ +05e821f91ec9240c4678b2b894ace9ff \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a43941bbf1d5330cfd9c718d29ab951e4_icgraph.png b/docs/html/classeasy_mesh_a43941bbf1d5330cfd9c718d29ab951e4_icgraph.png new file mode 100644 index 0000000..35978f7 Binary files /dev/null and b/docs/html/classeasy_mesh_a43941bbf1d5330cfd9c718d29ab951e4_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_cgraph.map b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_cgraph.map new file mode 100644 index 0000000..f348ea1 --- /dev/null +++ b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_cgraph.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_cgraph.md5 b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_cgraph.md5 new file mode 100644 index 0000000..1abf8d8 --- /dev/null +++ b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_cgraph.md5 @@ -0,0 +1 @@ +b2d1f3bd6662f6c3208871aebb9fcf86 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_cgraph.png b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_cgraph.png new file mode 100644 index 0000000..f95093e Binary files /dev/null and b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_icgraph.map b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_icgraph.map new file mode 100644 index 0000000..bd9d686 --- /dev/null +++ b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_icgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_icgraph.md5 b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_icgraph.md5 new file mode 100644 index 0000000..00ff6b0 --- /dev/null +++ b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_icgraph.md5 @@ -0,0 +1 @@ +93c3a415e2722276517fdb11bd9f787a \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_icgraph.png b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_icgraph.png new file mode 100644 index 0000000..ac206c6 Binary files /dev/null and b/docs/html/classeasy_mesh_a48fafa71748d15fd0b804299d05d9bbb_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_cgraph.map b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_cgraph.map new file mode 100644 index 0000000..87052e3 --- /dev/null +++ b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_cgraph.md5 b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_cgraph.md5 new file mode 100644 index 0000000..6585b85 --- /dev/null +++ b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_cgraph.md5 @@ -0,0 +1 @@ +c42ed847dc26bed7a544ceb5845c0508 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_cgraph.png b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_cgraph.png new file mode 100644 index 0000000..e60a3e6 Binary files /dev/null and b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_icgraph.map b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_icgraph.map new file mode 100644 index 0000000..dbcb757 --- /dev/null +++ b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_icgraph.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_icgraph.md5 b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_icgraph.md5 new file mode 100644 index 0000000..52abe58 --- /dev/null +++ b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_icgraph.md5 @@ -0,0 +1 @@ +173b93f97cb2fac03e02f58e37e92fa5 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_icgraph.png b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_icgraph.png new file mode 100644 index 0000000..92a4f91 Binary files /dev/null and b/docs/html/classeasy_mesh_a4c09493309363193bdd9f87ac715f8ad_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_cgraph.map b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_cgraph.map new file mode 100644 index 0000000..914b6d4 --- /dev/null +++ b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_cgraph.md5 b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_cgraph.md5 new file mode 100644 index 0000000..0bf7b14 --- /dev/null +++ b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_cgraph.md5 @@ -0,0 +1 @@ +db2a0e81cca77df68eaa3b2c9e0e1d61 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_cgraph.png b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_cgraph.png new file mode 100644 index 0000000..056166d Binary files /dev/null and b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_icgraph.map b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_icgraph.map new file mode 100644 index 0000000..5b8f048 --- /dev/null +++ b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_icgraph.md5 b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_icgraph.md5 new file mode 100644 index 0000000..181ea3e --- /dev/null +++ b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_icgraph.md5 @@ -0,0 +1 @@ +7a30b7eb4907dd7ef92dc4b991711c1e \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_icgraph.png b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_icgraph.png new file mode 100644 index 0000000..4685c1a Binary files /dev/null and b/docs/html/classeasy_mesh_a67727e2bcdb99c3882760106995aba5b_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_cgraph.map b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_cgraph.map new file mode 100644 index 0000000..664d064 --- /dev/null +++ b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_cgraph.md5 b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_cgraph.md5 new file mode 100644 index 0000000..f55bf6f --- /dev/null +++ b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_cgraph.md5 @@ -0,0 +1 @@ +2b4740a6f04074df4052a4ae194cacc1 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_cgraph.png b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_cgraph.png new file mode 100644 index 0000000..54d5a11 Binary files /dev/null and b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_icgraph.map b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_icgraph.map new file mode 100644 index 0000000..58c5aef --- /dev/null +++ b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_icgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_icgraph.png b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_icgraph.png new file mode 100644 index 0000000..f48e703 Binary files /dev/null and b/docs/html/classeasy_mesh_a7afcf120bcd05a1b329757a4fb5d6f3b_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_cgraph.map b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_cgraph.map new file mode 100644 index 0000000..7ba586a --- /dev/null +++ b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_cgraph.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_cgraph.md5 b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_cgraph.md5 new file mode 100644 index 0000000..475f15b --- /dev/null +++ b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_cgraph.md5 @@ -0,0 +1 @@ +3f7fb2bccb1bcbc5caf4e964531067b1 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_cgraph.png b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_cgraph.png new file mode 100644 index 0000000..0d296ce Binary files /dev/null and b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_icgraph.map b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_icgraph.map new file mode 100644 index 0000000..5c9bf7a --- /dev/null +++ b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_icgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_icgraph.md5 b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_icgraph.md5 new file mode 100644 index 0000000..3ec40c5 --- /dev/null +++ b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_icgraph.md5 @@ -0,0 +1 @@ +f8381fafd5c8a7c4e9d32666a39512ad \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_icgraph.png b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_icgraph.png new file mode 100644 index 0000000..e311d73 Binary files /dev/null and b/docs/html/classeasy_mesh_a8032b73d6b108d98eb4bdc4dde216325_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_cgraph.map b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_cgraph.map new file mode 100644 index 0000000..4b3bcaa --- /dev/null +++ b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_cgraph.map @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_cgraph.md5 b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_cgraph.md5 new file mode 100644 index 0000000..a8c4038 --- /dev/null +++ b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_cgraph.md5 @@ -0,0 +1 @@ +09aaa9d29b9f1b09ffd686c6d0bf4099 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_cgraph.png b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_cgraph.png new file mode 100644 index 0000000..02ecee5 Binary files /dev/null and b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_icgraph.map b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_icgraph.map new file mode 100644 index 0000000..4a5ace2 --- /dev/null +++ b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_icgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_icgraph.md5 b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_icgraph.md5 new file mode 100644 index 0000000..ef10028 --- /dev/null +++ b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_icgraph.md5 @@ -0,0 +1 @@ +b8688cdee1673b74c2c4a2cace3b1058 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_icgraph.png b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_icgraph.png new file mode 100644 index 0000000..82edef5 Binary files /dev/null and b/docs/html/classeasy_mesh_a866312e20360858110195516442891b5_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_cgraph.map b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_cgraph.map new file mode 100644 index 0000000..d91b288 --- /dev/null +++ b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_cgraph.md5 b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_cgraph.md5 new file mode 100644 index 0000000..d5d506d --- /dev/null +++ b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_cgraph.md5 @@ -0,0 +1 @@ +ec54aa7aa70dd8f33240dcef0cc55642 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_cgraph.png b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_cgraph.png new file mode 100644 index 0000000..20efcb4 Binary files /dev/null and b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_icgraph.map b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_icgraph.map new file mode 100644 index 0000000..2ff694c --- /dev/null +++ b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_icgraph.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_icgraph.md5 b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_icgraph.md5 new file mode 100644 index 0000000..8bf0f1d --- /dev/null +++ b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_icgraph.md5 @@ -0,0 +1 @@ +a84bb116b7a1e9584c6e0e24aa5016c6 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_icgraph.png b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_icgraph.png new file mode 100644 index 0000000..28de96c Binary files /dev/null and b/docs/html/classeasy_mesh_a8ec70e5cf7328a1331d7cb739d9ec36d_icgraph.png differ diff --git a/docs/html/classeasy_mesh_a9a104c954548ddf430fd5e829bdb7981_cgraph.map b/docs/html/classeasy_mesh_a9a104c954548ddf430fd5e829bdb7981_cgraph.map new file mode 100644 index 0000000..d91b288 --- /dev/null +++ b/docs/html/classeasy_mesh_a9a104c954548ddf430fd5e829bdb7981_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_a9a104c954548ddf430fd5e829bdb7981_cgraph.md5 b/docs/html/classeasy_mesh_a9a104c954548ddf430fd5e829bdb7981_cgraph.md5 new file mode 100644 index 0000000..d5d506d --- /dev/null +++ b/docs/html/classeasy_mesh_a9a104c954548ddf430fd5e829bdb7981_cgraph.md5 @@ -0,0 +1 @@ +ec54aa7aa70dd8f33240dcef0cc55642 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a9a104c954548ddf430fd5e829bdb7981_cgraph.png b/docs/html/classeasy_mesh_a9a104c954548ddf430fd5e829bdb7981_cgraph.png new file mode 100644 index 0000000..20efcb4 Binary files /dev/null and b/docs/html/classeasy_mesh_a9a104c954548ddf430fd5e829bdb7981_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a9a8d07378b879f7d6a3d6c292ae21172_cgraph.map b/docs/html/classeasy_mesh_a9a8d07378b879f7d6a3d6c292ae21172_cgraph.map new file mode 100644 index 0000000..8442e6f --- /dev/null +++ b/docs/html/classeasy_mesh_a9a8d07378b879f7d6a3d6c292ae21172_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classeasy_mesh_a9a8d07378b879f7d6a3d6c292ae21172_cgraph.md5 b/docs/html/classeasy_mesh_a9a8d07378b879f7d6a3d6c292ae21172_cgraph.md5 new file mode 100644 index 0000000..eb1a460 --- /dev/null +++ b/docs/html/classeasy_mesh_a9a8d07378b879f7d6a3d6c292ae21172_cgraph.md5 @@ -0,0 +1 @@ +e83e1d7abc9d8c2254c8c8664d590295 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a9a8d07378b879f7d6a3d6c292ae21172_cgraph.png b/docs/html/classeasy_mesh_a9a8d07378b879f7d6a3d6c292ae21172_cgraph.png new file mode 100644 index 0000000..d8d98fc Binary files /dev/null and b/docs/html/classeasy_mesh_a9a8d07378b879f7d6a3d6c292ae21172_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_cgraph.map b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_cgraph.map new file mode 100644 index 0000000..3d7b4c2 --- /dev/null +++ b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_cgraph.md5 b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_cgraph.md5 new file mode 100644 index 0000000..9a78fc3 --- /dev/null +++ b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_cgraph.md5 @@ -0,0 +1 @@ +4a3468a7e249502d9c3f48b3c20c8d27 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_cgraph.png b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_cgraph.png new file mode 100644 index 0000000..b5c3c0e Binary files /dev/null and b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_cgraph.png differ diff --git a/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_icgraph.map b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_icgraph.map new file mode 100644 index 0000000..4d7b13f --- /dev/null +++ b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_icgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_icgraph.md5 b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_icgraph.md5 new file mode 100644 index 0000000..2a77c5f --- /dev/null +++ b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_icgraph.md5 @@ -0,0 +1 @@ +85d3dafba1cc29bacafe8397d1adf446 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_icgraph.png b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_icgraph.png new file mode 100644 index 0000000..4c55312 Binary files /dev/null and b/docs/html/classeasy_mesh_a9f4349c6be8530e4d852b68183a9ff19_icgraph.png differ diff --git a/docs/html/classeasy_mesh_aac55f83f10ff79303a70bc113b496990_cgraph.map b/docs/html/classeasy_mesh_aac55f83f10ff79303a70bc113b496990_cgraph.map new file mode 100644 index 0000000..ad0d9b0 --- /dev/null +++ b/docs/html/classeasy_mesh_aac55f83f10ff79303a70bc113b496990_cgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/classeasy_mesh_aac55f83f10ff79303a70bc113b496990_cgraph.md5 b/docs/html/classeasy_mesh_aac55f83f10ff79303a70bc113b496990_cgraph.md5 new file mode 100644 index 0000000..7191e99 --- /dev/null +++ b/docs/html/classeasy_mesh_aac55f83f10ff79303a70bc113b496990_cgraph.md5 @@ -0,0 +1 @@ +b7ffaf35bf99e5b8edbaede429ced46a \ No newline at end of file diff --git a/docs/html/classeasy_mesh_aac55f83f10ff79303a70bc113b496990_cgraph.png b/docs/html/classeasy_mesh_aac55f83f10ff79303a70bc113b496990_cgraph.png new file mode 100644 index 0000000..c378ac6 Binary files /dev/null and b/docs/html/classeasy_mesh_aac55f83f10ff79303a70bc113b496990_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_cgraph.map b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_cgraph.map new file mode 100644 index 0000000..4614521 --- /dev/null +++ b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_cgraph.map @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_cgraph.md5 b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_cgraph.md5 new file mode 100644 index 0000000..3c2b714 --- /dev/null +++ b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_cgraph.md5 @@ -0,0 +1 @@ +f72287d8f4d53ca3ddd90e89072c3b2b \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_cgraph.png b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_cgraph.png new file mode 100644 index 0000000..bc711d1 Binary files /dev/null and b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_icgraph.map b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_icgraph.map new file mode 100644 index 0000000..70e2f7b --- /dev/null +++ b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_icgraph.md5 b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_icgraph.md5 new file mode 100644 index 0000000..9c9f98f --- /dev/null +++ b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_icgraph.md5 @@ -0,0 +1 @@ +4b7a7dbe5a99fd16d4eb8be5b5620393 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_icgraph.png b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_icgraph.png new file mode 100644 index 0000000..ab370f9 Binary files /dev/null and b/docs/html/classeasy_mesh_ab020ed8e53720b859e1cf05601e61bfb_icgraph.png differ diff --git a/docs/html/classeasy_mesh_ab4d86723fd9bbb34b9a2a25732c014b5_cgraph.map b/docs/html/classeasy_mesh_ab4d86723fd9bbb34b9a2a25732c014b5_cgraph.map new file mode 100644 index 0000000..620f716 --- /dev/null +++ b/docs/html/classeasy_mesh_ab4d86723fd9bbb34b9a2a25732c014b5_cgraph.map @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_ab4d86723fd9bbb34b9a2a25732c014b5_cgraph.md5 b/docs/html/classeasy_mesh_ab4d86723fd9bbb34b9a2a25732c014b5_cgraph.md5 new file mode 100644 index 0000000..642340a --- /dev/null +++ b/docs/html/classeasy_mesh_ab4d86723fd9bbb34b9a2a25732c014b5_cgraph.md5 @@ -0,0 +1 @@ +3bfc4bbbf5e3c8b742c5fdcc579003f9 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ab4d86723fd9bbb34b9a2a25732c014b5_cgraph.png b/docs/html/classeasy_mesh_ab4d86723fd9bbb34b9a2a25732c014b5_cgraph.png new file mode 100644 index 0000000..29279a7 Binary files /dev/null and b/docs/html/classeasy_mesh_ab4d86723fd9bbb34b9a2a25732c014b5_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_cgraph.map b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_cgraph.map new file mode 100644 index 0000000..de8bae8 --- /dev/null +++ b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_cgraph.map @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_cgraph.md5 b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_cgraph.md5 new file mode 100644 index 0000000..51d95c2 --- /dev/null +++ b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_cgraph.md5 @@ -0,0 +1 @@ +2f0c37c7db09ffad79b3c261c4dbde33 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_cgraph.png b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_cgraph.png new file mode 100644 index 0000000..eedd6d4 Binary files /dev/null and b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_icgraph.map b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_icgraph.map new file mode 100644 index 0000000..3a96b35 --- /dev/null +++ b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_icgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_icgraph.md5 b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_icgraph.md5 new file mode 100644 index 0000000..152e92c --- /dev/null +++ b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_icgraph.md5 @@ -0,0 +1 @@ +28fadf73afe368be2731a1da6efd5257 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_icgraph.png b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_icgraph.png new file mode 100644 index 0000000..1365e0b Binary files /dev/null and b/docs/html/classeasy_mesh_ac11dfd839c37803bf738117bc79a8ebf_icgraph.png differ diff --git a/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_cgraph.map b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_cgraph.map new file mode 100644 index 0000000..e99afa9 --- /dev/null +++ b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_cgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_cgraph.md5 b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_cgraph.md5 new file mode 100644 index 0000000..ac02a84 --- /dev/null +++ b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_cgraph.md5 @@ -0,0 +1 @@ +594500a5d66327131be7f3bd8e834cd8 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_cgraph.png b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_cgraph.png new file mode 100644 index 0000000..12afb21 Binary files /dev/null and b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_icgraph.map b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_icgraph.map new file mode 100644 index 0000000..f461a83 --- /dev/null +++ b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_icgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_icgraph.md5 b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_icgraph.md5 new file mode 100644 index 0000000..30c669d --- /dev/null +++ b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_icgraph.md5 @@ -0,0 +1 @@ +6607d2e94c56658ae3a260d4ccafde4e \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_icgraph.png b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_icgraph.png new file mode 100644 index 0000000..d559a96 Binary files /dev/null and b/docs/html/classeasy_mesh_ac6df8b6292c63a93ab16b286f36a179b_icgraph.png differ diff --git a/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_cgraph.map b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_cgraph.map new file mode 100644 index 0000000..f856ff5 --- /dev/null +++ b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_cgraph.map @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_cgraph.md5 b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_cgraph.md5 new file mode 100644 index 0000000..829a4e7 --- /dev/null +++ b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_cgraph.md5 @@ -0,0 +1 @@ +d45b72a7605ecfa381bb08b5e0bba113 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_cgraph.png b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_cgraph.png new file mode 100644 index 0000000..766b7a6 Binary files /dev/null and b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_cgraph.png differ diff --git a/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_icgraph.map b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_icgraph.map new file mode 100644 index 0000000..9da2980 --- /dev/null +++ b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_icgraph.md5 b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_icgraph.md5 new file mode 100644 index 0000000..6eed85d --- /dev/null +++ b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_icgraph.md5 @@ -0,0 +1 @@ +85a9ceac22a2a459f4275d3015ff4bfd \ No newline at end of file diff --git a/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_icgraph.png b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_icgraph.png new file mode 100644 index 0000000..1237c2c Binary files /dev/null and b/docs/html/classeasy_mesh_acaf8a2f4589365b23f4564d1a7eb20bf_icgraph.png differ diff --git a/docs/html/classeasy_mesh_ad0acddc98f89b0b8dba7c38e60f9ea70_icgraph.map b/docs/html/classeasy_mesh_ad0acddc98f89b0b8dba7c38e60f9ea70_icgraph.map new file mode 100644 index 0000000..55d9b13 --- /dev/null +++ b/docs/html/classeasy_mesh_ad0acddc98f89b0b8dba7c38e60f9ea70_icgraph.map @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_ad0acddc98f89b0b8dba7c38e60f9ea70_icgraph.md5 b/docs/html/classeasy_mesh_ad0acddc98f89b0b8dba7c38e60f9ea70_icgraph.md5 new file mode 100644 index 0000000..e9b3178 --- /dev/null +++ b/docs/html/classeasy_mesh_ad0acddc98f89b0b8dba7c38e60f9ea70_icgraph.md5 @@ -0,0 +1 @@ +859a5bfe23df5d9c7ec2acf5d14e4ac6 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ad0acddc98f89b0b8dba7c38e60f9ea70_icgraph.png b/docs/html/classeasy_mesh_ad0acddc98f89b0b8dba7c38e60f9ea70_icgraph.png new file mode 100644 index 0000000..d9ac22f Binary files /dev/null and b/docs/html/classeasy_mesh_ad0acddc98f89b0b8dba7c38e60f9ea70_icgraph.png differ diff --git a/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_cgraph.map b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_cgraph.map new file mode 100644 index 0000000..46bc01b --- /dev/null +++ b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_cgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_cgraph.md5 b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_cgraph.md5 new file mode 100644 index 0000000..bee6c50 --- /dev/null +++ b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_cgraph.md5 @@ -0,0 +1 @@ +8913c127e004442019b5459b412afb9d \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_cgraph.png b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_cgraph.png new file mode 100644 index 0000000..fe4d8f6 Binary files /dev/null and b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_icgraph.map b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_icgraph.map new file mode 100644 index 0000000..6be4adc --- /dev/null +++ b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_icgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_icgraph.md5 b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_icgraph.md5 new file mode 100644 index 0000000..2622cf3 --- /dev/null +++ b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_icgraph.md5 @@ -0,0 +1 @@ +4b24b14adb088d26987b64e1fa2745c9 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_icgraph.png b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_icgraph.png new file mode 100644 index 0000000..cdf1c7a Binary files /dev/null and b/docs/html/classeasy_mesh_ad3a2c02205c0071ba6fdbc8eecbe5ffc_icgraph.png differ diff --git a/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_cgraph.map b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_cgraph.map new file mode 100644 index 0000000..f01afe9 --- /dev/null +++ b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_cgraph.md5 b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_cgraph.md5 new file mode 100644 index 0000000..dabdefe --- /dev/null +++ b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_cgraph.md5 @@ -0,0 +1 @@ +564ca34818020a793234e65f6e90998f \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_cgraph.png b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_cgraph.png new file mode 100644 index 0000000..47a8051 Binary files /dev/null and b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_icgraph.map b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_icgraph.map new file mode 100644 index 0000000..17d1c1b --- /dev/null +++ b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_icgraph.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_icgraph.md5 b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_icgraph.md5 new file mode 100644 index 0000000..13b4078 --- /dev/null +++ b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_icgraph.md5 @@ -0,0 +1 @@ +56cc4b1d8b56a3cbe3f546a193d12186 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_icgraph.png b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_icgraph.png new file mode 100644 index 0000000..2d005bf Binary files /dev/null and b/docs/html/classeasy_mesh_ad86a28d45d33678d20d3afe4db634af2_icgraph.png differ diff --git a/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_cgraph.map b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_cgraph.map new file mode 100644 index 0000000..a37a176 --- /dev/null +++ b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_cgraph.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_cgraph.md5 b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_cgraph.md5 new file mode 100644 index 0000000..9ec03fd --- /dev/null +++ b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_cgraph.md5 @@ -0,0 +1 @@ +153efdcb1c24e82d04dc45fc47226170 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_cgraph.png b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_cgraph.png new file mode 100644 index 0000000..2f13e02 Binary files /dev/null and b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_icgraph.map b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_icgraph.map new file mode 100644 index 0000000..0321b3f --- /dev/null +++ b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_icgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_icgraph.md5 b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_icgraph.md5 new file mode 100644 index 0000000..f8b227d --- /dev/null +++ b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_icgraph.md5 @@ -0,0 +1 @@ +51ba36f2453c650e043b7afe17dd506b \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_icgraph.png b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_icgraph.png new file mode 100644 index 0000000..aaea8df Binary files /dev/null and b/docs/html/classeasy_mesh_ad88d5afea9f7635c4412b34dfb7d8cb1_icgraph.png differ diff --git a/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_cgraph.map b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_cgraph.map new file mode 100644 index 0000000..17fd859 --- /dev/null +++ b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_cgraph.md5 b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_cgraph.md5 new file mode 100644 index 0000000..eb9d611 --- /dev/null +++ b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_cgraph.md5 @@ -0,0 +1 @@ +3c7c0fcc1c9bc344810b5c3b7e372c66 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_cgraph.png b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_cgraph.png new file mode 100644 index 0000000..59d81d0 Binary files /dev/null and b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_cgraph.png differ diff --git a/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_icgraph.map b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_icgraph.map new file mode 100644 index 0000000..16c1821 --- /dev/null +++ b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_icgraph.md5 b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_icgraph.md5 new file mode 100644 index 0000000..0c4399b --- /dev/null +++ b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_icgraph.md5 @@ -0,0 +1 @@ +4d5fb9a4928be9d4ce3d70254d3d73c5 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_icgraph.png b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_icgraph.png new file mode 100644 index 0000000..f6d3f29 Binary files /dev/null and b/docs/html/classeasy_mesh_adab4f3dfda850f697a9287aa9649bb7d_icgraph.png differ diff --git a/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_cgraph.map b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_cgraph.map new file mode 100644 index 0000000..1b27ea7 --- /dev/null +++ b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_cgraph.md5 b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_cgraph.md5 new file mode 100644 index 0000000..10ff8f8 --- /dev/null +++ b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_cgraph.md5 @@ -0,0 +1 @@ +6f53a42dcf4174c985bdf3b76c8b7b63 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_cgraph.png b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_cgraph.png new file mode 100644 index 0000000..8964dac Binary files /dev/null and b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_cgraph.png differ diff --git a/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_icgraph.map b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_icgraph.map new file mode 100644 index 0000000..1a0c9b7 --- /dev/null +++ b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_icgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_icgraph.md5 b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_icgraph.md5 new file mode 100644 index 0000000..d6d09ae --- /dev/null +++ b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_icgraph.md5 @@ -0,0 +1 @@ +cbc4982e111c377864fc9501258c89c3 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_icgraph.png b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_icgraph.png new file mode 100644 index 0000000..5b603c0 Binary files /dev/null and b/docs/html/classeasy_mesh_adc34836b6bfb1b6a6748607e2d85e0d1_icgraph.png differ diff --git a/docs/html/classeasy_mesh_add9de4d83e908cf55fe8c122c5fa38a1_cgraph.map b/docs/html/classeasy_mesh_add9de4d83e908cf55fe8c122c5fa38a1_cgraph.map new file mode 100644 index 0000000..d4ad273 --- /dev/null +++ b/docs/html/classeasy_mesh_add9de4d83e908cf55fe8c122c5fa38a1_cgraph.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_add9de4d83e908cf55fe8c122c5fa38a1_cgraph.md5 b/docs/html/classeasy_mesh_add9de4d83e908cf55fe8c122c5fa38a1_cgraph.md5 new file mode 100644 index 0000000..0b1670c --- /dev/null +++ b/docs/html/classeasy_mesh_add9de4d83e908cf55fe8c122c5fa38a1_cgraph.md5 @@ -0,0 +1 @@ +ee99c1e95f5b20564bdd62fd37660e61 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_add9de4d83e908cf55fe8c122c5fa38a1_cgraph.png b/docs/html/classeasy_mesh_add9de4d83e908cf55fe8c122c5fa38a1_cgraph.png new file mode 100644 index 0000000..6f2e36c Binary files /dev/null and b/docs/html/classeasy_mesh_add9de4d83e908cf55fe8c122c5fa38a1_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_cgraph.map b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_cgraph.map new file mode 100644 index 0000000..d087b76 --- /dev/null +++ b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_cgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_cgraph.md5 b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_cgraph.md5 new file mode 100644 index 0000000..a403b40 --- /dev/null +++ b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_cgraph.md5 @@ -0,0 +1 @@ +a8a929ffdde66e7a21eaf0c39202e2b9 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_cgraph.png b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_cgraph.png new file mode 100644 index 0000000..9a37f75 Binary files /dev/null and b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_cgraph.png differ diff --git a/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_icgraph.map b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_icgraph.map new file mode 100644 index 0000000..e0bb02e --- /dev/null +++ b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_icgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_icgraph.md5 b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_icgraph.md5 new file mode 100644 index 0000000..4b95133 --- /dev/null +++ b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_icgraph.md5 @@ -0,0 +1 @@ +2728b69dba0f31e5db4827050ccfea12 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_icgraph.png b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_icgraph.png new file mode 100644 index 0000000..3b45ed9 Binary files /dev/null and b/docs/html/classeasy_mesh_ae3faf49428321ce602daf33d14d72fcb_icgraph.png differ diff --git a/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_cgraph.map b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_cgraph.map new file mode 100644 index 0000000..05d1c9e --- /dev/null +++ b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_cgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_cgraph.md5 b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_cgraph.md5 new file mode 100644 index 0000000..6ec6ff9 --- /dev/null +++ b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_cgraph.md5 @@ -0,0 +1 @@ +610aa876bad35b1b713334492fbc47b8 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_cgraph.png b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_cgraph.png new file mode 100644 index 0000000..7dca989 Binary files /dev/null and b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_cgraph.png differ diff --git a/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_icgraph.map b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_icgraph.map new file mode 100644 index 0000000..014ca1d --- /dev/null +++ b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_icgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_icgraph.md5 b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_icgraph.md5 new file mode 100644 index 0000000..64f3779 --- /dev/null +++ b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_icgraph.md5 @@ -0,0 +1 @@ +2d2812915013c05ce42ce72a881ea3ce \ No newline at end of file diff --git a/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_icgraph.png b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_icgraph.png new file mode 100644 index 0000000..da3529a Binary files /dev/null and b/docs/html/classeasy_mesh_af1cdb6e9f2b81e9f6f09541b86369007_icgraph.png differ diff --git a/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_cgraph.map b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_cgraph.map new file mode 100644 index 0000000..6ac6563 --- /dev/null +++ b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_cgraph.map @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_cgraph.md5 b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_cgraph.md5 new file mode 100644 index 0000000..fd42783 --- /dev/null +++ b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_cgraph.md5 @@ -0,0 +1 @@ +e091f17c6d8c2207078f917536e78abd \ No newline at end of file diff --git a/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_cgraph.png b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_cgraph.png new file mode 100644 index 0000000..668e445 Binary files /dev/null and b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_cgraph.png differ diff --git a/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_icgraph.map b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_icgraph.map new file mode 100644 index 0000000..f43321e --- /dev/null +++ b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_icgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_icgraph.md5 b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_icgraph.md5 new file mode 100644 index 0000000..72944f6 --- /dev/null +++ b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_icgraph.md5 @@ -0,0 +1 @@ +bff1a032af181213df46996a55b4498b \ No newline at end of file diff --git a/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_icgraph.png b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_icgraph.png new file mode 100644 index 0000000..e811b83 Binary files /dev/null and b/docs/html/classeasy_mesh_af54a031211182ed77edb9695725ec03b_icgraph.png differ diff --git a/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_cgraph.map b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_cgraph.map new file mode 100644 index 0000000..84cc29d --- /dev/null +++ b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_cgraph.md5 b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_cgraph.md5 new file mode 100644 index 0000000..0acae27 --- /dev/null +++ b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_cgraph.md5 @@ -0,0 +1 @@ +18174256c3443fba462beb151d1fb619 \ No newline at end of file diff --git a/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_cgraph.png b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_cgraph.png new file mode 100644 index 0000000..a195e58 Binary files /dev/null and b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_cgraph.png differ diff --git a/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_icgraph.map b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_icgraph.map new file mode 100644 index 0000000..eab1a3b --- /dev/null +++ b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_icgraph.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_icgraph.md5 b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_icgraph.md5 new file mode 100644 index 0000000..bc3e42a --- /dev/null +++ b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_icgraph.md5 @@ -0,0 +1 @@ +28c188099172281bc04d6c3c76e2b54a \ No newline at end of file diff --git a/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_icgraph.png b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_icgraph.png new file mode 100644 index 0000000..7e89009 Binary files /dev/null and b/docs/html/classeasy_mesh_af71b90d4f94b0007128c82a268ef7b49_icgraph.png differ diff --git a/docs/html/classes.html b/docs/html/classes.html new file mode 100644 index 0000000..903f577 --- /dev/null +++ b/docs/html/classes.html @@ -0,0 +1,130 @@ + + + + + + +easyMesh: Class Index + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+ All Classes Files Functions Variables Enumerations Enumerator Macros
+ + +
+ +
+ +
+
+
Class Index
+
+
+
E | M | T
+ + + + + +
  e  
+
  m  
+
  t  
+
easyMesh   meshConnectionType   timeSync   
+
E | M | T
+
+
+ + + + diff --git a/docs/html/classtime_sync-members.html b/docs/html/classtime_sync-members.html new file mode 100644 index 0000000..3c2c30d --- /dev/null +++ b/docs/html/classtime_sync-members.html @@ -0,0 +1,128 @@ + + + + + + +easyMesh: Member List + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+ All Classes Files Functions Variables Enumerations Enumerator Macros
+ + +
+ +
+ +
+
+
timeSync Member List
+
+
+ +

This is the complete list of members for timeSync, including all inherited members.

+ + + + + + + +
adopttimeSync
buildTimeStamp(void)timeSync
calcAdjustment(bool even)timeSync
numtimeSync
processTimeStamp(String &str)timeSync
timestimeSync
+
+ + + + diff --git a/docs/html/classtime_sync.html b/docs/html/classtime_sync.html new file mode 100644 index 0000000..e7549ba --- /dev/null +++ b/docs/html/classtime_sync.html @@ -0,0 +1,304 @@ + + + + + + +easyMesh: timeSync Class Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+ All Classes Files Functions Variables Enumerations Enumerator Macros
+ + +
+ +
+ +
+ +
+
timeSync Class Reference
+
+
+ +

#include <easyMeshSync.h>

+ + + + + + + + +

+Public Member Functions

String buildTimeStamp (void)
 
bool processTimeStamp (String &str)
 
void calcAdjustment (bool even)
 
+ + + + + + + +

+Public Attributes

uint32_t times [TIME_SYNC_CYCLES]
 
int8_t num = -1
 
bool adopt
 
+

Detailed Description

+
+

Definition at line 12 of file easyMeshSync.h.

+

Member Function Documentation

+ +
+
+ + + + + + + + +
String ICACHE_FLASH_ATTR timeSync::buildTimeStamp (void )
+
+ +

Definition at line 22 of file easyMeshSync.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + +
void ICACHE_FLASH_ATTR timeSync::calcAdjustment (bool even)
+
+ +

Definition at line 72 of file easyMeshSync.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+ +
+
+ + + + + + + + +
bool ICACHE_FLASH_ATTR timeSync::processTimeStamp (String & str)
+
+ +

Definition at line 44 of file easyMeshSync.cpp.

+ +

+Here is the call graph for this function:
+
+
+ + +
+

+ +

+Here is the caller graph for this function:
+
+
+ + +
+

+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
bool timeSync::adopt
+
+ +

Definition at line 16 of file easyMeshSync.h.

+ +
+
+ +
+
+ + + + +
int8_t timeSync::num = -1
+
+ +

Definition at line 15 of file easyMeshSync.h.

+ +
+
+ +
+
+ + + + +
uint32_t timeSync::times[TIME_SYNC_CYCLES]
+
+ +

Definition at line 14 of file easyMeshSync.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/docs/html/classtime_sync.js b/docs/html/classtime_sync.js new file mode 100644 index 0000000..bead191 --- /dev/null +++ b/docs/html/classtime_sync.js @@ -0,0 +1,9 @@ +var classtime_sync = +[ + [ "buildTimeStamp", "classtime_sync.html#a11251c02d78b7fc62c457b4e36ab15e3", null ], + [ "calcAdjustment", "classtime_sync.html#a014ba647d52f3961c7d40cee5d4a54da", null ], + [ "processTimeStamp", "classtime_sync.html#aa4f15ef82fbcf0e28c9cbb78cbb92114", null ], + [ "adopt", "classtime_sync.html#a0d6c100bd016d9a6dc56991519c2884b", null ], + [ "num", "classtime_sync.html#a9e36f47b2f6e178a9a92bd675b3a3b05", null ], + [ "times", "classtime_sync.html#a06a5ac5ad522940d4896a823f5e8ba73", null ] +]; \ No newline at end of file diff --git a/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_cgraph.map b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_cgraph.map new file mode 100644 index 0000000..88e95e7 --- /dev/null +++ b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_cgraph.md5 b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_cgraph.md5 new file mode 100644 index 0000000..3ebb68c --- /dev/null +++ b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_cgraph.md5 @@ -0,0 +1 @@ +d13ae28386b73039f6a7e6679dbbfe48 \ No newline at end of file diff --git a/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_cgraph.png b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_cgraph.png new file mode 100644 index 0000000..74849d2 Binary files /dev/null and b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_cgraph.png differ diff --git a/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_icgraph.map b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_icgraph.map new file mode 100644 index 0000000..c0cf49e --- /dev/null +++ b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_icgraph.md5 b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_icgraph.md5 new file mode 100644 index 0000000..98cb520 --- /dev/null +++ b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_icgraph.md5 @@ -0,0 +1 @@ +a6e3915d169ac0313f2eeef9cd375eac \ No newline at end of file diff --git a/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_icgraph.png b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_icgraph.png new file mode 100644 index 0000000..1629e84 Binary files /dev/null and b/docs/html/classtime_sync_a014ba647d52f3961c7d40cee5d4a54da_icgraph.png differ diff --git a/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_cgraph.map b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_cgraph.map new file mode 100644 index 0000000..6e32d13 --- /dev/null +++ b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_cgraph.md5 b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_cgraph.md5 new file mode 100644 index 0000000..bf5f4b3 --- /dev/null +++ b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_cgraph.md5 @@ -0,0 +1 @@ +873d1e7a63843d933f65e12408b78a2d \ No newline at end of file diff --git a/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_cgraph.png b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_cgraph.png new file mode 100644 index 0000000..6f07cb2 Binary files /dev/null and b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_cgraph.png differ diff --git a/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_icgraph.map b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_icgraph.map new file mode 100644 index 0000000..7be49e6 --- /dev/null +++ b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_icgraph.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_icgraph.md5 b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_icgraph.md5 new file mode 100644 index 0000000..8a32b73 --- /dev/null +++ b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_icgraph.md5 @@ -0,0 +1 @@ +e69d908a0992b456211ad17933342c20 \ No newline at end of file diff --git a/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_icgraph.png b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_icgraph.png new file mode 100644 index 0000000..fe2fb95 Binary files /dev/null and b/docs/html/classtime_sync_a11251c02d78b7fc62c457b4e36ab15e3_icgraph.png differ diff --git a/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_cgraph.map b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_cgraph.map new file mode 100644 index 0000000..ec84bfc --- /dev/null +++ b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_cgraph.md5 b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_cgraph.md5 new file mode 100644 index 0000000..2a230c9 --- /dev/null +++ b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_cgraph.md5 @@ -0,0 +1 @@ +3edb97c19adfece64d6cea364d69c49f \ No newline at end of file diff --git a/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_cgraph.png b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_cgraph.png new file mode 100644 index 0000000..88e7f44 Binary files /dev/null and b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_cgraph.png differ diff --git a/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_icgraph.map b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_icgraph.map new file mode 100644 index 0000000..6222bae --- /dev/null +++ b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_icgraph.md5 b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_icgraph.md5 new file mode 100644 index 0000000..09efbe1 --- /dev/null +++ b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_icgraph.md5 @@ -0,0 +1 @@ +4d012c13fdffaef7a87915b3d65d8389 \ No newline at end of file diff --git a/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_icgraph.png b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_icgraph.png new file mode 100644 index 0000000..b829d7e Binary files /dev/null and b/docs/html/classtime_sync_aa4f15ef82fbcf0e28c9cbb78cbb92114_icgraph.png differ diff --git a/docs/html/closed.png b/docs/html/closed.png new file mode 100644 index 0000000..98cc2c9 Binary files /dev/null and b/docs/html/closed.png differ diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css new file mode 100644 index 0000000..f0f36f8 --- /dev/null +++ b/docs/html/doxygen.css @@ -0,0 +1,1366 @@ +/* The standard CSS for doxygen 1.8.6 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 4px 6px; + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: bold; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view when not used as main index */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 20px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + diff --git a/docs/html/doxygen.png b/docs/html/doxygen.png new file mode 100644 index 0000000..3ff17d8 Binary files /dev/null and b/docs/html/doxygen.png differ diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js new file mode 100644 index 0000000..2f15470 --- /dev/null +++ b/docs/html/dynsections.js @@ -0,0 +1,104 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} +function toggleLevel(level) +{ + $('table.directory tr').each(function(){ + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + +easyMesh: easyMesh.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
easyMesh.cpp File Reference
+
+
+
#include <Arduino.h>
+#include <ArduinoJson.h>
+#include <SimpleList.h>
+#include "user_interface.h"
+#include "espconn.h"
+#include "easyMesh.h"
+#include "easyMeshSync.h"
+
+Include dependency graph for easyMesh.cpp:
+
+
+ + +
+
+

Go to the source code of this file.

+ + + + + + +

+Variables

easyMeshstaticThis
 
uint16_t count = 0
 
+

Variable Documentation

+ +
+
+ + + + +
uint16_t count = 0
+
+ +

Definition at line 15 of file easyMesh.cpp.

+ +
+
+ +
+
+ + + + +
easyMesh* staticThis
+
+ +

Definition at line 14 of file easyMesh.cpp.

+ +
+
+
+
+ + + + diff --git a/docs/html/easy_mesh_8cpp.js b/docs/html/easy_mesh_8cpp.js new file mode 100644 index 0000000..b3be052 --- /dev/null +++ b/docs/html/easy_mesh_8cpp.js @@ -0,0 +1,5 @@ +var easy_mesh_8cpp = +[ + [ "count", "easy_mesh_8cpp.html#af6a39bfc7e1dc3b6f9c997c1c43fa996", null ], + [ "staticThis", "easy_mesh_8cpp.html#a7f0b8b20ed2a74609af106ba4f0f6c06", null ] +]; \ No newline at end of file diff --git a/docs/html/easy_mesh_8cpp__incl.map b/docs/html/easy_mesh_8cpp__incl.map new file mode 100644 index 0000000..6f2d17d --- /dev/null +++ b/docs/html/easy_mesh_8cpp__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/easy_mesh_8cpp__incl.md5 b/docs/html/easy_mesh_8cpp__incl.md5 new file mode 100644 index 0000000..d1bfb8e --- /dev/null +++ b/docs/html/easy_mesh_8cpp__incl.md5 @@ -0,0 +1 @@ +e7cdbf00c2caeb70f4850fff8b750e67 \ No newline at end of file diff --git a/docs/html/easy_mesh_8cpp__incl.png b/docs/html/easy_mesh_8cpp__incl.png new file mode 100644 index 0000000..d06bde1 Binary files /dev/null and b/docs/html/easy_mesh_8cpp__incl.png differ diff --git a/docs/html/easy_mesh_8cpp_source.html b/docs/html/easy_mesh_8cpp_source.html new file mode 100644 index 0000000..6058200 --- /dev/null +++ b/docs/html/easy_mesh_8cpp_source.html @@ -0,0 +1,257 @@ + + + + + + +easyMesh: easyMesh.cpp Source File + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMesh.cpp
+
+
+Go to the documentation of this file.
1 #include <Arduino.h>
+
2 #include <ArduinoJson.h>
+
3 #include <SimpleList.h>
+
4 
+
5 extern "C" {
+
6 #include "user_interface.h"
+
7 #include "espconn.h"
+
8 }
+
9 
+
10 #include "easyMesh.h"
+
11 #include "easyMeshSync.h"
+
12 
+
13 
+ +
15 uint16_t count = 0;
+
16 
+
17 
+
18 // general functions
+
19 //***********************************************************************
+
20 /*void ICACHE_FLASH_ATTR easyMesh::init( void ) {
+
21  // shut everything down, start with a blank slate.
+
22  debugMsg( STARTUP, "init():\n", wifi_station_set_auto_connect( 0 ));
+
23 
+
24  if ( wifi_station_get_connect_status() != STATION_IDLE ) {
+
25  debugMsg( ERROR, "Station is doing something... wierd!? status=%d\n", wifi_station_get_connect_status());
+
26  wifi_station_disconnect();
+
27  }
+
28  wifi_softap_dhcps_stop();
+
29 
+
30  wifi_set_event_handler_cb( wifiEventCb );
+
31 
+
32  staticThis = this; // provides a way for static callback methods to access "this" object;
+
33 
+
34  // start configuration
+
35  debugMsg( GENERAL, "wifi_set_opmode(STATIONAP_MODE) succeeded? %d\n", wifi_set_opmode( STATIONAP_MODE ) );
+
36  uint8_t MAC[] = {0,0,0,0,0,0};
+
37  wifi_get_macaddr(SOFTAP_IF, MAC);
+
38  _nodeId = encodeNodeId(MAC);
+
39  _meshSSID = String( MESH_SSID );
+
40 
+
41  apInit(); // setup AP
+
42  stationInit(); // setup station
+
43 
+
44  debugMsg( GENERAL, "init(): tcp_max_con=%u\n", espconn_tcp_get_max_con() );
+
45 }
+
46 */
+
47 //***********************************************************************
+
48 void ICACHE_FLASH_ATTR easyMesh::init( String ssid, String password, uint16_t port, _auth_mode authmode, uint8_t channel, phy_mode_t phymode, uint8_t maxtpw, uint8_t hidden, uint8_t maxconn ) {
+
49  // shut everything down, start with a blank slate.
+
50  debugMsg( STARTUP, "init():\n", wifi_station_set_auto_connect( 0 ));
+
51 
+
52  if ( wifi_station_get_connect_status() != STATION_IDLE ) {
+
53  debugMsg( ERROR, "Station is doing something... wierd!? status=%d\n", wifi_station_get_connect_status());
+
54  wifi_station_disconnect();
+
55  }
+
56  wifi_softap_dhcps_stop();
+
57 
+
58  wifi_set_event_handler_cb( wifiEventCb );
+
59 
+
60  wifi_set_phy_mode( phymode ); // allow setting PHY_MODE_11G / PHY_MODE_11B
+
61  system_phy_set_max_tpw( maxtpw ); //maximum value of RF Tx Power, unit : 0.25dBm, range [0,82]
+
62 
+
63  staticThis = this; // provides a way for static callback methods to access "this" object;
+
64 
+
65  // start configuration
+
66  debugMsg( GENERAL, "wifi_set_opmode(STATIONAP_MODE) succeeded? %d\n", wifi_set_opmode( STATIONAP_MODE ) );
+
67 
+
68  _meshSSID = ssid;
+
69  _meshPassword = password;
+
70  _meshPort = port;
+
71  _meshChannel = channel;
+
72  _meshAuthMode = authmode;
+
73  if( password == "" )
+
74  _meshAuthMode = AUTH_OPEN; //if no password ... set auth mode to open
+
75  _meshHidden = hidden;
+
76  _meshMaxConn = maxconn;
+
77 
+
78  uint8_t MAC[] = {0,0,0,0,0,0};
+
79  wifi_get_macaddr(SOFTAP_IF, MAC);
+
80  _nodeId = encodeNodeId(MAC);
+
81 
+
82  apInit(); // setup AP
+
83  stationInit(); // setup station
+
84 
+
85  debugMsg( GENERAL, "init(): tcp_max_con=%u\n", espconn_tcp_get_max_con() );
+
86 }
+
87 
+
88 //***********************************************************************
+
89 void ICACHE_FLASH_ATTR easyMesh::update( void ) {
+
90  manageStation();
+ +
92  return;
+
93 }
+
94 
+
95 //***********************************************************************
+
96 bool ICACHE_FLASH_ATTR easyMesh::sendSingle( uint32_t &destId, String &msg ){
+
97  debugMsg( COMMUNICATION, "sendSingle(): dest=%d msg=%s\n", destId, msg.c_str());
+
98  sendMessage( destId, SINGLE, msg );
+
99 }
+
100 
+
101 //***********************************************************************
+
102 bool ICACHE_FLASH_ATTR easyMesh::sendBroadcast( String &msg ) {
+
103  debugMsg( COMMUNICATION, "sendBroadcast(): msg=%s\n", msg.c_str());
+ +
105 }
+
106 
+ + +
void apInit(void)
Definition: easyMeshAP.cpp:21
+
void manageStation(void)
Definition: easyMeshSTA.cpp:32
+
void update(void)
Definition: easyMesh.cpp:89
+ +
String _meshPassword
Definition: easyMesh.h:176
+
uint32_t encodeNodeId(uint8_t *hwaddr)
+
uint16_t _meshPort
Definition: easyMesh.h:177
+
static void wifiEventCb(System_Event_t *event)
+
Definition: easyMesh.h:54
+
uint8_t _meshChannel
Definition: easyMesh.h:178
+
uint16_t count
Definition: easyMesh.cpp:15
+
uint8_t _meshMaxConn
Definition: easyMesh.h:181
+ +
void init(String ssid, String password, uint16_t port, _auth_mode authmode=AUTH_WPA2_PSK, uint8_t channel=0, phy_mode_t phymode=PHY_MODE_11G, uint8_t maxtpw=82, uint8_t hidden=0, uint8_t maxconn=4)
Definition: easyMesh.cpp:48
+
void stationInit(void)
Definition: easyMeshSTA.cpp:25
+
void manageConnections(void)
+
bool sendBroadcast(String &msg)
Definition: easyMesh.cpp:102
+
_auth_mode _meshAuthMode
Definition: easyMesh.h:179
+ +
uint32_t _nodeId
Definition: easyMesh.h:174
+
bool broadcastMessage(uint32_t fromId, meshPackageType type, String &msg, meshConnectionType *exclude=NULL)
+
void debugMsg(debugType type, const char *format...)
+ + +
bool sendMessage(meshConnectionType *conn, uint32_t destId, meshPackageType type, String &msg)
+
easyMesh * staticThis
Definition: easyMesh.cpp:14
+ +
bool sendSingle(uint32_t &destId, String &msg)
Definition: easyMesh.cpp:96
+
uint8_t _meshHidden
Definition: easyMesh.h:180
+
String _meshSSID
Definition: easyMesh.h:175
+
+
+ + + + diff --git a/docs/html/easy_mesh_8h.html b/docs/html/easy_mesh_8h.html new file mode 100644 index 0000000..0d37a26 --- /dev/null +++ b/docs/html/easy_mesh_8h.html @@ -0,0 +1,371 @@ + + + + + + +easyMesh: easyMesh.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
easyMesh.h File Reference
+
+
+
#include <Arduino.h>
+#include <SimpleList.h>
+#include <ArduinoJson.h>
+#include "user_interface.h"
+#include "espconn.h"
+#include "easyMeshSync.h"
+
+Include dependency graph for easyMesh.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+

Go to the source code of this file.

+ + + + + + +

+Classes

struct  meshConnectionType
 
class  easyMesh
 
+ + + + + +

+Macros

#define NODE_TIMEOUT   3000000
 
#define JSON_BUFSIZE   300
 
+ + + + + + + + + + + +

+Enumerations

enum  nodeStatusType { INITIALIZING = 0, +SEARCHING = 1, +FOUND_MESH = 2, +CONNECTED = 3 + }
 
enum  scanStatusType { IDLE = 0, +SCANNING = 1 + }
 
enum  syncStatusType { NEEDED = 0, +REQUESTED = 1, +IN_PROGRESS = 2, +COMPLETE = 3 + }
 
enum  meshPackageType {
+  DROP = 3, +TIME_SYNC = 4, +NODE_SYNC_REQUEST = 5, +NODE_SYNC_REPLY = 6, +
+  CONTROL = 7, +BROADCAST = 8, +SINGLE = 9 +
+ }
 
enum  debugType {
+  ERROR = 0x0001, +STARTUP = 0x0002, +MESH_STATUS = 0x0004, +CONNECTION = 0x0008, +
+  SYNC = 0x0010, +COMMUNICATION = 0x0020, +GENERAL = 0x0040, +MSG_TYPES = 0x0080, +
+  REMOTE = 0x0100, +APPLICATION = 0x0200 +
+ }
 
+

Macro Definition Documentation

+ +
+
+ + + + +
#define JSON_BUFSIZE   300
+
+ +

Definition at line 19 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
#define NODE_TIMEOUT   3000000
+
+ +

Definition at line 18 of file easyMesh.h.

+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum debugType
+
+ + + + + + + + + + + +
Enumerator
ERROR  +
STARTUP  +
MESH_STATUS  +
CONNECTION  +
SYNC  +
COMMUNICATION  +
GENERAL  +
MSG_TYPES  +
REMOTE  +
APPLICATION  +
+ +

Definition at line 53 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
enum meshPackageType
+
+ + + + + + + + +
Enumerator
DROP  +
TIME_SYNC  +
NODE_SYNC_REQUEST  +
NODE_SYNC_REPLY  +
CONTROL  +
BROADCAST  +
SINGLE  +
+ +

Definition at line 41 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
enum nodeStatusType
+
+ + + + + +
Enumerator
INITIALIZING  +
SEARCHING  +
FOUND_MESH  +
CONNECTED  +
+ +

Definition at line 22 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
enum scanStatusType
+
+ + + +
Enumerator
IDLE  +
SCANNING  +
+ +

Definition at line 29 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
enum syncStatusType
+
+ + + + + +
Enumerator
NEEDED  +
REQUESTED  +
IN_PROGRESS  +
COMPLETE  +
+ +

Definition at line 34 of file easyMesh.h.

+ +
+
+
+
+ + + + diff --git a/docs/html/easy_mesh_8h.js b/docs/html/easy_mesh_8h.js new file mode 100644 index 0000000..596ae91 --- /dev/null +++ b/docs/html/easy_mesh_8h.js @@ -0,0 +1,44 @@ +var easy_mesh_8h = +[ + [ "meshConnectionType", "structmesh_connection_type.html", "structmesh_connection_type" ], + [ "easyMesh", "classeasy_mesh.html", "classeasy_mesh" ], + [ "JSON_BUFSIZE", "easy_mesh_8h.html#ab88d752c532980dee76431dab0f9d121", null ], + [ "NODE_TIMEOUT", "easy_mesh_8h.html#ad735cb9e6bff56e96579c66d1db87e3e", null ], + [ "debugType", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3", [ + [ "ERROR", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3a2fd6f336d08340583bd620a7f5694c90", null ], + [ "STARTUP", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3a56f275913421aac16b5efff541f5dfc4", null ], + [ "MESH_STATUS", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3aa38a01be330630795f9c12eafc199057", null ], + [ "CONNECTION", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3a883e4c63ec87687e6b2847bfd99c601e", null ], + [ "SYNC", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3a447bfe7992c2fe70bfe561225f74d379", null ], + [ "COMMUNICATION", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3a8f9ed9b1838c39883ac4a29584d5e3d0", null ], + [ "GENERAL", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3aa965658e6a84d5502df1c1987b0a8466", null ], + [ "MSG_TYPES", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3a4081ab1c3632ba321f618f6eddcbc039", null ], + [ "REMOTE", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3a4ba7a18dad4c2b80d41444425fc4b818", null ], + [ "APPLICATION", "easy_mesh_8h.html#a92dc814ea7fd34acae287945426740d3a241e8ba97c5a6b68b13a60bb16235b85", null ] + ] ], + [ "meshPackageType", "easy_mesh_8h.html#ab2c05e245cdff0346d407cbb42c23470", [ + [ "DROP", "easy_mesh_8h.html#ab2c05e245cdff0346d407cbb42c23470a8b0b0025af76a3d8f0b7b1d4758e51a6", null ], + [ "TIME_SYNC", "easy_mesh_8h.html#ab2c05e245cdff0346d407cbb42c23470aeb2e02e5fa5100e20a0a47df55dc1813", null ], + [ "NODE_SYNC_REQUEST", "easy_mesh_8h.html#ab2c05e245cdff0346d407cbb42c23470aeb00f8ed515c98f061cdffa526a831f1", null ], + [ "NODE_SYNC_REPLY", "easy_mesh_8h.html#ab2c05e245cdff0346d407cbb42c23470ab1c083d66cd2915abf7ec660099a71de", null ], + [ "CONTROL", "easy_mesh_8h.html#ab2c05e245cdff0346d407cbb42c23470af722a5faa36087c914da53ebe4711f08", null ], + [ "BROADCAST", "easy_mesh_8h.html#ab2c05e245cdff0346d407cbb42c23470a78386e426adecb3fd26350119a3cb7c2", null ], + [ "SINGLE", "easy_mesh_8h.html#ab2c05e245cdff0346d407cbb42c23470a3388f7110f6f25a54e215eb75d5d7516", null ] + ] ], + [ "nodeStatusType", "easy_mesh_8h.html#a21d1438343786ebff3dd2b7cd23815be", [ + [ "INITIALIZING", "easy_mesh_8h.html#a21d1438343786ebff3dd2b7cd23815bea646fa15851d5e9f6784d044a50eef221", null ], + [ "SEARCHING", "easy_mesh_8h.html#a21d1438343786ebff3dd2b7cd23815beaa0c0f46a51df7452ca25be1d4594e8ba", null ], + [ "FOUND_MESH", "easy_mesh_8h.html#a21d1438343786ebff3dd2b7cd23815beabe67e3f8aaf775703927829c076295a2", null ], + [ "CONNECTED", "easy_mesh_8h.html#a21d1438343786ebff3dd2b7cd23815bea7a691a2430ec26878897b5fbc9c22a4c", null ] + ] ], + [ "scanStatusType", "easy_mesh_8h.html#a7eb662487291c8d1e3e906dafa425228", [ + [ "IDLE", "easy_mesh_8h.html#a7eb662487291c8d1e3e906dafa425228afd6a0e4343048b10646dd2976cc5ad18", null ], + [ "SCANNING", "easy_mesh_8h.html#a7eb662487291c8d1e3e906dafa425228a3b3044ea05052dea2134805da403a991", null ] + ] ], + [ "syncStatusType", "easy_mesh_8h.html#a318bacc9624722203b0fdf95a60e6a29", [ + [ "NEEDED", "easy_mesh_8h.html#a318bacc9624722203b0fdf95a60e6a29a2c75c625ce7730e6e2089d4953705671", null ], + [ "REQUESTED", "easy_mesh_8h.html#a318bacc9624722203b0fdf95a60e6a29a09eb653c7a2263eb32e79d5b71ff048b", null ], + [ "IN_PROGRESS", "easy_mesh_8h.html#a318bacc9624722203b0fdf95a60e6a29a643cea6438bbca00e218a0b1c05e1012", null ], + [ "COMPLETE", "easy_mesh_8h.html#a318bacc9624722203b0fdf95a60e6a29a00a900c9df90c74f75004b3dc04f173d", null ] + ] ] +]; \ No newline at end of file diff --git a/docs/html/easy_mesh_8h__dep__incl.map b/docs/html/easy_mesh_8h__dep__incl.map new file mode 100644 index 0000000..b8c0b81 --- /dev/null +++ b/docs/html/easy_mesh_8h__dep__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/easy_mesh_8h__dep__incl.md5 b/docs/html/easy_mesh_8h__dep__incl.md5 new file mode 100644 index 0000000..eabbb87 --- /dev/null +++ b/docs/html/easy_mesh_8h__dep__incl.md5 @@ -0,0 +1 @@ +76da511bb5a34d0186ae0169001e736a \ No newline at end of file diff --git a/docs/html/easy_mesh_8h__dep__incl.png b/docs/html/easy_mesh_8h__dep__incl.png new file mode 100644 index 0000000..b517f16 Binary files /dev/null and b/docs/html/easy_mesh_8h__dep__incl.png differ diff --git a/docs/html/easy_mesh_8h__incl.map b/docs/html/easy_mesh_8h__incl.map new file mode 100644 index 0000000..996fd76 --- /dev/null +++ b/docs/html/easy_mesh_8h__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/easy_mesh_8h__incl.md5 b/docs/html/easy_mesh_8h__incl.md5 new file mode 100644 index 0000000..c776596 --- /dev/null +++ b/docs/html/easy_mesh_8h__incl.md5 @@ -0,0 +1 @@ +06f8abbbdbe9c3837d2729f5cf644df6 \ No newline at end of file diff --git a/docs/html/easy_mesh_8h__incl.png b/docs/html/easy_mesh_8h__incl.png new file mode 100644 index 0000000..7615e62 Binary files /dev/null and b/docs/html/easy_mesh_8h__incl.png differ diff --git a/docs/html/easy_mesh_8h_source.html b/docs/html/easy_mesh_8h_source.html new file mode 100644 index 0000000..55d2fd5 --- /dev/null +++ b/docs/html/easy_mesh_8h_source.html @@ -0,0 +1,421 @@ + + + + + + +easyMesh: easyMesh.h Source File + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMesh.h
+
+
+Go to the documentation of this file.
1 #ifndef _EASY_MESH_H_
+
2 #define _EASY_MESH_H_
+
3 
+
4 #include <Arduino.h>
+
5 #include <SimpleList.h>
+
6 #include <ArduinoJson.h>
+
7 
+
8 extern "C" {
+
9 #include "user_interface.h"
+
10 #include "espconn.h"
+
11 }
+
12 
+
13 #include "easyMeshSync.h"
+
14 
+
15 //#define MESH_SSID "mesh"
+
16 //#define MESH_PASSWORD "bootyboo"
+
17 //#define MESH_PORT 4444
+
18 #define NODE_TIMEOUT 3000000 //uSecs
+
19 #define JSON_BUFSIZE 300 // initial size for the DynamicJsonBuffers.
+
20 
+
21 
+ + +
24  SEARCHING = 1,
+ + +
27 };
+
28 
+ +
30  IDLE = 0,
+ +
32 };
+
33 
+ +
35  NEEDED = 0,
+
36  REQUESTED = 1,
+ + +
39 };
+
40 
+ +
42  DROP = 3,
+
43  TIME_SYNC = 4,
+ + +
46  CONTROL = 7, //deprecated
+
47  BROADCAST = 8, //application data for everyone
+
48  SINGLE = 9 //application data for a single node
+
49 };
+
50 
+
51 
+
52 
+
53 enum debugType {
+
54  ERROR = 0x0001,
+
55  STARTUP = 0x0002,
+
56  MESH_STATUS = 0x0004,
+
57  CONNECTION = 0x0008,
+
58  SYNC = 0x0010,
+
59  COMMUNICATION = 0x0020,
+
60  GENERAL = 0x0040,
+
61  MSG_TYPES = 0x0080,
+
62  REMOTE = 0x0100, // not yet implemented
+
63  APPLICATION = 0x0200
+
64  // add types if you like, room for a total of 16 types
+
65 };
+
66 
+
67 
+ +
69  espconn *esp_conn;
+
70  uint32_t nodeId = 0;
+ + +
73  uint32_t lastRecieved = 0;
+
74  bool newConnection = true;
+
75 
+ +
77  uint32_t nodeSyncRequest = 0;
+
78 
+ +
80  uint32_t lastTimeSync = 0;
+
81 // bool needsNodeSync = true;
+
82 // bool needsTimeSync = false;
+
83 
+
84  bool sendReady = true;
+
85  SimpleList<String> sendQueue;
+
86 };
+
87 
+
88 
+
89 class easyMesh {
+
90 public:
+
91  //inline functions
+
92  uint32_t getNodeId( void ) { return _nodeId;};
+
93 
+
94  // in easyMeshDebug.cpp
+
95  void setDebugMsgTypes( uint16_t types );
+
96  void debugMsg( debugType type, const char* format ... );
+
97 
+
98  // in easyMesh.cpp
+
99 // void init( void );
+
100  void init( String ssid, String password, uint16_t port, _auth_mode authmode = AUTH_WPA2_PSK, uint8_t channel = 0, phy_mode_t phymode = PHY_MODE_11G, uint8_t maxtpw = 82, uint8_t hidden = 0, uint8_t maxconn = 4 );
+
101  void update( void );
+
102  bool sendSingle( uint32_t &destId, String &msg );
+
103  bool sendBroadcast( String &msg );
+
104 
+
105  // in easyMeshConnection.cpp
+
106  void setReceiveCallback( void(*onReceive)(uint32_t from, String &msg) );
+
107  void setNewConnectionCallback( void(*onNewConnection)(bool adopt) );
+
108  uint16_t connectionCount( meshConnectionType *exclude = NULL );
+
109 
+
110  // in easyMeshSync.cpp
+
111  uint32_t getNodeTime( void );
+
112 
+
113  // should be prototected, but public for debugging
+ + +
116  SimpleList<bss_info> _meshAPs;
+
117  SimpleList<meshConnectionType> _connections;
+
118 
+
119 protected:
+
120 
+
121  // in easyMeshComm.cpp
+
122  //must be accessable from callback
+
123  bool sendMessage( meshConnectionType *conn, uint32_t destId, meshPackageType type, String &msg );
+
124  bool sendMessage( uint32_t destId, meshPackageType type, String &msg );
+
125  bool broadcastMessage( uint32_t fromId, meshPackageType type, String &msg, meshConnectionType *exclude = NULL );
+
126 
+
127  bool sendPackage( meshConnectionType *connection, String &package );
+
128  String buildMeshPackage(uint32_t destId, meshPackageType type, String &msg);
+
129 
+
130 
+
131  // in easyMeshSync.cpp
+
132  //must be accessable from callback
+
133  void startNodeSync( meshConnectionType *conn );
+
134  void handleNodeSync( meshConnectionType *conn, JsonObject& root );
+
135  void startTimeSync( meshConnectionType *conn );
+
136  void handleTimeSync( meshConnectionType *conn, JsonObject& root );
+
137  bool adoptionCalc( meshConnectionType *conn );
+
138 
+
139  // in easyMeshConnection.cpp
+
140  void manageConnections( void );
+
141  String subConnectionJson( meshConnectionType *exclude );
+
142  meshConnectionType* findConnection( uint32_t nodeId );
+
143  meshConnectionType* findConnection( espconn *conn );
+
144  void cleanDeadConnections( void );
+
145  void tcpConnect( void );
+
146  bool connectToBestAP( void );
+
147  uint16_t jsonSubConnCount( String& subConns );
+ +
149 
+
150  // in easyMeshSTA.cpp
+
151  void manageStation( void );
+
152  static void stationScanCb(void *arg, STATUS status);
+
153  static void scanTimerCallback( void *arg );
+
154  void stationInit( void );
+
155  bool stationConnect( void );
+
156  void startStationScan( void );
+
157  uint32_t encodeNodeId( uint8_t *hwaddr );
+
158 
+
159  // in easyMeshAP.cpp
+
160  void apInit( void );
+
161  void tcpServerInit(espconn &serverConn, esp_tcp &serverTcp, espconn_connect_callback connectCb, uint32 port);
+
162 
+
163  // callbacks
+
164  // in easyMeshConnection.cpp
+
165  static void wifiEventCb(System_Event_t *event);
+
166  static void meshConnectedCb(void *arg);
+
167  static void meshSentCb(void *arg);
+
168  static void meshRecvCb(void *arg, char *data, unsigned short length);
+
169  static void meshDisconCb(void *arg);
+
170  static void meshReconCb(void *arg, sint8 err);
+
171 
+
172 
+
173  // variables
+
174  uint32_t _nodeId;
+
175  String _meshSSID;
+ +
177  uint16_t _meshPort;
+
178  uint8_t _meshChannel;
+
179  _auth_mode _meshAuthMode;
+
180  uint8_t _meshHidden;
+
181  uint8_t _meshMaxConn;
+
182 
+
183  os_timer_t _scanTimer;
+
184 
+ +
186  esp_tcp _meshServerTcp;
+
187 
+
188  espconn _stationConn;
+
189  esp_tcp _stationTcp;
+
190 };
+
191 
+
192 
+
193 #endif // _EASY_MESH_H_
+
nodeStatusType
Definition: easyMesh.h:22
+ +
syncStatusType
Definition: easyMesh.h:34
+
uint16_t connectionCount(meshConnectionType *exclude=NULL)
+
meshConnectionType * closeConnection(meshConnectionType *conn)
+ + + +
uint32_t lastRecieved
Definition: easyMesh.h:73
+
void startStationScan(void)
Definition: easyMeshSTA.cpp:69
+
void apInit(void)
Definition: easyMeshAP.cpp:21
+
SimpleList< meshConnectionType > _connections
Definition: easyMesh.h:117
+
scanStatusType
Definition: easyMesh.h:29
+
syncStatusType nodeSyncStatus
Definition: easyMesh.h:76
+ + +
static void stationScanCb(void *arg, STATUS status)
+
void tcpServerInit(espconn &serverConn, esp_tcp &serverTcp, espconn_connect_callback connectCb, uint32 port)
Definition: easyMeshAP.cpp:68
+
void manageStation(void)
Definition: easyMeshSTA.cpp:32
+
void update(void)
Definition: easyMesh.cpp:89
+ +
String _meshPassword
Definition: easyMesh.h:176
+
syncStatusType timeSyncStatus
Definition: easyMesh.h:79
+
uint32_t encodeNodeId(uint8_t *hwaddr)
+
uint16_t _meshPort
Definition: easyMesh.h:177
+
static void wifiEventCb(System_Event_t *event)
+
Definition: easyMesh.h:54
+
meshPackageType
Definition: easyMesh.h:41
+
uint8_t _meshChannel
Definition: easyMesh.h:178
+
uint8_t _meshMaxConn
Definition: easyMesh.h:181
+ + +
espconn _stationConn
Definition: easyMesh.h:188
+
os_timer_t _scanTimer
Definition: easyMesh.h:183
+
void init(String ssid, String password, uint16_t port, _auth_mode authmode=AUTH_WPA2_PSK, uint8_t channel=0, phy_mode_t phymode=PHY_MODE_11G, uint8_t maxtpw=82, uint8_t hidden=0, uint8_t maxconn=4)
Definition: easyMesh.cpp:48
+
uint32_t getNodeId(void)
Definition: easyMesh.h:92
+
uint32_t nodeSyncRequest
Definition: easyMesh.h:77
+
void stationInit(void)
Definition: easyMeshSTA.cpp:25
+
void manageConnections(void)
+
bool sendBroadcast(String &msg)
Definition: easyMesh.cpp:102
+
espconn _meshServerConn
Definition: easyMesh.h:185
+
static void meshConnectedCb(void *arg)
+
timeSync time
Definition: easyMesh.h:72
+
_auth_mode _meshAuthMode
Definition: easyMesh.h:179
+ +
void startTimeSync(meshConnectionType *conn)
+
uint32_t _nodeId
Definition: easyMesh.h:174
+ +
bool broadcastMessage(uint32_t fromId, meshPackageType type, String &msg, meshConnectionType *exclude=NULL)
+
void tcpConnect(void)
+
void debugMsg(debugType type, const char *format...)
+
esp_tcp _stationTcp
Definition: easyMesh.h:189
+ +
meshConnectionType * findConnection(uint32_t nodeId)
+
Definition: easyMesh.h:30
+
void setNewConnectionCallback(void(*onNewConnection)(bool adopt))
+
String subConnectionJson(meshConnectionType *exclude)
+
static void meshReconCb(void *arg, sint8 err)
+
SimpleList< String > sendQueue
Definition: easyMesh.h:85
+
void setDebugMsgTypes(uint16_t types)
+
void handleTimeSync(meshConnectionType *conn, JsonObject &root)
+
Definition: easyMesh.h:42
+
uint32_t lastTimeSync
Definition: easyMesh.h:80
+
static void meshDisconCb(void *arg)
+ + + +
scanStatusType _scanStatus
Definition: easyMesh.h:114
+
esp_tcp _meshServerTcp
Definition: easyMesh.h:186
+
static void meshSentCb(void *arg)
+ +
bool sendMessage(meshConnectionType *conn, uint32_t destId, meshPackageType type, String &msg)
+
Definition: easyMesh.h:58
+ +
nodeStatusType _nodeStatus
Definition: easyMesh.h:115
+
static void meshRecvCb(void *arg, char *data, unsigned short length)
+ + + +
espconn * esp_conn
Definition: easyMesh.h:69
+
String subConnections
Definition: easyMesh.h:71
+ +
static void scanTimerCallback(void *arg)
Definition: easyMeshSTA.cpp:96
+
void handleNodeSync(meshConnectionType *conn, JsonObject &root)
+ +
void setReceiveCallback(void(*onReceive)(uint32_t from, String &msg))
+ +
uint32_t getNodeTime(void)
+
bool sendPackage(meshConnectionType *connection, String &package)
+
String buildMeshPackage(uint32_t destId, meshPackageType type, String &msg)
+
debugType
Definition: easyMesh.h:53
+
void cleanDeadConnections(void)
+
bool connectToBestAP(void)
+
bool stationConnect(void)
+
bool sendSingle(uint32_t &destId, String &msg)
Definition: easyMesh.cpp:96
+
uint8_t _meshHidden
Definition: easyMesh.h:180
+
bool adoptionCalc(meshConnectionType *conn)
+
SimpleList< bss_info > _meshAPs
Definition: easyMesh.h:116
+ + +
void startNodeSync(meshConnectionType *conn)
+ +
uint32_t nodeId
Definition: easyMesh.h:70
+
uint16_t types
+
String _meshSSID
Definition: easyMesh.h:175
+ + + +
uint16_t jsonSubConnCount(String &subConns)
+
+
+ + + + diff --git a/docs/html/easy_mesh_a_p_8cpp.html b/docs/html/easy_mesh_a_p_8cpp.html new file mode 100644 index 0000000..78ceda7 --- /dev/null +++ b/docs/html/easy_mesh_a_p_8cpp.html @@ -0,0 +1,132 @@ + + + + + + +easyMesh: easyMeshAP.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMeshAP.cpp File Reference
+
+
+
#include <Arduino.h>
+#include "user_interface.h"
+#include "espconn.h"
+#include "easyMesh.h"
+
+Include dependency graph for easyMeshAP.cpp:
+
+
+ + +
+
+

Go to the source code of this file.

+
+
+ + + + diff --git a/docs/html/easy_mesh_a_p_8cpp__incl.map b/docs/html/easy_mesh_a_p_8cpp__incl.map new file mode 100644 index 0000000..bf6528b --- /dev/null +++ b/docs/html/easy_mesh_a_p_8cpp__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/easy_mesh_a_p_8cpp__incl.md5 b/docs/html/easy_mesh_a_p_8cpp__incl.md5 new file mode 100644 index 0000000..f0e5058 --- /dev/null +++ b/docs/html/easy_mesh_a_p_8cpp__incl.md5 @@ -0,0 +1 @@ +8046afb3d883f4abd45e117077158827 \ No newline at end of file diff --git a/docs/html/easy_mesh_a_p_8cpp__incl.png b/docs/html/easy_mesh_a_p_8cpp__incl.png new file mode 100644 index 0000000..6f2b68e Binary files /dev/null and b/docs/html/easy_mesh_a_p_8cpp__incl.png differ diff --git a/docs/html/easy_mesh_a_p_8cpp_source.html b/docs/html/easy_mesh_a_p_8cpp_source.html new file mode 100644 index 0000000..22ffc44 --- /dev/null +++ b/docs/html/easy_mesh_a_p_8cpp_source.html @@ -0,0 +1,221 @@ + + + + + + +easyMesh: easyMeshAP.cpp Source File + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMeshAP.cpp
+
+
+Go to the documentation of this file.
1 //
+
2 // easyMeshAP.cpp
+
3 //
+
4 //
+
5 // Created by Bill Gray on 7/26/16.
+
6 //
+
7 //
+
8 
+
9 #include <Arduino.h>
+
10 
+
11 extern "C" {
+
12 #include "user_interface.h"
+
13 #include "espconn.h"
+
14 }
+
15 
+
16 #include "easyMesh.h"
+
17 
+
18 
+
19 // AP functions
+
20 //***********************************************************************
+
21 void ICACHE_FLASH_ATTR easyMesh::apInit( void ) {
+
22 // String password( MESH_PASSWORD );
+
23 
+
24  ip_addr ip, netmask;
+
25  IP4_ADDR( &ip, 192, 168, ( _nodeId & 0xFF ), 1);
+
26  IP4_ADDR( &netmask, 255, 255, 255, 0);
+
27 
+
28  ip_info ipInfo;
+
29  ipInfo.ip = ip;
+
30  ipInfo.gw = ip;
+
31  ipInfo.netmask = netmask;
+
32  if ( !wifi_set_ip_info( SOFTAP_IF, &ipInfo ) ) {
+
33  debugMsg( ERROR, "wifi_set_ip_info() failed\n");
+
34  }
+
35 
+
36  debugMsg( STARTUP, "apInit(): Starting AP with SSID=%s IP=%d.%d.%d.%d GW=%d.%d.%d.%d NM=%d.%d.%d.%d\n",
+
37  _meshSSID.c_str(),
+
38  IP2STR( &ipInfo.ip ),
+
39  IP2STR( &ipInfo.gw ),
+
40  IP2STR( &ipInfo.netmask ) );
+
41 
+
42  softap_config apConfig;
+
43  wifi_softap_get_config( &apConfig );
+
44 
+
45  memset( apConfig.ssid, 0, 32 );
+
46  memset( apConfig.password, 0, 64);
+
47  memcpy( apConfig.ssid, _meshSSID.c_str(), _meshSSID.length());
+
48  memcpy( apConfig.password, _meshPassword.c_str(), _meshPassword.length() );
+
49 
+
50  apConfig.authmode = _meshAuthMode; // AUTH_WPA2_PSK
+
51  apConfig.ssid_len = _meshSSID.length();
+
52  apConfig.ssid_hidden = _meshHidden;
+
53  apConfig.channel = _meshChannel;
+
54  apConfig.beacon_interval = 100;
+
55  apConfig.max_connection = _meshMaxConn; // how many stations can connect to ESP8266 softAP at most.
+
56 
+
57  wifi_softap_set_config(&apConfig);// Set ESP8266 softap config .
+
58  if ( !wifi_softap_dhcps_start() )
+
59  debugMsg( ERROR, "DHCP server failed\n");
+
60  else
+
61  debugMsg( STARTUP, "DHCP server started\n");
+
62 
+
63  // establish AP tcpServers
+ +
65 }
+
66 
+
67 //***********************************************************************
+
68 void ICACHE_FLASH_ATTR easyMesh::tcpServerInit(espconn &serverConn, esp_tcp &serverTcp, espconn_connect_callback connectCb, uint32 port) {
+
69 
+
70  debugMsg( GENERAL, "tcpServerInit():\n");
+
71 
+
72  serverConn.type = ESPCONN_TCP;
+
73  serverConn.state = ESPCONN_NONE;
+
74  serverConn.proto.tcp = &serverTcp;
+
75  serverConn.proto.tcp->local_port = port;
+
76  espconn_regist_connectcb(&serverConn, connectCb);
+
77  sint8 ret = espconn_accept(&serverConn);
+
78  if ( ret == 0 )
+
79  debugMsg( STARTUP, "AP tcp server established on port %d\n", port );
+
80  else
+
81  debugMsg( ERROR, "AP tcp server on port %d FAILED ret=%d\n", port, ret);
+
82 
+
83  return;
+
84 }
+
void apInit(void)
Definition: easyMeshAP.cpp:21
+
void tcpServerInit(espconn &serverConn, esp_tcp &serverTcp, espconn_connect_callback connectCb, uint32 port)
Definition: easyMeshAP.cpp:68
+ +
String _meshPassword
Definition: easyMesh.h:176
+
uint16_t _meshPort
Definition: easyMesh.h:177
+
Definition: easyMesh.h:54
+
uint8_t _meshChannel
Definition: easyMesh.h:178
+
uint8_t _meshMaxConn
Definition: easyMesh.h:181
+ +
espconn _meshServerConn
Definition: easyMesh.h:185
+
static void meshConnectedCb(void *arg)
+
_auth_mode _meshAuthMode
Definition: easyMesh.h:179
+ +
uint32_t _nodeId
Definition: easyMesh.h:174
+
void debugMsg(debugType type, const char *format...)
+
esp_tcp _meshServerTcp
Definition: easyMesh.h:186
+
uint8_t _meshHidden
Definition: easyMesh.h:180
+
String _meshSSID
Definition: easyMesh.h:175
+
+
+ + + + diff --git a/docs/html/easy_mesh_comm_8cpp.html b/docs/html/easy_mesh_comm_8cpp.html new file mode 100644 index 0000000..2e03fc0 --- /dev/null +++ b/docs/html/easy_mesh_comm_8cpp.html @@ -0,0 +1,155 @@ + + + + + + +easyMesh: easyMeshComm.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
easyMeshComm.cpp File Reference
+
+
+
#include <Arduino.h>
+#include <ArduinoJson.h>
+#include <SimpleList.h>
+#include "easyMesh.h"
+
+Include dependency graph for easyMeshComm.cpp:
+
+
+ + +
+
+

Go to the source code of this file.

+ + + + +

+Variables

easyMeshstaticThis
 
+

Variable Documentation

+ +
+
+ + + + +
easyMesh* staticThis
+
+ +

Definition at line 14 of file easyMesh.cpp.

+ +
+
+
+
+ + + + diff --git a/docs/html/easy_mesh_comm_8cpp.js b/docs/html/easy_mesh_comm_8cpp.js new file mode 100644 index 0000000..cf52d37 --- /dev/null +++ b/docs/html/easy_mesh_comm_8cpp.js @@ -0,0 +1,4 @@ +var easy_mesh_comm_8cpp = +[ + [ "staticThis", "easy_mesh_comm_8cpp.html#a7f0b8b20ed2a74609af106ba4f0f6c06", null ] +]; \ No newline at end of file diff --git a/docs/html/easy_mesh_comm_8cpp__incl.map b/docs/html/easy_mesh_comm_8cpp__incl.map new file mode 100644 index 0000000..6e55417 --- /dev/null +++ b/docs/html/easy_mesh_comm_8cpp__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/easy_mesh_comm_8cpp__incl.md5 b/docs/html/easy_mesh_comm_8cpp__incl.md5 new file mode 100644 index 0000000..77fd4e0 --- /dev/null +++ b/docs/html/easy_mesh_comm_8cpp__incl.md5 @@ -0,0 +1 @@ +6cc7f14005d068425da96afee8bc3c7a \ No newline at end of file diff --git a/docs/html/easy_mesh_comm_8cpp__incl.png b/docs/html/easy_mesh_comm_8cpp__incl.png new file mode 100644 index 0000000..dd9388e Binary files /dev/null and b/docs/html/easy_mesh_comm_8cpp__incl.png differ diff --git a/docs/html/easy_mesh_comm_8cpp_source.html b/docs/html/easy_mesh_comm_8cpp_source.html new file mode 100644 index 0000000..53fc3c0 --- /dev/null +++ b/docs/html/easy_mesh_comm_8cpp_source.html @@ -0,0 +1,267 @@ + + + + + + +easyMesh: easyMeshComm.cpp Source File + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMeshComm.cpp
+
+
+Go to the documentation of this file.
1 //
+
2 // easyMeshComm.cpp
+
3 //
+
4 //
+
5 // Created by Bill Gray on 7/26/16.
+
6 //
+
7 //
+
8 
+
9 #include <Arduino.h>
+
10 #include <ArduinoJson.h>
+
11 #include <SimpleList.h>
+
12 
+
13 #include "easyMesh.h"
+
14 
+
15 extern easyMesh* staticThis;
+
16 
+
17 // communications functions
+
18 //***********************************************************************
+
19 bool ICACHE_FLASH_ATTR easyMesh::sendMessage( meshConnectionType *conn, uint32_t destId, meshPackageType type, String &msg ) {
+
20  debugMsg( COMMUNICATION, "sendMessage(conn): conn-nodeId=%d destId=%d type=%d msg=%s\n",
+
21  conn->nodeId, destId, (uint8_t)type, msg.c_str());
+
22 
+
23  String package = buildMeshPackage( destId, type, msg );
+
24 
+
25  return sendPackage( conn, package );
+
26 }
+
27 
+
28 //***********************************************************************
+
29 bool ICACHE_FLASH_ATTR easyMesh::sendMessage( uint32_t destId, meshPackageType type, String &msg ) {
+
30  debugMsg( COMMUNICATION, "In sendMessage(destId): destId=%d type=%d, msg=%s\n",
+
31  destId, type, msg.c_str());
+
32 
+
33  meshConnectionType *conn = findConnection( destId );
+
34  if ( conn != NULL ) {
+
35  return sendMessage( conn, destId, type, msg );
+
36  }
+
37  else {
+
38  debugMsg( ERROR, "In sendMessage(destId): findConnection( destId ) failed\n");
+
39  return false;
+
40  }
+
41 }
+
42 
+
43 
+
44 //***********************************************************************
+
45 bool ICACHE_FLASH_ATTR easyMesh::broadcastMessage(uint32_t from,
+
46  meshPackageType type,
+
47  String &msg,
+
48  meshConnectionType *exclude ) {
+
49 
+
50  // send a message to every node on the mesh
+
51 
+
52  if ( exclude != NULL )
+
53  debugMsg( COMMUNICATION, "broadcastMessage(): from=%d type=%d, msg=%s exclude=%d\n",
+
54  from, type, msg.c_str(), exclude->nodeId);
+
55  else
+
56  debugMsg( COMMUNICATION, "broadcastMessage(): from=%d type=%d, msg=%s exclude=NULL\n",
+
57  from, type, msg.c_str());
+
58 
+
59  SimpleList<meshConnectionType>::iterator connection = _connections.begin();
+
60  while ( connection != _connections.end() ) {
+
61  if ( connection != exclude ) {
+
62  sendMessage( connection, connection->nodeId, type, msg );
+
63  }
+
64  connection++;
+
65  }
+
66  return true; // hmmm... ought to be smarter than this!
+
67 }
+
68 
+
69 //***********************************************************************
+
70 bool ICACHE_FLASH_ATTR easyMesh::sendPackage( meshConnectionType *connection, String &package ) {
+
71  debugMsg( COMMUNICATION, "Sending to %d-->%s<--\n", connection->nodeId, package.c_str() );
+
72 
+
73  if ( package.length() > 1400 )
+
74  debugMsg( ERROR, "sendPackage(): err package too long length=%d\n", package.length());
+
75 
+
76  if ( connection->sendReady == true ) {
+
77  sint8 errCode = espconn_send( connection->esp_conn, (uint8*)package.c_str(), package.length() );
+
78  connection->sendReady = false;
+
79 
+
80  if ( errCode == 0 ) {
+
81  return true;
+
82  }
+
83  else {
+
84  debugMsg( ERROR, "sendPackage(): espconn_send Failed err=%d\n", errCode );
+
85  return false;
+
86  }
+
87  }
+
88  else {
+
89  connection->sendQueue.push_back( package );
+
90  }
+
91 }
+
92 
+
93 //***********************************************************************
+
94 String ICACHE_FLASH_ATTR easyMesh::buildMeshPackage( uint32_t destId, meshPackageType type, String &msg ) {
+
95  debugMsg( GENERAL, "In buildMeshPackage(): msg=%s\n", msg.c_str() );
+
96 
+
97  DynamicJsonBuffer jsonBuffer( JSON_BUFSIZE );
+
98  JsonObject& root = jsonBuffer.createObject();
+
99  root["dest"] = destId;
+
100  root["from"] = _nodeId;
+
101  root["type"] = (uint8_t)type;
+
102 
+
103  switch( type ) {
+
104  case NODE_SYNC_REQUEST:
+
105  case NODE_SYNC_REPLY:
+
106  {
+
107  JsonArray& subs = jsonBuffer.parseArray( msg );
+
108  if ( !subs.success() ) {
+
109  debugMsg( GENERAL, "buildMeshPackage(): subs = jsonBuffer.parseArray( msg ) failed!");
+
110  }
+
111  root["subs"] = subs;
+
112  break;
+
113  }
+
114  case TIME_SYNC:
+
115  root["msg"] = jsonBuffer.parseObject( msg );
+
116  break;
+
117  default:
+
118  root["msg"] = msg;
+
119  }
+
120 
+
121  String ret;
+
122  root.printTo( ret );
+
123  return ret;
+
124 }
+ + +
SimpleList< meshConnectionType > _connections
Definition: easyMesh.h:117
+ +
Definition: easyMesh.h:54
+
meshPackageType
Definition: easyMesh.h:41
+ + +
#define JSON_BUFSIZE
Definition: easyMesh.h:19
+ +
uint32_t _nodeId
Definition: easyMesh.h:174
+ +
bool broadcastMessage(uint32_t fromId, meshPackageType type, String &msg, meshConnectionType *exclude=NULL)
+
void debugMsg(debugType type, const char *format...)
+
meshConnectionType * findConnection(uint32_t nodeId)
+
SimpleList< String > sendQueue
Definition: easyMesh.h:85
+ +
bool sendMessage(meshConnectionType *conn, uint32_t destId, meshPackageType type, String &msg)
+
easyMesh * staticThis
Definition: easyMesh.cpp:14
+
espconn * esp_conn
Definition: easyMesh.h:69
+
bool sendPackage(meshConnectionType *connection, String &package)
+
String buildMeshPackage(uint32_t destId, meshPackageType type, String &msg)
+ +
uint32_t nodeId
Definition: easyMesh.h:70
+
+
+ + + + diff --git a/docs/html/easy_mesh_connection_8cpp.html b/docs/html/easy_mesh_connection_8cpp.html new file mode 100644 index 0000000..7cee399 --- /dev/null +++ b/docs/html/easy_mesh_connection_8cpp.html @@ -0,0 +1,157 @@ + + + + + + +easyMesh: easyMeshConnection.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
easyMeshConnection.cpp File Reference
+
+
+
#include <Arduino.h>
+#include <ArduinoJson.h>
+#include <SimpleList.h>
+#include "user_interface.h"
+#include "espconn.h"
+#include "easyMesh.h"
+
+Include dependency graph for easyMeshConnection.cpp:
+
+
+ + +
+
+

Go to the source code of this file.

+ + + + +

+Variables

easyMeshstaticThis
 
+

Variable Documentation

+ +
+
+ + + + +
easyMesh* staticThis
+
+ +

Definition at line 14 of file easyMesh.cpp.

+ +
+
+
+
+ + + + diff --git a/docs/html/easy_mesh_connection_8cpp.js b/docs/html/easy_mesh_connection_8cpp.js new file mode 100644 index 0000000..a804353 --- /dev/null +++ b/docs/html/easy_mesh_connection_8cpp.js @@ -0,0 +1,4 @@ +var easy_mesh_connection_8cpp = +[ + [ "staticThis", "easy_mesh_connection_8cpp.html#a7f0b8b20ed2a74609af106ba4f0f6c06", null ] +]; \ No newline at end of file diff --git a/docs/html/easy_mesh_connection_8cpp__incl.map b/docs/html/easy_mesh_connection_8cpp__incl.map new file mode 100644 index 0000000..717e18c --- /dev/null +++ b/docs/html/easy_mesh_connection_8cpp__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/easy_mesh_connection_8cpp__incl.md5 b/docs/html/easy_mesh_connection_8cpp__incl.md5 new file mode 100644 index 0000000..e9db01f --- /dev/null +++ b/docs/html/easy_mesh_connection_8cpp__incl.md5 @@ -0,0 +1 @@ +3dcf4b0766370e5245d455c5a25aaa33 \ No newline at end of file diff --git a/docs/html/easy_mesh_connection_8cpp__incl.png b/docs/html/easy_mesh_connection_8cpp__incl.png new file mode 100644 index 0000000..7dedc4d Binary files /dev/null and b/docs/html/easy_mesh_connection_8cpp__incl.png differ diff --git a/docs/html/easy_mesh_connection_8cpp_source.html b/docs/html/easy_mesh_connection_8cpp_source.html new file mode 100644 index 0000000..e301a2c --- /dev/null +++ b/docs/html/easy_mesh_connection_8cpp_source.html @@ -0,0 +1,589 @@ + + + + + + +easyMesh: easyMeshConnection.cpp Source File + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMeshConnection.cpp
+
+
+Go to the documentation of this file.
1 //
+
2 // easyMeshConnection.cpp
+
3 //
+
4 //
+
5 // Created by Bill Gray on 7/26/16.
+
6 //
+
7 //
+
8 
+
9 #include <Arduino.h>
+
10 #include <ArduinoJson.h>
+
11 #include <SimpleList.h>
+
12 
+
13 extern "C" {
+
14 #include "user_interface.h"
+
15 #include "espconn.h"
+
16 }
+
17 
+
18 #include "easyMesh.h"
+
19 
+
20 static void (*receivedCallback)( uint32_t from, String &msg);
+
21 static void (*newConnectionCallback)( bool adopt );
+
22 
+
23 extern easyMesh* staticThis;
+
24 
+
25 // connection managment functions
+
26 //***********************************************************************
+
27 void ICACHE_FLASH_ATTR easyMesh::setReceiveCallback( void(*onReceive)(uint32_t from, String &msg) ) {
+
28  debugMsg( GENERAL, "setReceiveCallback():\n");
+
29  receivedCallback = onReceive;
+
30 }
+
31 
+
32 //***********************************************************************
+
33 void ICACHE_FLASH_ATTR easyMesh::setNewConnectionCallback( void(*onNewConnection)(bool adopt) ) {
+
34  debugMsg( GENERAL, "setNewConnectionCallback():\n");
+
35  newConnectionCallback = onNewConnection;
+
36 }
+
37 
+
38 //***********************************************************************
+ +
40  // It seems that more should be done here... perhas send off a packette to
+
41  // make an attempt to tell the other node that we are closing this conneciton?
+
42  debugMsg( CONNECTION, "closeConnection(): conn-nodeId=%d\n", conn->nodeId );
+
43  espconn_disconnect( conn->esp_conn );
+
44  return _connections.erase( conn );
+
45 }
+
46 
+
47 //***********************************************************************
+
48 void ICACHE_FLASH_ATTR easyMesh::manageConnections( void ) {
+
49  debugMsg( GENERAL, "manageConnections():\n");
+
50  SimpleList<meshConnectionType>::iterator connection = _connections.begin();
+
51  while ( connection != _connections.end() ) {
+
52  if ( connection->lastRecieved + NODE_TIMEOUT < getNodeTime() ) {
+
53  debugMsg( CONNECTION, "manageConnections(): dropping %d NODE_TIMEOUT last=%u node=%u\n", connection->nodeId, connection->lastRecieved, getNodeTime() );
+
54 
+
55  connection = closeConnection( connection );
+
56  continue;
+
57  }
+
58 
+
59  if( connection->esp_conn->state == ESPCONN_CLOSE ) {
+
60  debugMsg( CONNECTION, "manageConnections(): dropping %d ESPCONN_CLOSE\n",connection->nodeId);
+
61  connection = closeConnection( connection );
+
62  continue;
+
63  }
+
64 
+
65  switch ( connection->nodeSyncStatus ) {
+
66  case NEEDED: // start a nodeSync
+
67  debugMsg( SYNC, "manageConnections(): start nodeSync with %d\n", connection->nodeId);
+
68  startNodeSync( connection );
+
69  connection->nodeSyncStatus = IN_PROGRESS;
+
70 
+
71  case IN_PROGRESS:
+
72  connection++;
+
73  continue;
+
74  }
+
75 
+
76  switch ( connection->timeSyncStatus ) {
+
77  case NEEDED:
+
78  debugMsg( SYNC, "manageConnections(): starting timeSync with %d\n", connection->nodeId);
+
79  startTimeSync( connection );
+
80  connection->timeSyncStatus = IN_PROGRESS;
+
81 
+
82  case IN_PROGRESS:
+
83  connection++;
+
84  continue;
+
85  }
+
86 
+
87  if ( connection->newConnection == true ) { // we should only get here once first nodeSync and timeSync are complete
+
88  newConnectionCallback( adoptionCalc( connection ) );
+
89  connection->newConnection = false;
+
90 
+
91  connection++;
+
92  continue;
+
93  }
+
94 
+
95  // check to see if we've recieved something lately. Else, flag for new sync.
+
96  // Stagger AP and STA so that they don't try to start a sync at the same time.
+
97  uint32_t nodeTime = getNodeTime();
+
98  if ( connection->nodeSyncRequest == 0 ) { // nodeSync not in progress
+
99  if ( (connection->esp_conn->proto.tcp->local_port == _meshPort // we are AP
+
100  &&
+
101  connection->lastRecieved + ( NODE_TIMEOUT / 2 ) < nodeTime )
+
102  ||
+
103  (connection->esp_conn->proto.tcp->local_port != _meshPort // we are the STA
+
104  &&
+
105  connection->lastRecieved + ( NODE_TIMEOUT * 3 / 4 ) < nodeTime )
+
106  ) {
+
107  connection->nodeSyncStatus = NEEDED;
+
108  }
+
109  }
+
110  connection++;
+
111  }
+
112 }
+
113 
+
114 //***********************************************************************
+
115 meshConnectionType* ICACHE_FLASH_ATTR easyMesh::findConnection( uint32_t nodeId ) {
+
116  debugMsg( GENERAL, "In findConnection(nodeId)\n");
+
117 
+
118  SimpleList<meshConnectionType>::iterator connection = _connections.begin();
+
119  while ( connection != _connections.end() ) {
+
120 
+
121  if ( connection->nodeId == nodeId ) { // check direct connections
+
122  debugMsg( GENERAL, "findConnection(nodeId): Found Direct Connection\n");
+
123  return connection;
+
124  }
+
125 
+
126  String nodeIdStr(nodeId);
+
127  if ( connection->subConnections.indexOf(nodeIdStr) != -1 ) { // check sub-connections
+
128  debugMsg( GENERAL, "findConnection(nodeId): Found Sub Connection\n");
+
129  return connection;
+
130  }
+
131 
+
132  connection++;
+
133  }
+
134  debugMsg( CONNECTION, "findConnection(%d): did not find connection\n", nodeId );
+
135  return NULL;
+
136 }
+
137 
+
138 //***********************************************************************
+
139 meshConnectionType* ICACHE_FLASH_ATTR easyMesh::findConnection( espconn *conn ) {
+
140  debugMsg( GENERAL, "In findConnection(esp_conn) conn=0x%x\n", conn );
+
141 
+
142  int i=0;
+
143 
+
144  SimpleList<meshConnectionType>::iterator connection = _connections.begin();
+
145  while ( connection != _connections.end() ) {
+
146  if ( connection->esp_conn == conn ) {
+
147  return connection;
+
148  }
+
149  connection++;
+
150  }
+
151 
+
152  debugMsg( CONNECTION, "findConnection(espconn): Did not Find\n");
+
153  return NULL;
+
154 }
+
155 
+
156 //***********************************************************************
+
157 String ICACHE_FLASH_ATTR easyMesh::subConnectionJson( meshConnectionType *exclude ) {
+
158  debugMsg( GENERAL, "subConnectionJson(), exclude=%d\n", exclude->nodeId );
+
159 
+
160  DynamicJsonBuffer jsonBuffer( JSON_BUFSIZE );
+
161  JsonArray& subArray = jsonBuffer.createArray();
+
162  if ( !subArray.success() )
+
163  debugMsg( ERROR, "subConnectionJson(): ran out of memory 1");
+
164 
+
165  SimpleList<meshConnectionType>::iterator sub = _connections.begin();
+
166  while ( sub != _connections.end() ) {
+
167  if ( sub != exclude && sub->nodeId != 0 ) { //exclude connection that we are working with & anything too new.
+
168  JsonObject& subObj = jsonBuffer.createObject();
+
169  if ( !subObj.success() )
+
170  debugMsg( ERROR, "subConnectionJson(): ran out of memory 2");
+
171 
+
172  subObj["nodeId"] = sub->nodeId;
+
173 
+
174  if ( sub->subConnections.length() != 0 ) {
+
175  //debugMsg( GENERAL, "subConnectionJson(): sub->subConnections=%s\n", sub->subConnections.c_str() );
+
176 
+
177  JsonArray& subs = jsonBuffer.parseArray( sub->subConnections );
+
178  if ( !subs.success() )
+
179  debugMsg( ERROR, "subConnectionJson(): ran out of memory 3");
+
180 
+
181  subObj["subs"] = subs;
+
182  }
+
183 
+
184  if ( !subArray.add( subObj ) )
+
185  debugMsg( ERROR, "subConnectionJson(): ran out of memory 4");
+
186  }
+
187  sub++;
+
188  }
+
189 
+
190  String ret;
+
191  subArray.printTo( ret );
+
192  debugMsg( GENERAL, "subConnectionJson(): ret=%s\n", ret.c_str());
+
193  return ret;
+
194 }
+
195 
+
196 //***********************************************************************
+
197 uint16_t ICACHE_FLASH_ATTR easyMesh::connectionCount( meshConnectionType *exclude ) {
+
198  uint16_t count = 0;
+
199 
+
200  SimpleList<meshConnectionType>::iterator sub = _connections.begin();
+
201  while ( sub != _connections.end() ) {
+
202  if ( sub != exclude ) { //exclude this connection in the calc.
+
203  count += ( 1 + jsonSubConnCount( sub->subConnections ) );
+
204  }
+
205  sub++;
+
206  }
+
207 
+
208  debugMsg( GENERAL, "connectionCount(): count=%d\n", count);
+
209  return count;
+
210 }
+
211 
+
212 //***********************************************************************
+
213 uint16_t ICACHE_FLASH_ATTR easyMesh::jsonSubConnCount( String& subConns ) {
+
214  debugMsg( GENERAL, "jsonSubConnCount(): subConns=%s\n", subConns.c_str() );
+
215 
+
216  uint16_t count = 0;
+
217 
+
218  if ( subConns.length() < 3 )
+
219  return 0;
+
220 
+
221  DynamicJsonBuffer jsonBuffer( JSON_BUFSIZE );
+
222  JsonArray& subArray = jsonBuffer.parseArray( subConns );
+
223 
+
224  if ( !subArray.success() ) {
+
225  debugMsg( ERROR, "subConnCount(): out of memory1\n");
+
226  }
+
227 
+
228  String str;
+
229  for ( uint8_t i = 0; i < subArray.size(); i++ ) {
+
230  str = subArray.get<String>(i);
+
231  debugMsg( GENERAL, "jsonSubConnCount(): str=%s\n", str.c_str() );
+
232  JsonObject& obj = jsonBuffer.parseObject( str );
+
233  if ( !obj.success() ) {
+
234  debugMsg( ERROR, "subConnCount(): out of memory2\n");
+
235  }
+
236 
+
237  str = obj.get<String>("subs");
+
238  count += ( 1 + jsonSubConnCount( str ) );
+
239  }
+
240 
+
241  debugMsg( CONNECTION, "jsonSubConnCount(): leaving count=%d\n", count );
+
242 
+
243  return count;
+
244 }
+
245 
+
246 //***********************************************************************
+
247 void ICACHE_FLASH_ATTR easyMesh::meshConnectedCb(void *arg) {
+
248  staticThis->debugMsg( CONNECTION, "meshConnectedCb(): new meshConnection !!!\n");
+
249  meshConnectionType newConn;
+
250  newConn.esp_conn = (espconn *)arg;
+
251  espconn_set_opt( newConn.esp_conn, ESPCONN_NODELAY ); // removes nagle, low latency, but soaks up bandwidth
+
252  newConn.lastRecieved = staticThis->getNodeTime();
+
253 
+
254  espconn_regist_recvcb(newConn.esp_conn, meshRecvCb);
+
255  espconn_regist_sentcb(newConn.esp_conn, meshSentCb);
+
256  espconn_regist_reconcb(newConn.esp_conn, meshReconCb);
+
257  espconn_regist_disconcb(newConn.esp_conn, meshDisconCb);
+
258 
+
259  staticThis->_connections.push_back( newConn );
+
260 
+
261  if( newConn.esp_conn->proto.tcp->local_port != staticThis->_meshPort ) { // we are the station, start nodeSync
+
262  staticThis->debugMsg( CONNECTION, "meshConnectedCb(): we are STA, start nodeSync\n");
+
263  staticThis->startNodeSync( staticThis->_connections.end() - 1 );
+
264  newConn.timeSyncStatus = NEEDED;
+
265  }
+
266  else
+
267  staticThis->debugMsg( CONNECTION, "meshConnectedCb(): we are AP\n");
+
268 
+
269  staticThis->debugMsg( GENERAL, "meshConnectedCb(): leaving\n");
+
270 }
+
271 
+
272 //***********************************************************************
+
273 void ICACHE_FLASH_ATTR easyMesh::meshRecvCb(void *arg, char *data, unsigned short length) {
+
274  meshConnectionType *receiveConn = staticThis->findConnection( (espconn *)arg );
+
275 
+
276  staticThis->debugMsg( COMMUNICATION, "meshRecvCb(): data=%s fromId=%d\n", data, receiveConn->nodeId );
+
277 
+
278  if ( receiveConn == NULL ) {
+
279  staticThis->debugMsg( ERROR, "meshRecvCb(): recieved from unknown connection 0x%x ->%s<-\n", arg, data);
+
280  staticThis->debugMsg( ERROR, "dropping this msg... see if we recover?\n");
+
281  return;
+
282  }
+
283 
+
284 
+
285  String somestring( data ); //copy data before json parsing ... why does this work?
+
286  DynamicJsonBuffer jsonBuffer( JSON_BUFSIZE );
+
287  JsonObject& root = jsonBuffer.parseObject( data );
+
288  if (!root.success()) { // Test if parsing succeeded.
+
289  staticThis->debugMsg( ERROR, "meshRecvCb: parseObject() failed. data=%s<--\n", data);
+
290  return;
+
291  }
+
292 
+
293  staticThis->debugMsg( GENERAL, "Recvd from %d-->%s<--\n", receiveConn->nodeId, data);
+
294 
+
295  String msg = root["msg"];
+
296 
+
297  switch( (meshPackageType)(int)root["type"] ) {
+
298  case NODE_SYNC_REQUEST:
+
299  case NODE_SYNC_REPLY:
+
300  staticThis->handleNodeSync( receiveConn, root );
+
301  break;
+
302 
+
303  case TIME_SYNC:
+
304  staticThis->handleTimeSync( receiveConn, root );
+
305  break;
+
306 
+
307  case SINGLE:
+
308  if ( (uint32_t)root["dest"] == staticThis->getNodeId() ) { // msg for us!
+
309  receivedCallback( (uint32_t)root["from"], msg);
+
310  } else { // pass it along
+
311  //staticThis->sendMessage( (uint32_t)root["dest"], (uint32_t)root["from"], SINGLE, msg ); //this is ineffiecnt
+
312  String tempStr( data );
+
313  staticThis->sendPackage( staticThis->findConnection( (uint32_t)root["dest"] ), tempStr );
+
314  }
+
315  break;
+
316 
+
317  case BROADCAST:
+
318  staticThis->broadcastMessage( (uint32_t)root["from"], BROADCAST, msg, receiveConn);
+
319  receivedCallback( (uint32_t)root["from"], msg);
+
320  break;
+
321 
+
322  default:
+
323  staticThis->debugMsg( ERROR, "meshRecvCb(): unexpected json, root[\"type\"]=%d", (int)root["type"]);
+
324  return;
+
325  }
+
326 
+
327  // record that we've gotten a valid package
+
328  receiveConn->lastRecieved = staticThis->getNodeTime();
+
329  return;
+
330 }
+
331 
+
332 //***********************************************************************
+
333 void ICACHE_FLASH_ATTR easyMesh::meshSentCb(void *arg) {
+
334  staticThis->debugMsg( GENERAL, "meshSentCb():\n"); //data sent successfully
+
335  espconn *conn = (espconn*)arg;
+
336  meshConnectionType *meshConnection = staticThis->findConnection( conn );
+
337 
+
338  if ( meshConnection == NULL ) {
+
339  staticThis->debugMsg( ERROR, "meshSentCb(): err did not find meshConnection? Likely it was dropped for some reason\n");
+
340  return;
+
341  }
+
342 
+
343  if ( !meshConnection->sendQueue.empty() ) {
+
344  String package = *meshConnection->sendQueue.begin();
+
345  meshConnection->sendQueue.pop_front();
+
346  sint8 errCode = espconn_send( meshConnection->esp_conn, (uint8*)package.c_str(), package.length() );
+
347  //connection->sendReady = false;
+
348 
+
349  if ( errCode != 0 ) {
+
350  staticThis->debugMsg( ERROR, "meshSentCb(): espconn_send Failed err=%d\n", errCode );
+
351  }
+
352  }
+
353  else {
+
354  meshConnection->sendReady = true;
+
355  }
+
356 }
+
357 //***********************************************************************
+
358 void ICACHE_FLASH_ATTR easyMesh::meshDisconCb(void *arg) {
+
359  struct espconn *disConn = (espconn *)arg;
+
360 
+
361  staticThis->debugMsg( CONNECTION, "meshDisconCb(): ");
+
362 
+
363  //test to see if this connection was on the STATION interface by checking the local port
+
364  if ( disConn->proto.tcp->local_port == staticThis->_meshPort ) {
+
365  staticThis->debugMsg( CONNECTION, "AP connection. No new action needed. local_port=%d\n", disConn->proto.tcp->local_port);
+
366  }
+
367  else {
+
368  staticThis->debugMsg( CONNECTION, "Station Connection! Find new node. local_port=%d\n", disConn->proto.tcp->local_port);
+
369  // should start up automatically when station_status changes to IDLE
+
370  wifi_station_disconnect();
+
371  }
+
372 
+
373  return;
+
374 }
+
375 
+
376 //***********************************************************************
+
377 void ICACHE_FLASH_ATTR easyMesh::meshReconCb(void *arg, sint8 err) {
+
378  staticThis->debugMsg( ERROR, "In meshReconCb(): err=%d\n", err );
+
379 }
+
380 
+
381 //***********************************************************************
+
382 void ICACHE_FLASH_ATTR easyMesh::wifiEventCb(System_Event_t *event) {
+
383  switch (event->event) {
+
384  case EVENT_STAMODE_CONNECTED:
+
385  staticThis->debugMsg( CONNECTION, "wifiEventCb(): EVENT_STAMODE_CONNECTED ssid=%s\n", (char*)event->event_info.connected.ssid );
+
386  break;
+
387  case EVENT_STAMODE_DISCONNECTED:
+
388  staticThis->debugMsg( CONNECTION, "wifiEventCb(): EVENT_STAMODE_DISCONNECTED\n");
+
389  staticThis->connectToBestAP();
+
390  break;
+
391  case EVENT_STAMODE_AUTHMODE_CHANGE:
+
392  staticThis->debugMsg( CONNECTION, "wifiEventCb(): EVENT_STAMODE_AUTHMODE_CHANGE\n");
+
393  break;
+
394  case EVENT_STAMODE_GOT_IP:
+
395  staticThis->debugMsg( CONNECTION, "wifiEventCb(): EVENT_STAMODE_GOT_IP\n");
+
396  staticThis->tcpConnect();
+
397  break;
+
398 
+
399  case EVENT_SOFTAPMODE_STACONNECTED:
+
400  staticThis->debugMsg( CONNECTION, "wifiEventCb(): EVENT_SOFTAPMODE_STACONNECTED\n");
+
401  break;
+
402 
+
403  case EVENT_SOFTAPMODE_STADISCONNECTED:
+
404  staticThis->debugMsg( CONNECTION, "wifiEventCb(): EVENT_SOFTAPMODE_STADISCONNECTED\n");
+
405  break;
+
406  case EVENT_STAMODE_DHCP_TIMEOUT:
+
407  staticThis->debugMsg( CONNECTION, "wifiEventCb(): EVENT_STAMODE_DHCP_TIMEOUT\n");
+
408  break;
+
409  case EVENT_SOFTAPMODE_PROBEREQRECVED:
+
410  // debugMsg( GENERAL, "Event: EVENT_SOFTAPMODE_PROBEREQRECVED\n"); // dont need to know about every probe request
+
411  break;
+
412  default:
+
413  staticThis->debugMsg( ERROR, "Unexpected WiFi event: %d\n", event->event);
+
414  break;
+
415  }
+
416 }
+ +
uint16_t connectionCount(meshConnectionType *exclude=NULL)
+
meshConnectionType * closeConnection(meshConnectionType *conn)
+ +
uint32_t lastRecieved
Definition: easyMesh.h:73
+
SimpleList< meshConnectionType > _connections
Definition: easyMesh.h:117
+ + +
syncStatusType timeSyncStatus
Definition: easyMesh.h:79
+
uint16_t _meshPort
Definition: easyMesh.h:177
+
static void wifiEventCb(System_Event_t *event)
+
Definition: easyMesh.h:54
+
meshPackageType
Definition: easyMesh.h:41
+
uint16_t count
Definition: easyMesh.cpp:15
+ +
easyMesh * staticThis
Definition: easyMesh.cpp:14
+ +
uint32_t getNodeId(void)
Definition: easyMesh.h:92
+
#define JSON_BUFSIZE
Definition: easyMesh.h:19
+
void manageConnections(void)
+
static void meshConnectedCb(void *arg)
+ +
void startTimeSync(meshConnectionType *conn)
+ +
bool broadcastMessage(uint32_t fromId, meshPackageType type, String &msg, meshConnectionType *exclude=NULL)
+
void tcpConnect(void)
+
void debugMsg(debugType type, const char *format...)
+ +
meshConnectionType * findConnection(uint32_t nodeId)
+
void setNewConnectionCallback(void(*onNewConnection)(bool adopt))
+
String subConnectionJson(meshConnectionType *exclude)
+
static void meshReconCb(void *arg, sint8 err)
+
SimpleList< String > sendQueue
Definition: easyMesh.h:85
+
void handleTimeSync(meshConnectionType *conn, JsonObject &root)
+
static void meshDisconCb(void *arg)
+ + + +
static void meshSentCb(void *arg)
+
Definition: easyMesh.h:58
+
static void meshRecvCb(void *arg, char *data, unsigned short length)
+
espconn * esp_conn
Definition: easyMesh.h:69
+
void handleNodeSync(meshConnectionType *conn, JsonObject &root)
+
void setReceiveCallback(void(*onReceive)(uint32_t from, String &msg))
+ +
uint32_t getNodeTime(void)
+
bool sendPackage(meshConnectionType *connection, String &package)
+
bool connectToBestAP(void)
+
bool adoptionCalc(meshConnectionType *conn)
+
void startNodeSync(meshConnectionType *conn)
+ +
uint32_t nodeId
Definition: easyMesh.h:70
+
uint16_t jsonSubConnCount(String &subConns)
+
#define NODE_TIMEOUT
Definition: easyMesh.h:18
+
+
+ + + + diff --git a/docs/html/easy_mesh_debug_8cpp.html b/docs/html/easy_mesh_debug_8cpp.html new file mode 100644 index 0000000..bb43506 --- /dev/null +++ b/docs/html/easy_mesh_debug_8cpp.html @@ -0,0 +1,154 @@ + + + + + + +easyMesh: easyMeshDebug.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
easyMeshDebug.cpp File Reference
+
+
+
#include <Arduino.h>
+#include <stdarg.h>
+#include "easyMesh.h"
+
+Include dependency graph for easyMeshDebug.cpp:
+
+
+ + +
+
+

Go to the source code of this file.

+ + + + +

+Variables

uint16_t types = 0
 
+

Variable Documentation

+ +
+
+ + + + +
uint16_t types = 0
+
+ +

Definition at line 14 of file easyMeshDebug.cpp.

+ +
+
+
+
+ + + + diff --git a/docs/html/easy_mesh_debug_8cpp.js b/docs/html/easy_mesh_debug_8cpp.js new file mode 100644 index 0000000..572321f --- /dev/null +++ b/docs/html/easy_mesh_debug_8cpp.js @@ -0,0 +1,4 @@ +var easy_mesh_debug_8cpp = +[ + [ "types", "easy_mesh_debug_8cpp.html#a4871a87fe1525eb8567b3cefbb35a3f5", null ] +]; \ No newline at end of file diff --git a/docs/html/easy_mesh_debug_8cpp__incl.map b/docs/html/easy_mesh_debug_8cpp__incl.map new file mode 100644 index 0000000..774461c --- /dev/null +++ b/docs/html/easy_mesh_debug_8cpp__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/easy_mesh_debug_8cpp__incl.md5 b/docs/html/easy_mesh_debug_8cpp__incl.md5 new file mode 100644 index 0000000..4427e3c --- /dev/null +++ b/docs/html/easy_mesh_debug_8cpp__incl.md5 @@ -0,0 +1 @@ +b80f570bb378328be1938fdcf0c60b0c \ No newline at end of file diff --git a/docs/html/easy_mesh_debug_8cpp__incl.png b/docs/html/easy_mesh_debug_8cpp__incl.png new file mode 100644 index 0000000..c417112 Binary files /dev/null and b/docs/html/easy_mesh_debug_8cpp__incl.png differ diff --git a/docs/html/easy_mesh_debug_8cpp_source.html b/docs/html/easy_mesh_debug_8cpp_source.html new file mode 100644 index 0000000..9bd051f --- /dev/null +++ b/docs/html/easy_mesh_debug_8cpp_source.html @@ -0,0 +1,164 @@ + + + + + + +easyMesh: easyMeshDebug.cpp Source File + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMeshDebug.cpp
+
+
+Go to the documentation of this file.
1 //
+
2 // easyMeshDebug.cpp
+
3 //
+
4 //
+
5 // Created by Bill Gray on 8/18/16.
+
6 //
+
7 //
+
8 
+
9 #include <Arduino.h>
+
10 #include <stdarg.h>
+
11 
+
12 #include "easyMesh.h"
+
13 
+
14 uint16_t types = 0;
+
15 
+
16 void easyMesh::setDebugMsgTypes( uint16_t newTypes ) {
+
17  // set the different kinds of debug messages you want to generate.
+
18  types = newTypes;
+
19  Serial.printf("setDebugTypes 0x%x\n", types);
+
20 }
+
21 
+
22 void easyMesh::debugMsg( debugType type, const char* format ... ) {
+
23 
+
24  if ( type & types ) { //Print only the message types set for output
+
25  char str[200];
+
26 
+
27  va_list args;
+
28  va_start(args, format);
+
29 
+
30  vsnprintf(str, sizeof(str), format, args);
+
31 
+
32  if ( types && MSG_TYPES)
+
33  Serial.printf("0x%x\t", type, types );
+
34 
+
35  Serial.print( str );
+
36 
+
37  va_end(args);
+
38  }
+
39 }
+ +
void debugMsg(debugType type, const char *format...)
+
void setDebugMsgTypes(uint16_t types)
+ +
debugType
Definition: easyMesh.h:53
+
uint16_t types
+
+
+ + + + diff --git a/docs/html/easy_mesh_s_t_a_8cpp.html b/docs/html/easy_mesh_s_t_a_8cpp.html new file mode 100644 index 0000000..1c52598 --- /dev/null +++ b/docs/html/easy_mesh_s_t_a_8cpp.html @@ -0,0 +1,156 @@ + + + + + + +easyMesh: easyMeshSTA.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
easyMeshSTA.cpp File Reference
+
+
+
#include <Arduino.h>
+#include <SimpleList.h>
+#include "user_interface.h"
+#include "espconn.h"
+#include "easyMesh.h"
+
+Include dependency graph for easyMeshSTA.cpp:
+
+
+ + +
+
+

Go to the source code of this file.

+ + + + +

+Variables

easyMeshstaticThis
 
+

Variable Documentation

+ +
+
+ + + + +
easyMesh* staticThis
+
+ +

Definition at line 14 of file easyMesh.cpp.

+ +
+
+
+
+ + + + diff --git a/docs/html/easy_mesh_s_t_a_8cpp.js b/docs/html/easy_mesh_s_t_a_8cpp.js new file mode 100644 index 0000000..1849f9b --- /dev/null +++ b/docs/html/easy_mesh_s_t_a_8cpp.js @@ -0,0 +1,4 @@ +var easy_mesh_s_t_a_8cpp = +[ + [ "staticThis", "easy_mesh_s_t_a_8cpp.html#a7f0b8b20ed2a74609af106ba4f0f6c06", null ] +]; \ No newline at end of file diff --git a/docs/html/easy_mesh_s_t_a_8cpp__incl.map b/docs/html/easy_mesh_s_t_a_8cpp__incl.map new file mode 100644 index 0000000..d75adfa --- /dev/null +++ b/docs/html/easy_mesh_s_t_a_8cpp__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/easy_mesh_s_t_a_8cpp__incl.md5 b/docs/html/easy_mesh_s_t_a_8cpp__incl.md5 new file mode 100644 index 0000000..91eafe0 --- /dev/null +++ b/docs/html/easy_mesh_s_t_a_8cpp__incl.md5 @@ -0,0 +1 @@ +8e1c83dd3dc9167ed37e2427f1111459 \ No newline at end of file diff --git a/docs/html/easy_mesh_s_t_a_8cpp__incl.png b/docs/html/easy_mesh_s_t_a_8cpp__incl.png new file mode 100644 index 0000000..444f6be Binary files /dev/null and b/docs/html/easy_mesh_s_t_a_8cpp__incl.png differ diff --git a/docs/html/easy_mesh_s_t_a_8cpp_source.html b/docs/html/easy_mesh_s_t_a_8cpp_source.html new file mode 100644 index 0000000..896c00f --- /dev/null +++ b/docs/html/easy_mesh_s_t_a_8cpp_source.html @@ -0,0 +1,395 @@ + + + + + + +easyMesh: easyMeshSTA.cpp Source File + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMeshSTA.cpp
+
+
+Go to the documentation of this file.
1 //
+
2 // easyMeshSTA.cpp
+
3 //
+
4 //
+
5 // Created by Bill Gray on 7/26/16.
+
6 //
+
7 //
+
8 
+
9 #include <Arduino.h>
+
10 #include <SimpleList.h>
+
11 
+
12 extern "C" {
+
13 #include "user_interface.h"
+
14 #include "espconn.h"
+
15 }
+
16 
+
17 #include "easyMesh.h"
+
18 
+
19 
+
20 
+
21 extern easyMesh* staticThis;
+
22 
+
23 // Station functions
+
24 //***********************************************************************
+
25 void ICACHE_FLASH_ATTR easyMesh::stationInit( void ) {
+
26  debugMsg( STARTUP, "stationInit():\n");
+ +
28  return;
+
29 }
+
30 
+
31 //***********************************************************************
+
32 void ICACHE_FLASH_ATTR easyMesh::manageStation( void ) {
+
33  debugMsg( GENERAL, "manageStation():\n");
+
34 
+
35  static uint8_t previousStatus;
+
36  uint8_t stationStatus = wifi_station_get_connect_status();
+
37 
+
38  if( stationStatus != previousStatus ) {
+
39  switch( stationStatus ) {
+
40  case STATION_IDLE:
+
41  debugMsg( MESH_STATUS, "stationStatus Changed to STATION_IDLE\n");
+
42  break;
+
43  case STATION_CONNECTING:
+
44  debugMsg( MESH_STATUS, "stationStatus Changed to STATION_CONNECTING\n");
+
45  break;
+
46 
+
47  case STATION_WRONG_PASSWORD:
+
48  debugMsg( MESH_STATUS, "stationStatus Changed to STATION_WRONG_PASSWORD\n");
+
49  break;
+
50 
+
51  case STATION_NO_AP_FOUND:
+
52  debugMsg( MESH_STATUS, "stationStatus Changed to STATION_NO_AP_FOUND\n");
+
53  break;
+
54 
+
55  case STATION_CONNECT_FAIL:
+
56  debugMsg( MESH_STATUS, "stationStatus Changed to STATION_CONNECT_FAIL\n");
+
57  break;
+
58 
+
59  case STATION_GOT_IP:
+
60  debugMsg( MESH_STATUS, "stationStatus Changed to STATION_GOT_IP\n");
+
61  break;
+
62 
+
63  }
+
64  previousStatus = stationStatus;
+
65  }
+
66 }
+
67 
+
68 //***********************************************************************
+
69 void ICACHE_FLASH_ATTR easyMesh::startStationScan( void ) {
+
70  debugMsg( GENERAL, "startStationScan():\n");
+
71 
+
72  if ( _scanStatus != IDLE ) {
+
73  return;
+
74  }
+
75 
+
76  char tempssid[32];
+
77  struct scan_config scanConfig;
+
78  memset( &scanConfig, 0, sizeof(scanConfig) );
+
79  staticThis->_meshSSID.toCharArray( tempssid, staticThis->_meshSSID.length()+1 );
+
80 
+
81  scanConfig.ssid = (uint8_t *) tempssid; // limit scan to mesh ssid
+
82  scanConfig.bssid = 0;
+
83  scanConfig.channel = staticThis->_meshChannel; // also limit scan to mesh channel to speed things up ...
+
84  scanConfig.show_hidden = 1; // add hidden APs ... why not? we might want to hide ...
+
85 
+
86  if ( !wifi_station_scan( &scanConfig, stationScanCb ) ) {
+
87  debugMsg( ERROR, "wifi_station_scan() failed!?\n");
+
88  return;
+
89  }
+ +
91  debugMsg( CONNECTION, "-->scan started @ %d<--\n", system_get_time());
+
92  return;
+
93 }
+
94 
+
95 //***********************************************************************
+
96 void ICACHE_FLASH_ATTR easyMesh::scanTimerCallback( void *arg ) {
+
97  staticThis->startStationScan();
+
98 
+
99  // this function can be totally elimiated!
+
100 }
+
101 
+
102 //***********************************************************************
+
103 void ICACHE_FLASH_ATTR easyMesh::stationScanCb(void *arg, STATUS status) {
+
104  char ssid[32];
+
105  bss_info *bssInfo = (bss_info *)arg;
+
106  staticThis->debugMsg( CONNECTION, "stationScanCb():-- > scan finished @ % d < --\n", system_get_time());
+
107  staticThis->_scanStatus = IDLE;
+
108 
+
109  staticThis->_meshAPs.clear();
+
110  while (bssInfo != NULL) {
+
111  staticThis->debugMsg( CONNECTION, "\tfound : % s, % ddBm", (char*)bssInfo->ssid, (int16_t) bssInfo->rssi );
+
112  staticThis->debugMsg( CONNECTION, " MESH< ---");
+
113  staticThis->_meshAPs.push_back( *bssInfo );
+
114  staticThis->debugMsg( CONNECTION, "\n");
+
115  bssInfo = STAILQ_NEXT(bssInfo, next);
+
116  }
+
117  staticThis->debugMsg( CONNECTION, "\tFound % d nodes with _meshSSID = \"%s\"\n", staticThis->_meshAPs.size(), staticThis->_meshSSID.c_str() );
+
118 
+
119  staticThis->connectToBestAP();
+
120 }
+
121 
+
122 //***********************************************************************
+
123 bool ICACHE_FLASH_ATTR easyMesh::connectToBestAP( void ) {
+
124  debugMsg( CONNECTION, "connectToBestAP():");
+
125  uint32_t apNodeId = 0;
+
126 
+
127  // drop any _meshAP's we are already connected to
+
128  SimpleList<bss_info>::iterator ap = _meshAPs.begin();
+
129  while( ap != _meshAPs.end() ) {
+
130  apNodeId = encodeNodeId(ap->bssid);
+
131  // debugMsg( GENERAL, "connectToBestAP: sort - ssid=%s, apNodeId=%d", ap->ssid, apNodeId);
+
132 
+
133  if ( findConnection( apNodeId ) != NULL ) {
+
134  ap = _meshAPs.erase( ap );
+
135  // debugMsg( GENERAL, "<--already connected\n");
+
136  }
+
137  else {
+
138  ap++;
+
139  // debugMsg( GENERAL, "\n");
+
140  }
+
141  }
+
142 
+
143  uint8 statusCode = wifi_station_get_connect_status();
+
144  if ( statusCode != STATION_IDLE ) {
+
145  debugMsg( CONNECTION, "connectToBestAP(): station not idle. code=%d\n", statusCode);
+
146  return false;
+
147  }
+
148 
+
149  if ( staticThis->_meshAPs.empty() ) { // no meshNodes left in most recent scan
+
150  // debugMsg( GENERAL, "connectToBestAP(): no nodes left in list\n");
+
151  // wait 5 seconds and rescan;
+
152  debugMsg( CONNECTION, "connectToBestAP(): no nodes left in list, rescanning\n");
+
153  os_timer_setfn( &_scanTimer, scanTimerCallback, NULL );
+
154  os_timer_arm( &_scanTimer, SCAN_INTERVAL, 0 );
+
155  return false;
+
156  }
+
157 
+
158  // if we are here, then we have a list of at least 1 meshAPs.
+
159  // find strongest signal of remaining meshAPs... that is not already connected to our AP.
+ +
161  SimpleList<bss_info>::iterator bestAP = staticThis->_meshAPs.begin();
+
162  SimpleList<bss_info>::iterator i = staticThis->_meshAPs.begin();
+
163  while ( i != staticThis->_meshAPs.end() ) {
+
164  if ( i->rssi > bestAP->rssi ) {
+
165  bestAP = i;
+
166  }
+
167  ++i;
+
168  }
+
169 
+
170  // connect to bestAP
+
171  debugMsg( CONNECTION, "connectToBestAP(): Best AP is %d<---\n", encodeNodeId( bestAP->bssid ));
+
172  struct station_config stationConf;
+
173  stationConf.bssid_set = 1;
+
174  memcpy(&stationConf.bssid, bestAP->bssid, 6);
+
175  memcpy(&stationConf.ssid, bestAP->ssid, 32);
+
176  memcpy(&stationConf.password, _meshPassword.c_str(), 64);
+
177  wifi_station_set_config(&stationConf);
+
178  wifi_station_connect();
+
179 
+
180  _meshAPs.erase( bestAP ); // drop bestAP from mesh list, so if doesn't work out, we can try the next one
+
181  return true;
+
182 }
+
183 
+
184 //***********************************************************************
+
185 void ICACHE_FLASH_ATTR easyMesh::tcpConnect( void ) {
+
186  debugMsg( GENERAL, "tcpConnect():\n");
+
187 
+
188  struct ip_info ipconfig;
+
189  wifi_get_ip_info(STATION_IF, &ipconfig);
+
190 
+
191  if ( wifi_station_get_connect_status() == STATION_GOT_IP && ipconfig.ip.addr != 0 ) {
+
192  // we have successfully connected to wifi as a station.
+
193  debugMsg( CONNECTION, "tcpConnect(): Got local IP=%d.%d.%d.%d\n", IP2STR(&ipconfig.ip) );
+
194  debugMsg( CONNECTION, "tcpConnect(): Dest IP=%d.%d.%d.%d\n", IP2STR( &ipconfig.gw ) );
+
195 
+
196  // establish tcp connection
+
197  _stationConn.type = ESPCONN_TCP;
+
198  _stationConn.state = ESPCONN_NONE;
+
199  _stationConn.proto.tcp = &_stationTcp;
+
200  _stationConn.proto.tcp->local_port = espconn_port();
+
201  _stationConn.proto.tcp->remote_port = _meshPort;
+
202  os_memcpy(_stationConn.proto.tcp->local_ip, &ipconfig.ip, 4);
+
203  os_memcpy(_stationConn.proto.tcp->remote_ip, &ipconfig.gw, 4);
+
204  espconn_set_opt( &_stationConn, ESPCONN_NODELAY ); // low latency, but soaks up bandwidth
+
205 
+
206  debugMsg( CONNECTION, "tcpConnect(): connecting type=%d, state=%d, local_ip=%d.%d.%d.%d, local_port=%d, remote_ip=%d.%d.%d.%d remote_port=%d\n",
+
207  _stationConn.type,
+
208  _stationConn.state,
+
209  IP2STR(_stationConn.proto.tcp->local_ip),
+
210  _stationConn.proto.tcp->local_port,
+
211  IP2STR(_stationConn.proto.tcp->remote_ip),
+
212  _stationConn.proto.tcp->remote_port );
+
213 
+
214  espconn_regist_connectcb(&_stationConn, meshConnectedCb);
+
215  espconn_regist_recvcb(&_stationConn, meshRecvCb);
+
216  espconn_regist_sentcb(&_stationConn, meshSentCb);
+
217  espconn_regist_reconcb(&_stationConn, meshReconCb);
+
218  espconn_regist_disconcb(&_stationConn, meshDisconCb);
+
219 
+
220  sint8 errCode = espconn_connect(&_stationConn);
+
221  if ( errCode != 0 ) {
+
222  debugMsg( ERROR, "tcpConnect(): err espconn_connect() falied=%d\n", errCode );
+
223  }
+
224  }
+
225  else {
+
226  debugMsg( ERROR, "tcpConnect(): err Something un expected in tcpConnect()\n");
+
227  }
+
228 }
+
229 //***********************************************************************
+
230 uint32_t ICACHE_FLASH_ATTR easyMesh::encodeNodeId( uint8_t *hwaddr ) {
+
231  debugMsg( GENERAL, "encodeNodeId():\n");
+
232  uint32 value = 0;
+
233 
+
234  value |= hwaddr[2] << 24; //Big endian (aka "network order"):
+
235  value |= hwaddr[3] << 16;
+
236  value |= hwaddr[4] << 8;
+
237  value |= hwaddr[5];
+
238  return value;
+
239 }
+ +
void startStationScan(void)
Definition: easyMeshSTA.cpp:69
+ +
static void stationScanCb(void *arg, STATUS status)
+
void manageStation(void)
Definition: easyMeshSTA.cpp:32
+ +
String _meshPassword
Definition: easyMesh.h:176
+
uint32_t encodeNodeId(uint8_t *hwaddr)
+
uint16_t _meshPort
Definition: easyMesh.h:177
+
Definition: easyMesh.h:54
+
#define SCAN_INTERVAL
Definition: easyMeshSync.h:6
+
uint8_t _meshChannel
Definition: easyMesh.h:178
+ +
espconn _stationConn
Definition: easyMesh.h:188
+
os_timer_t _scanTimer
Definition: easyMesh.h:183
+ +
void stationInit(void)
Definition: easyMeshSTA.cpp:25
+
static void meshConnectedCb(void *arg)
+ +
void tcpConnect(void)
+
void debugMsg(debugType type, const char *format...)
+
esp_tcp _stationTcp
Definition: easyMesh.h:189
+
meshConnectionType * findConnection(uint32_t nodeId)
+
Definition: easyMesh.h:30
+
static void meshReconCb(void *arg, sint8 err)
+
static void meshDisconCb(void *arg)
+
scanStatusType _scanStatus
Definition: easyMesh.h:114
+
static void meshSentCb(void *arg)
+
nodeStatusType _nodeStatus
Definition: easyMesh.h:115
+
static void meshRecvCb(void *arg, char *data, unsigned short length)
+
static void scanTimerCallback(void *arg)
Definition: easyMeshSTA.cpp:96
+
easyMesh * staticThis
Definition: easyMesh.cpp:14
+
bool connectToBestAP(void)
+
SimpleList< bss_info > _meshAPs
Definition: easyMesh.h:116
+ +
String _meshSSID
Definition: easyMesh.h:175
+ +
+
+ + + + diff --git a/docs/html/easy_mesh_sync_8cpp.html b/docs/html/easy_mesh_sync_8cpp.html new file mode 100644 index 0000000..7e4b264 --- /dev/null +++ b/docs/html/easy_mesh_sync_8cpp.html @@ -0,0 +1,172 @@ + + + + + + +easyMesh: easyMeshSync.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
easyMeshSync.cpp File Reference
+
+
+
#include <Arduino.h>
+#include <SimpleList.h>
+#include <ArduinoJson.h>
+#include "easyMesh.h"
+#include "easyMeshSync.h"
+
+Include dependency graph for easyMeshSync.cpp:
+
+
+ + +
+
+

Go to the source code of this file.

+ + + + + + +

+Variables

easyMeshstaticThis
 
uint32_t timeAdjuster = 0
 
+

Variable Documentation

+ +
+
+ + + + +
easyMesh* staticThis
+
+ +

Definition at line 14 of file easyMesh.cpp.

+ +
+
+ +
+
+ + + + +
uint32_t timeAdjuster = 0
+
+ +

Definition at line 9 of file easyMeshSync.cpp.

+ +
+
+
+
+ + + + diff --git a/docs/html/easy_mesh_sync_8cpp.js b/docs/html/easy_mesh_sync_8cpp.js new file mode 100644 index 0000000..246e624 --- /dev/null +++ b/docs/html/easy_mesh_sync_8cpp.js @@ -0,0 +1,5 @@ +var easy_mesh_sync_8cpp = +[ + [ "staticThis", "easy_mesh_sync_8cpp.html#a7f0b8b20ed2a74609af106ba4f0f6c06", null ], + [ "timeAdjuster", "easy_mesh_sync_8cpp.html#a971c4a0ae194e9cf986577f723214aff", null ] +]; \ No newline at end of file diff --git a/docs/html/easy_mesh_sync_8cpp__incl.map b/docs/html/easy_mesh_sync_8cpp__incl.map new file mode 100644 index 0000000..09a1586 --- /dev/null +++ b/docs/html/easy_mesh_sync_8cpp__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/easy_mesh_sync_8cpp__incl.md5 b/docs/html/easy_mesh_sync_8cpp__incl.md5 new file mode 100644 index 0000000..294e4ac --- /dev/null +++ b/docs/html/easy_mesh_sync_8cpp__incl.md5 @@ -0,0 +1 @@ +f3b970ae6fc073ea8a4b3d09767b82b7 \ No newline at end of file diff --git a/docs/html/easy_mesh_sync_8cpp__incl.png b/docs/html/easy_mesh_sync_8cpp__incl.png new file mode 100644 index 0000000..d1ef88a Binary files /dev/null and b/docs/html/easy_mesh_sync_8cpp__incl.png differ diff --git a/docs/html/easy_mesh_sync_8cpp_source.html b/docs/html/easy_mesh_sync_8cpp_source.html new file mode 100644 index 0000000..50f5d99 --- /dev/null +++ b/docs/html/easy_mesh_sync_8cpp_source.html @@ -0,0 +1,412 @@ + + + + + + +easyMesh: easyMeshSync.cpp Source File + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMeshSync.cpp
+
+
+Go to the documentation of this file.
1 #include <Arduino.h>
+
2 #include <SimpleList.h>
+
3 #include <ArduinoJson.h>
+
4 
+
5 #include "easyMesh.h"
+
6 #include "easyMeshSync.h"
+
7 
+
8 extern easyMesh* staticThis;
+
9 uint32_t timeAdjuster = 0;
+
10 
+
11 // timeSync Functions
+
12 //***********************************************************************
+
13 uint32_t ICACHE_FLASH_ATTR easyMesh::getNodeTime( void ) {
+
14  uint32_t ret = system_get_time() + timeAdjuster;
+
15 
+
16  debugMsg( GENERAL, "getNodeTime(): time=%d\n", ret);
+
17 
+
18  return ret;
+
19 }
+
20 
+
21 //***********************************************************************
+
22 String ICACHE_FLASH_ATTR timeSync::buildTimeStamp( void ) {
+
23  staticThis->debugMsg( SYNC, "buildTimeStamp(): num=%d\n", num);
+
24 
+
25  if ( num > TIME_SYNC_CYCLES )
+
26  staticThis->debugMsg( ERROR, "buildTimeStamp(): timeSync not started properly\n");
+
27 
+
28  StaticJsonBuffer<75> jsonBuffer;
+
29  JsonObject& timeStampObj = jsonBuffer.createObject();
+
30  times[num] = staticThis->getNodeTime();
+
31  timeStampObj["time"] = times[num];
+
32  timeStampObj["num"] = num;
+
33  bool remoteAdopt = !adopt;
+
34  timeStampObj["adopt"] = remoteAdopt;
+
35 
+
36  String timeStampStr;
+
37  timeStampObj.printTo( timeStampStr );
+
38 
+
39  staticThis->debugMsg( SYNC, "buildTimeStamp(): timeStamp=%s\n", timeStampStr.c_str() );
+
40  return timeStampStr;
+
41 }
+
42 
+
43 //***********************************************************************
+
44 bool ICACHE_FLASH_ATTR timeSync::processTimeStamp( String &str ) {
+
45  staticThis->debugMsg( SYNC, "processTimeStamp(): str=%s\n", str.c_str());
+
46 
+
47  DynamicJsonBuffer jsonBuffer(50 );
+
48  JsonObject& timeStampObj = jsonBuffer.parseObject(str);
+
49 
+
50  if ( !timeStampObj.success() ) {
+
51  staticThis->debugMsg( ERROR, "processTimeStamp(): out of memory1?\n" );
+
52  return false;
+
53  }
+
54 
+
55  num = timeStampObj.get<uint32_t>("num");
+
56 
+
57  times[num] = timeStampObj.get<uint32_t>("time");
+
58  adopt = timeStampObj.get<bool>("adopt");
+
59 
+
60  num++;
+
61 
+
62  if ( num < TIME_SYNC_CYCLES ) {
+
63  str = buildTimeStamp();
+
64  return true;
+
65  }
+
66  else {
+
67  return false;
+
68  }
+
69 }
+
70 
+
71 //***********************************************************************
+
72 void ICACHE_FLASH_ATTR timeSync::calcAdjustment( bool odd ) {
+
73  staticThis->debugMsg( SYNC, "calcAdjustment(): odd=%u\n", odd);
+
74 
+
75  uint32_t bestInterval = 0xFFFFFFFF;
+
76  uint8_t bestIndex;
+
77  uint32_t temp;
+
78 
+
79  for (int i = 0; i < TIME_SYNC_CYCLES; i++) {
+
80  // debugMsg( GENERAL, "times[%d]=%u\n", i, times[i]);
+
81 
+
82  if ( i % 2 == odd ) {
+
83  temp = times[i + 2] - times[i];
+
84 
+
85  if ( i < TIME_SYNC_CYCLES - 2 ){
+
86  // debugMsg( GENERAL, "\tinterval=%u\n", temp);
+
87 
+
88  if ( temp < bestInterval ) {
+
89  bestInterval = temp;
+
90  bestIndex = i;
+
91  }
+
92  }
+
93  }
+
94  }
+
95  staticThis->debugMsg( SYNC, "best interval=%u, best index=%u\n", bestInterval, bestIndex);
+
96 
+
97  // find number that turns local time into remote time
+
98  uint32_t adopterTime = times[ bestIndex ] + (bestInterval / 2);
+
99  uint32_t adjustment = times[ bestIndex + 1 ] - adopterTime;
+
100 
+
101  staticThis->debugMsg( SYNC, "new calc time=%u, adoptedTime=%u\n", adopterTime + adjustment, times[ bestIndex + 1 ]);
+
102 
+
103  timeAdjuster += adjustment;
+
104 }
+
105 
+
106 
+
107 // easyMesh Syncing functions
+
108 //***********************************************************************
+
109 void ICACHE_FLASH_ATTR easyMesh::startNodeSync( meshConnectionType *conn ) {
+
110  debugMsg( SYNC, "startNodeSync(): with %u\n", conn->nodeId);
+
111 
+
112  String subs = subConnectionJson( conn );
+
113  sendMessage( conn, conn->nodeId, NODE_SYNC_REQUEST, subs );
+
114  conn->nodeSyncRequest = getNodeTime();
+
115  conn->nodeSyncStatus = IN_PROGRESS;
+
116 }
+
117 
+
118 //***********************************************************************
+
119 void ICACHE_FLASH_ATTR easyMesh::handleNodeSync( meshConnectionType *conn, JsonObject& root ) {
+
120  debugMsg( SYNC, "handleNodeSync(): with %u\n", conn->nodeId);
+
121 
+
122  meshPackageType type = (meshPackageType)(int)root["type"];
+
123  uint32_t remoteNodeId = (uint32_t)root["from"];
+
124  uint32_t destId = (uint32_t)root["dest"];
+
125  bool reSyncAllSubConnections = false;
+
126 
+
127  if( (destId == 0) && (findConnection( remoteNodeId ) != NULL) ) {
+
128  // this is the first NODE_SYNC_REQUEST from a station
+
129  // is we are already connected drop this connection
+
130  debugMsg( SYNC, "handleNodeSync(): Already connected to node %d. Dropping\n", conn->nodeId);
+
131  closeConnection( conn );
+
132  return;
+
133  }
+
134 
+
135  if ( conn->nodeId != remoteNodeId ) {
+
136  debugMsg( SYNC, "handleNodeSync(): conn->nodeId updated from %d to %d\n", conn->nodeId, remoteNodeId );
+
137  conn->nodeId = remoteNodeId;
+
138 
+
139  }
+
140 
+
141  // check to see if subs have changed.
+
142  String inComingSubs = root["subs"];
+
143  if ( !conn->subConnections.equals( inComingSubs ) ) { // change in the network
+
144  reSyncAllSubConnections = true;
+
145  conn->subConnections = inComingSubs;
+
146  }
+
147 
+
148  switch ( type ) {
+
149  case NODE_SYNC_REQUEST:
+
150  {
+
151  debugMsg( SYNC, "handleNodeSync(): valid NODE_SYNC_REQUEST %d sending NODE_SYNC_REPLY\n", conn->nodeId );
+
152  String myOtherSubConnections = subConnectionJson( conn );
+
153  sendMessage( conn, conn->nodeId, NODE_SYNC_REPLY, myOtherSubConnections );
+
154  break;
+
155  }
+
156  case NODE_SYNC_REPLY:
+
157  debugMsg( SYNC, "handleNodeSync(): valid NODE_SYNC_REPLY from %d\n", conn->nodeId );
+
158  conn->nodeSyncRequest = 0; //reset nodeSyncRequest Timer ????
+
159  if ( conn->lastTimeSync == 0 )
+
160  startTimeSync( conn );
+
161  break;
+
162  default:
+
163  debugMsg( ERROR, "handleNodeSync(): weird type? %d\n", type );
+
164  }
+
165 
+
166  if ( reSyncAllSubConnections == true ) {
+
167  SimpleList<meshConnectionType>::iterator connection = _connections.begin();
+
168  while ( connection != _connections.end() ) {
+
169  connection->nodeSyncStatus = NEEDED;
+
170  connection++;
+
171  }
+
172  }
+
173 
+
174  conn->nodeSyncStatus = COMPLETE; // mark this connection nodeSync'd
+
175 }
+
176 
+
177 //***********************************************************************
+
178 void ICACHE_FLASH_ATTR easyMesh::startTimeSync( meshConnectionType *conn ) {
+
179  debugMsg( SYNC, "startTimeSync(): with %d\n", conn->nodeId );
+
180 
+
181  if ( conn->time.num > TIME_SYNC_CYCLES ) {
+
182  debugMsg( ERROR, "startTimeSync(): Error timeSync.num not reset conn->time.num=%d\n", conn->time.num );
+
183  }
+
184 
+
185  conn->time.num = 0;
+
186 
+
187  conn->time.adopt = adoptionCalc( conn ); // do I adopt the estblished time?
+
188  // debugMsg( GENERAL, "startTimeSync(): remoteSubCount=%d adopt=%d\n", remoteSubCount, conn->time.adopt);
+
189 
+
190  String timeStamp = conn->time.buildTimeStamp();
+
191  staticThis->sendMessage( conn, conn->nodeId, TIME_SYNC, timeStamp );
+
192 
+
193  conn->timeSyncStatus = IN_PROGRESS;
+
194 }
+
195 
+
196 //***********************************************************************
+
197 bool ICACHE_FLASH_ATTR easyMesh::adoptionCalc( meshConnectionType *conn ) {
+
198  // make the adoption calulation. Figure out how many nodes I am connected to exclusive of this connection.
+
199 
+
200  uint16_t mySubCount = connectionCount( conn ); //exclude this connection.
+
201  uint16_t remoteSubCount = jsonSubConnCount( conn->subConnections );
+
202 
+
203  bool ret = ( mySubCount > remoteSubCount ) ? false : true;
+
204 
+
205  debugMsg( GENERAL, "adoptionCalc(): mySubCount=%d remoteSubCount=%d ret = %d\n", mySubCount, remoteSubCount, ret);
+
206 
+
207  return ret;
+
208 }
+
209 
+
210 //***********************************************************************
+
211 void ICACHE_FLASH_ATTR easyMesh::handleTimeSync( meshConnectionType *conn, JsonObject& root ) {
+
212 
+
213  String timeStamp = root["msg"];
+
214  debugMsg( SYNC, "handleTimeSync(): with %d in timestamp=%s\n", conn->nodeId, timeStamp.c_str());
+
215 
+
216  conn->time.processTimeStamp( timeStamp ); //varifies timeStamp and updates it with a new one.
+
217 
+
218  debugMsg( SYNC, "handleTimeSync(): with %d out timestamp=%s\n", conn->nodeId, timeStamp.c_str());
+
219 
+
220 
+
221  if ( conn->time.num < TIME_SYNC_CYCLES ) {
+
222  staticThis->sendMessage( conn, conn->nodeId, TIME_SYNC, timeStamp );
+
223  }
+
224 
+
225  uint8_t odd = conn->time.num % 2;
+
226 
+
227  if ( (conn->time.num + odd) >= TIME_SYNC_CYCLES ) { // timeSync completed
+
228  if ( conn->time.adopt ) {
+
229  conn->time.calcAdjustment( odd );
+
230 
+
231  // flag all connections for re-timeSync
+
232  SimpleList<meshConnectionType>::iterator connection = _connections.begin();
+
233  while ( connection != _connections.end() ) {
+
234  if ( connection != conn ) { // exclude this connection
+
235  connection->timeSyncStatus = NEEDED;
+
236  }
+
237  connection++;
+
238  }
+
239  }
+
240  conn->lastTimeSync = getNodeTime();
+
241  conn->timeSyncStatus = COMPLETE;
+
242  }
+
243 }
+
244 
+
245 
+
246 
+
247 
+
248 
+
249 
+ +
uint16_t connectionCount(meshConnectionType *exclude=NULL)
+
meshConnectionType * closeConnection(meshConnectionType *conn)
+
uint32_t timeAdjuster
Definition: easyMeshSync.cpp:9
+ + +
SimpleList< meshConnectionType > _connections
Definition: easyMesh.h:117
+
int8_t num
Definition: easyMeshSync.h:15
+
syncStatusType nodeSyncStatus
Definition: easyMesh.h:76
+ +
void calcAdjustment(bool even)
+
syncStatusType timeSyncStatus
Definition: easyMesh.h:79
+
Definition: easyMesh.h:54
+
bool processTimeStamp(String &str)
+
meshPackageType
Definition: easyMesh.h:41
+
String buildTimeStamp(void)
+ +
uint32_t nodeSyncRequest
Definition: easyMesh.h:77
+
timeSync time
Definition: easyMesh.h:72
+ +
void startTimeSync(meshConnectionType *conn)
+ +
void debugMsg(debugType type, const char *format...)
+
meshConnectionType * findConnection(uint32_t nodeId)
+
String subConnectionJson(meshConnectionType *exclude)
+
easyMesh * staticThis
Definition: easyMesh.cpp:14
+
void handleTimeSync(meshConnectionType *conn, JsonObject &root)
+
uint32_t lastTimeSync
Definition: easyMesh.h:80
+ +
uint32_t times[TIME_SYNC_CYCLES]
Definition: easyMeshSync.h:14
+ +
bool sendMessage(meshConnectionType *conn, uint32_t destId, meshPackageType type, String &msg)
+
Definition: easyMesh.h:58
+
String subConnections
Definition: easyMesh.h:71
+
void handleNodeSync(meshConnectionType *conn, JsonObject &root)
+ +
uint32_t getNodeTime(void)
+
bool adopt
Definition: easyMeshSync.h:16
+
bool adoptionCalc(meshConnectionType *conn)
+
#define TIME_SYNC_CYCLES
Definition: easyMeshSync.h:8
+
void startNodeSync(meshConnectionType *conn)
+ +
uint32_t nodeId
Definition: easyMesh.h:70
+
uint16_t jsonSubConnCount(String &subConns)
+
+
+ + + + diff --git a/docs/html/easy_mesh_sync_8h.html b/docs/html/easy_mesh_sync_8h.html new file mode 100644 index 0000000..9ce67cb --- /dev/null +++ b/docs/html/easy_mesh_sync_8h.html @@ -0,0 +1,197 @@ + + + + + + +easyMesh: easyMeshSync.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
easyMeshSync.h File Reference
+
+
+
#include <Arduino.h>
+
+Include dependency graph for easyMeshSync.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+

Go to the source code of this file.

+ + + + +

+Classes

class  timeSync
 
+ + + + + + + +

+Macros

#define SCAN_INTERVAL   10000
 
#define SYNC_INTERVAL   7000
 
#define TIME_SYNC_CYCLES   10
 
+

Macro Definition Documentation

+ +
+
+ + + + +
#define SCAN_INTERVAL   10000
+
+ +

Definition at line 6 of file easyMeshSync.h.

+ +
+
+ +
+
+ + + + +
#define SYNC_INTERVAL   7000
+
+ +

Definition at line 7 of file easyMeshSync.h.

+ +
+
+ +
+
+ + + + +
#define TIME_SYNC_CYCLES   10
+
+ +

Definition at line 8 of file easyMeshSync.h.

+ +
+
+
+
+ + + + diff --git a/docs/html/easy_mesh_sync_8h.js b/docs/html/easy_mesh_sync_8h.js new file mode 100644 index 0000000..c2beff5 --- /dev/null +++ b/docs/html/easy_mesh_sync_8h.js @@ -0,0 +1,7 @@ +var easy_mesh_sync_8h = +[ + [ "timeSync", "classtime_sync.html", "classtime_sync" ], + [ "SCAN_INTERVAL", "easy_mesh_sync_8h.html#a94ae66ba8697786c3808790a66153c65", null ], + [ "SYNC_INTERVAL", "easy_mesh_sync_8h.html#a93f701eb232adfeedf2a76eade93cf5d", null ], + [ "TIME_SYNC_CYCLES", "easy_mesh_sync_8h.html#a5b0597fa1b06347a28c791e67c711366", null ] +]; \ No newline at end of file diff --git a/docs/html/easy_mesh_sync_8h__dep__incl.map b/docs/html/easy_mesh_sync_8h__dep__incl.map new file mode 100644 index 0000000..0f58ab1 --- /dev/null +++ b/docs/html/easy_mesh_sync_8h__dep__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/html/easy_mesh_sync_8h__dep__incl.md5 b/docs/html/easy_mesh_sync_8h__dep__incl.md5 new file mode 100644 index 0000000..b80c831 --- /dev/null +++ b/docs/html/easy_mesh_sync_8h__dep__incl.md5 @@ -0,0 +1 @@ +cc47e07c51dfcbea579d85e3fe7f1a88 \ No newline at end of file diff --git a/docs/html/easy_mesh_sync_8h__dep__incl.png b/docs/html/easy_mesh_sync_8h__dep__incl.png new file mode 100644 index 0000000..2747f32 Binary files /dev/null and b/docs/html/easy_mesh_sync_8h__dep__incl.png differ diff --git a/docs/html/easy_mesh_sync_8h__incl.map b/docs/html/easy_mesh_sync_8h__incl.map new file mode 100644 index 0000000..2380520 --- /dev/null +++ b/docs/html/easy_mesh_sync_8h__incl.map @@ -0,0 +1,2 @@ + + diff --git a/docs/html/easy_mesh_sync_8h__incl.md5 b/docs/html/easy_mesh_sync_8h__incl.md5 new file mode 100644 index 0000000..f84b45f --- /dev/null +++ b/docs/html/easy_mesh_sync_8h__incl.md5 @@ -0,0 +1 @@ +5a224a8e4227e8cfbc6648cbba779829 \ No newline at end of file diff --git a/docs/html/easy_mesh_sync_8h__incl.png b/docs/html/easy_mesh_sync_8h__incl.png new file mode 100644 index 0000000..6b09fcf Binary files /dev/null and b/docs/html/easy_mesh_sync_8h__incl.png differ diff --git a/docs/html/easy_mesh_sync_8h_source.html b/docs/html/easy_mesh_sync_8h_source.html new file mode 100644 index 0000000..5469945 --- /dev/null +++ b/docs/html/easy_mesh_sync_8h_source.html @@ -0,0 +1,151 @@ + + + + + + +easyMesh: easyMeshSync.h Source File + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMeshSync.h
+
+
+Go to the documentation of this file.
1 #ifndef _MESH_SYNC_H_
+
2 #define _MESH_SYNC_H_
+
3 
+
4 #include <Arduino.h>
+
5 
+
6 #define SCAN_INTERVAL 10000
+
7 #define SYNC_INTERVAL 7000
+
8 #define TIME_SYNC_CYCLES 10 // should (must?) be an even number
+
9 
+
10 //uint32_t getNodeTime( void );
+
11 
+
12 class timeSync {
+
13 public:
+ +
15  int8_t num = -1;
+
16  bool adopt;
+
17 
+
18  String buildTimeStamp( void );
+
19  bool processTimeStamp( String &str);
+
20  void calcAdjustment ( bool even );
+
21 };
+
22 
+
23 #endif // _MESH_SYNC_H_
+
24 
+
int8_t num
Definition: easyMeshSync.h:15
+
void calcAdjustment(bool even)
+
bool processTimeStamp(String &str)
+
String buildTimeStamp(void)
+
uint32_t times[TIME_SYNC_CYCLES]
Definition: easyMeshSync.h:14
+ +
bool adopt
Definition: easyMeshSync.h:16
+
#define TIME_SYNC_CYCLES
Definition: easyMeshSync.h:8
+
+
+ + + + diff --git a/docs/html/files.html b/docs/html/files.html new file mode 100644 index 0000000..b055358 --- /dev/null +++ b/docs/html/files.html @@ -0,0 +1,131 @@ + + + + + + +easyMesh: File List + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
File List
+
+ +
+ + + + diff --git a/docs/html/files.js b/docs/html/files.js new file mode 100644 index 0000000..dc18685 --- /dev/null +++ b/docs/html/files.js @@ -0,0 +1,12 @@ +var files = +[ + [ "easyMesh.cpp", "easy_mesh_8cpp.html", "easy_mesh_8cpp" ], + [ "easyMesh.h", "easy_mesh_8h.html", "easy_mesh_8h" ], + [ "easyMeshAP.cpp", "easy_mesh_a_p_8cpp.html", null ], + [ "easyMeshComm.cpp", "easy_mesh_comm_8cpp.html", "easy_mesh_comm_8cpp" ], + [ "easyMeshConnection.cpp", "easy_mesh_connection_8cpp.html", "easy_mesh_connection_8cpp" ], + [ "easyMeshDebug.cpp", "easy_mesh_debug_8cpp.html", "easy_mesh_debug_8cpp" ], + [ "easyMeshSTA.cpp", "easy_mesh_s_t_a_8cpp.html", "easy_mesh_s_t_a_8cpp" ], + [ "easyMeshSync.cpp", "easy_mesh_sync_8cpp.html", "easy_mesh_sync_8cpp" ], + [ "easyMeshSync.h", "easy_mesh_sync_8h.html", "easy_mesh_sync_8h" ] +]; \ No newline at end of file diff --git a/docs/html/ftv2blank.png b/docs/html/ftv2blank.png new file mode 100644 index 0000000..63c605b Binary files /dev/null and b/docs/html/ftv2blank.png differ diff --git a/docs/html/ftv2cl.png b/docs/html/ftv2cl.png new file mode 100644 index 0000000..132f657 Binary files /dev/null and b/docs/html/ftv2cl.png differ diff --git a/docs/html/ftv2doc.png b/docs/html/ftv2doc.png new file mode 100644 index 0000000..17edabf Binary files /dev/null and b/docs/html/ftv2doc.png differ diff --git a/docs/html/ftv2folderclosed.png b/docs/html/ftv2folderclosed.png new file mode 100644 index 0000000..bb8ab35 Binary files /dev/null and b/docs/html/ftv2folderclosed.png differ diff --git a/docs/html/ftv2folderopen.png b/docs/html/ftv2folderopen.png new file mode 100644 index 0000000..d6c7f67 Binary files /dev/null and b/docs/html/ftv2folderopen.png differ diff --git a/docs/html/ftv2lastnode.png b/docs/html/ftv2lastnode.png new file mode 100644 index 0000000..63c605b Binary files /dev/null and b/docs/html/ftv2lastnode.png differ diff --git a/docs/html/ftv2link.png b/docs/html/ftv2link.png new file mode 100644 index 0000000..17edabf Binary files /dev/null and b/docs/html/ftv2link.png differ diff --git a/docs/html/ftv2mlastnode.png b/docs/html/ftv2mlastnode.png new file mode 100644 index 0000000..0b63f6d Binary files /dev/null and b/docs/html/ftv2mlastnode.png differ diff --git a/docs/html/ftv2mnode.png b/docs/html/ftv2mnode.png new file mode 100644 index 0000000..0b63f6d Binary files /dev/null and b/docs/html/ftv2mnode.png differ diff --git a/docs/html/ftv2mo.png b/docs/html/ftv2mo.png new file mode 100644 index 0000000..4bfb80f Binary files /dev/null and b/docs/html/ftv2mo.png differ diff --git a/docs/html/ftv2node.png b/docs/html/ftv2node.png new file mode 100644 index 0000000..63c605b Binary files /dev/null and b/docs/html/ftv2node.png differ diff --git a/docs/html/ftv2ns.png b/docs/html/ftv2ns.png new file mode 100644 index 0000000..72e3d71 Binary files /dev/null and b/docs/html/ftv2ns.png differ diff --git a/docs/html/ftv2plastnode.png b/docs/html/ftv2plastnode.png new file mode 100644 index 0000000..c6ee22f Binary files /dev/null and b/docs/html/ftv2plastnode.png differ diff --git a/docs/html/ftv2pnode.png b/docs/html/ftv2pnode.png new file mode 100644 index 0000000..c6ee22f Binary files /dev/null and b/docs/html/ftv2pnode.png differ diff --git a/docs/html/ftv2splitbar.png b/docs/html/ftv2splitbar.png new file mode 100644 index 0000000..fe895f2 Binary files /dev/null and b/docs/html/ftv2splitbar.png differ diff --git a/docs/html/ftv2vertline.png b/docs/html/ftv2vertline.png new file mode 100644 index 0000000..63c605b Binary files /dev/null and b/docs/html/ftv2vertline.png differ diff --git a/docs/html/functions.html b/docs/html/functions.html new file mode 100644 index 0000000..a19597f --- /dev/null +++ b/docs/html/functions.html @@ -0,0 +1,455 @@ + + + + + + +easyMesh: Class Members + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- _ -

+ + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- j -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+
+
+ + + + diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html new file mode 100644 index 0000000..abddeed --- /dev/null +++ b/docs/html/functions_func.html @@ -0,0 +1,344 @@ + + + + + + +easyMesh: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+  + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- j -

+ + +

- m -

+ + +

- p -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+
+
+ + + + diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html new file mode 100644 index 0000000..9d6e950 --- /dev/null +++ b/docs/html/functions_vars.html @@ -0,0 +1,257 @@ + + + + + + +easyMesh: Class Members - Variables + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+  + +

- _ -

+ + +

- a -

+ + +

- e -

+ + +

- l -

+ + +

- n -

+ + +

- s -

+ + +

- t -

+
+
+ + + + diff --git a/docs/html/globals.html b/docs/html/globals.html new file mode 100644 index 0000000..674c254 --- /dev/null +++ b/docs/html/globals.html @@ -0,0 +1,324 @@ + + + + + + +easyMesh: File Members + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
Here is a list of all file members with links to the files they belong to:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- j -

+ + +

- m -

+ + +

- n -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+
+
+ + + + diff --git a/docs/html/globals_defs.html b/docs/html/globals_defs.html new file mode 100644 index 0000000..9f68a69 --- /dev/null +++ b/docs/html/globals_defs.html @@ -0,0 +1,140 @@ + + + + + + +easyMesh: File Members + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
+ + + + diff --git a/docs/html/globals_enum.html b/docs/html/globals_enum.html new file mode 100644 index 0000000..7138c5f --- /dev/null +++ b/docs/html/globals_enum.html @@ -0,0 +1,140 @@ + + + + + + +easyMesh: File Members + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
+ + + + diff --git a/docs/html/globals_eval.html b/docs/html/globals_eval.html new file mode 100644 index 0000000..bc7b073 --- /dev/null +++ b/docs/html/globals_eval.html @@ -0,0 +1,206 @@ + + + + + + +easyMesh: File Members + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
+ + + + diff --git a/docs/html/globals_vars.html b/docs/html/globals_vars.html new file mode 100644 index 0000000..3bfbe54 --- /dev/null +++ b/docs/html/globals_vars.html @@ -0,0 +1,141 @@ + + + + + + +easyMesh: File Members + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
+ + + + diff --git a/docs/html/graph_legend.html b/docs/html/graph_legend.html new file mode 100644 index 0000000..8c6b0bc --- /dev/null +++ b/docs/html/graph_legend.html @@ -0,0 +1,176 @@ + + + + + + +easyMesh: Graph Legend + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

+
/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+
+ +
+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a grey border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
  • +
+
+
+ + + + diff --git a/docs/html/graph_legend.md5 b/docs/html/graph_legend.md5 new file mode 100644 index 0000000..a06ed05 --- /dev/null +++ b/docs/html/graph_legend.md5 @@ -0,0 +1 @@ +387ff8eb65306fa251338d3c9bd7bfff \ No newline at end of file diff --git a/docs/html/graph_legend.png b/docs/html/graph_legend.png new file mode 100644 index 0000000..0df56a2 Binary files /dev/null and b/docs/html/graph_legend.png differ diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 0000000..dd5ca9c --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,112 @@ + + + + + + +easyMesh: Main Page + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
easyMesh Documentation
+
+
+
+
+ + + + diff --git a/docs/html/jquery.js b/docs/html/jquery.js new file mode 100644 index 0000000..d1e7eb9 --- /dev/null +++ b/docs/html/jquery.js @@ -0,0 +1,80 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType; +if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1 +},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av); +ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length; +if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b +})}})(window); +/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null; +p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' + + +
+
+
meshConnectionType Member List
+
+
+ +

This is the complete list of members for meshConnectionType, including all inherited members.

+
+ + + + + + + + + + + + +
esp_connmeshConnectionType
lastRecievedmeshConnectionType
lastTimeSyncmeshConnectionType
newConnectionmeshConnectionType
nodeIdmeshConnectionType
nodeSyncRequestmeshConnectionType
nodeSyncStatusmeshConnectionType
sendQueuemeshConnectionType
sendReadymeshConnectionType
subConnectionsmeshConnectionType
timemeshConnectionType
timeSyncStatusmeshConnectionType
+ + + + + diff --git a/docs/html/structmesh_connection_type.html b/docs/html/structmesh_connection_type.html new file mode 100644 index 0000000..249f286 --- /dev/null +++ b/docs/html/structmesh_connection_type.html @@ -0,0 +1,335 @@ + + + + + + +easyMesh: meshConnectionType Struct Reference + + + + + + + + + + + + + +
+
+ + + + + + +
+
easyMesh +
+
+
+ + + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
meshConnectionType Struct Reference
+
+
+ +

#include <easyMesh.h>

+
+Collaboration diagram for meshConnectionType:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

espconn * esp_conn
 
uint32_t nodeId = 0
 
String subConnections
 
timeSync time
 
uint32_t lastRecieved = 0
 
bool newConnection = true
 
syncStatusType nodeSyncStatus = NEEDED
 
uint32_t nodeSyncRequest = 0
 
syncStatusType timeSyncStatus = NEEDED
 
uint32_t lastTimeSync = 0
 
bool sendReady = true
 
SimpleList< String > sendQueue
 
+

Detailed Description

+
+

Definition at line 68 of file easyMesh.h.

+

Member Data Documentation

+ +
+
+ + + + +
espconn* meshConnectionType::esp_conn
+
+ +

Definition at line 69 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
uint32_t meshConnectionType::lastRecieved = 0
+
+ +

Definition at line 73 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
uint32_t meshConnectionType::lastTimeSync = 0
+
+ +

Definition at line 80 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
bool meshConnectionType::newConnection = true
+
+ +

Definition at line 74 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
uint32_t meshConnectionType::nodeId = 0
+
+ +

Definition at line 70 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
uint32_t meshConnectionType::nodeSyncRequest = 0
+
+ +

Definition at line 77 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
syncStatusType meshConnectionType::nodeSyncStatus = NEEDED
+
+ +

Definition at line 76 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
SimpleList<String> meshConnectionType::sendQueue
+
+ +

Definition at line 85 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
bool meshConnectionType::sendReady = true
+
+ +

Definition at line 84 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
String meshConnectionType::subConnections
+
+ +

Definition at line 71 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
timeSync meshConnectionType::time
+
+ +

Definition at line 72 of file easyMesh.h.

+ +
+
+ +
+
+ + + + +
syncStatusType meshConnectionType::timeSyncStatus = NEEDED
+
+ +

Definition at line 79 of file easyMesh.h.

+ +
+
+
The documentation for this struct was generated from the following file: +
+
+ + + + diff --git a/docs/html/structmesh_connection_type.js b/docs/html/structmesh_connection_type.js new file mode 100644 index 0000000..2970551 --- /dev/null +++ b/docs/html/structmesh_connection_type.js @@ -0,0 +1,15 @@ +var structmesh_connection_type = +[ + [ "esp_conn", "structmesh_connection_type.html#a484d1624a60238e8a56545f918a44d24", null ], + [ "lastRecieved", "structmesh_connection_type.html#ace31df69fc9906c1b418c86a2c751e39", null ], + [ "lastTimeSync", "structmesh_connection_type.html#acd0931b81245e3969760b700a050a8ec", null ], + [ "newConnection", "structmesh_connection_type.html#adc997cf962d5b8c6511516909590641d", null ], + [ "nodeId", "structmesh_connection_type.html#ad488ee42d590837a0878369d00db2222", null ], + [ "nodeSyncRequest", "structmesh_connection_type.html#aa5e065ceea01349f797b6ab2967f7f72", null ], + [ "nodeSyncStatus", "structmesh_connection_type.html#ac87857b5d032f28020b7044ae77fcabf", null ], + [ "sendQueue", "structmesh_connection_type.html#a35ab89799530f5e995b6ffb698d66926", null ], + [ "sendReady", "structmesh_connection_type.html#a769bec56037fe0159d104af25d289fbd", null ], + [ "subConnections", "structmesh_connection_type.html#ae3f078eda53ff4681a8faec9343abb45", null ], + [ "time", "structmesh_connection_type.html#a079e7ba0a05fb00d743286632efbd5c1", null ], + [ "timeSyncStatus", "structmesh_connection_type.html#a948b9bcb1713fa29210b2707deb98587", null ] +]; \ No newline at end of file diff --git a/docs/html/structmesh_connection_type__coll__graph.map b/docs/html/structmesh_connection_type__coll__graph.map new file mode 100644 index 0000000..95669eb --- /dev/null +++ b/docs/html/structmesh_connection_type__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/structmesh_connection_type__coll__graph.md5 b/docs/html/structmesh_connection_type__coll__graph.md5 new file mode 100644 index 0000000..3223024 --- /dev/null +++ b/docs/html/structmesh_connection_type__coll__graph.md5 @@ -0,0 +1 @@ +d43bb3cffa7eea8442aed648d1109bf3 \ No newline at end of file diff --git a/docs/html/structmesh_connection_type__coll__graph.png b/docs/html/structmesh_connection_type__coll__graph.png new file mode 100644 index 0000000..7731146 Binary files /dev/null and b/docs/html/structmesh_connection_type__coll__graph.png differ diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png new file mode 100644 index 0000000..3b443fc Binary files /dev/null and b/docs/html/sync_off.png differ diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png new file mode 100644 index 0000000..e08320f Binary files /dev/null and b/docs/html/sync_on.png differ diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png new file mode 100644 index 0000000..3b725c4 Binary files /dev/null and b/docs/html/tab_a.png differ diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png new file mode 100644 index 0000000..e2b4a86 Binary files /dev/null and b/docs/html/tab_b.png differ diff --git a/docs/html/tab_h.png b/docs/html/tab_h.png new file mode 100644 index 0000000..fd5cb70 Binary files /dev/null and b/docs/html/tab_h.png differ diff --git a/docs/html/tab_s.png b/docs/html/tab_s.png new file mode 100644 index 0000000..ab478c9 Binary files /dev/null and b/docs/html/tab_s.png differ diff --git a/docs/html/tabs.css b/docs/html/tabs.css new file mode 100644 index 0000000..9cf578f --- /dev/null +++ b/docs/html/tabs.css @@ -0,0 +1,60 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #283A5D; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} diff --git a/easymesh_nodeid.png b/easymesh_nodeid.png new file mode 100644 index 0000000..3e44fb8 Binary files /dev/null and b/easymesh_nodeid.png differ diff --git a/examples/demoToy/data/hsl.png b/examples/demoToy/data/hsl.png new file mode 100644 index 0000000..d767952 Binary files /dev/null and b/examples/demoToy/data/hsl.png differ diff --git a/examples/demoToy/data/main.js b/examples/demoToy/data/main.js index 30ac167..7f4e40e 100644 --- a/examples/demoToy/data/main.js +++ b/examples/demoToy/data/main.js @@ -195,10 +195,10 @@ function checkAlive() { } function startWebSocket() { - //ws = new WebSocket(socketStr); + ws = new WebSocket(socketStr); //ws = new WebSocket('ws://192.168.107.1:2222/'); //ws = new WebSocket('ws://192.168.10.1:2222/'); - ws = new WebSocket('ws://192.168.167.1:2222/'); + //ws = new WebSocket('ws://192.168.167.1:2222/'); ws.onmessage = function (event) {onMessageFunction(event); }; ws.onopen = function (event) {onOpenFunction(event); }; diff --git a/examples/demoToy/demoToy.ino b/examples/demoToy/demoToy.ino index f825b44..a8987ab 100644 --- a/examples/demoToy/demoToy.ino +++ b/examples/demoToy/demoToy.ino @@ -5,9 +5,15 @@ #include #include "animations.h" -#define MESH_PREFIX "whateverYouLike" -#define MESH_PASSWORD "somethingSneeky" +#define MESH_SSID "Mesh" +#define MESH_PASSWORD "Password" #define MESH_PORT 5555 +#define MESH_AUTHMODE AUTH_WPA2_PSK // AUTH_OPEN, AUTH_WPA_PSK, AUTH_WPA2_PSK, AUTH_WPA_WPA2_PSK +#define MESH_CHANNEL 1 // 0 ~ 13 +#define MESH_PHYMODE PHY_MODE_11G // PHY_MODE_11G, PHY_MODE_11B +#define MESH_MAXTPW 50 // 0 ~ 82 (unit:0.25dBm) +#define MESH_HIDDEN 0 // 0 ~ 1 +#define MESH_MAXCONN 4 // 1 ~ 4 // globals easyMesh mesh; // mesh global @@ -22,7 +28,7 @@ void setup() { // setup mesh // mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE | APPLICATION ); // all types on mesh.setDebugMsgTypes( ERROR | STARTUP | APPLICATION ); // set before init() so that you can see startup messages - mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT); + mesh.init( MESH_SSID, MESH_PASSWORD, MESH_PORT, AUTH_WPA2_PSK, MESH_CHANNEL, MESH_PHYMODE, MESH_MAXTPW, MESH_HIDDEN, MESH_MAXCONN ); mesh.setReceiveCallback( &receivedCallback ); mesh.setNewConnectionCallback( &newConnectionCallback ); @@ -34,7 +40,7 @@ void setup() { webSocketSetReceiveCallback( &wsReceiveCallback ); webSocketSetConnectionCallback( &wsConnectionCallback ); - mesh.debugMsg( STARTUP, "\nIn setup() my chipId=%d\n", mesh.getChipId()); + mesh.debugMsg( STARTUP, "\nIn setup() my nodeId=%d\n", mesh.getNodeId()); strip.Begin(); strip.Show(); @@ -85,7 +91,7 @@ void yerpCb( void *arg ) { SimpleList::iterator connection = mesh._connections.begin(); while ( connection != mesh._connections.end() ) { - mesh.debugMsg( APPLICATION, "\tconn#%d, chipId=%d subs=%s\n", connCount++, connection->chipId, connection->subConnections.c_str() ); + mesh.debugMsg( APPLICATION, "\tconn#%d, nodeId=%d subs=%s\n", connCount++, connection->nodeId, connection->subConnections.c_str() ); connection++; } @@ -180,4 +186,3 @@ String buildControl ( void ) { return ret; } - diff --git a/examples/startHere/startHere.ino b/examples/startHere/startHere.ino index c19c16a..d251f78 100644 --- a/examples/startHere/startHere.ino +++ b/examples/startHere/startHere.ino @@ -17,7 +17,7 @@ #define BLINK_PERIOD 1000000 // microseconds until cycle repeat #define BLINK_DURATION 100000 // microseconds LED is on for -#define MESH_PREFIX "whateverYouLike" +#define MESH_SSID "whateverYouLike" #define MESH_PASSWORD "somethingSneeky" #define MESH_PORT 5555 @@ -33,7 +33,7 @@ void setup() { //mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on mesh.setDebugMsgTypes( ERROR | STARTUP ); // set before init() so that you can see startup messages - mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT ); + mesh.init( MESH_SSID, MESH_PASSWORD, MESH_PORT ); mesh.setReceiveCallback( &receivedCallback ); mesh.setNewConnectionCallback( &newConnectionCallback ); @@ -62,7 +62,7 @@ void loop() { // if the time is ripe, send everyone a message! if ( sendMessageTime != 0 && sendMessageTime < mesh.getNodeTime() ){ String msg = "Hello from node "; - msg += mesh.getChipId(); + msg += mesh.getNodeId(); mesh.sendBroadcast( msg ); sendMessageTime = 0; } @@ -75,4 +75,3 @@ void receivedCallback( uint32_t from, String &msg ) { void newConnectionCallback( bool adopt ) { Serial.printf("startHere: New Connection, adopt=%d\n", adopt); } - diff --git a/src/easyMesh.cpp b/src/easyMesh.cpp index 4a71ee3..eb62295 100644 --- a/src/easyMesh.cpp +++ b/src/easyMesh.cpp @@ -33,9 +33,10 @@ uint16_t count = 0; // start configuration debugMsg( GENERAL, "wifi_set_opmode(STATIONAP_MODE) succeeded? %d\n", wifi_set_opmode( STATIONAP_MODE ) ); - - _chipId = system_get_chip_id(); - _mySSID = String( MESH_PREFIX ) + String( _chipId ); + uint8_t MAC[] = {0,0,0,0,0,0}; + wifi_get_macaddr(SOFTAP_IF, MAC); + _nodeId = encodeNodeId(MAC); + _meshSSID = String( MESH_SSID ); apInit(); // setup AP stationInit(); // setup station @@ -44,7 +45,7 @@ uint16_t count = 0; } */ //*********************************************************************** -void ICACHE_FLASH_ATTR easyMesh::init( String prefix, String password, uint16_t port ) { +void ICACHE_FLASH_ATTR easyMesh::init( String ssid, String password, uint16_t port, _auth_mode authmode, uint8_t channel, phy_mode_t phymode, uint8_t maxtpw, uint8_t hidden, uint8_t maxconn ) { // shut everything down, start with a blank slate. debugMsg( STARTUP, "init():\n", wifi_station_set_auto_connect( 0 )); @@ -55,17 +56,28 @@ void ICACHE_FLASH_ATTR easyMesh::init( String prefix, String password, uint16_t wifi_softap_dhcps_stop(); wifi_set_event_handler_cb( wifiEventCb ); + + wifi_set_phy_mode( phymode ); // allow setting PHY_MODE_11G / PHY_MODE_11B + system_phy_set_max_tpw( maxtpw ); //maximum value of RF Tx Power, unit : 0.25dBm, range [0,82] staticThis = this; // provides a way for static callback methods to access "this" object; // start configuration debugMsg( GENERAL, "wifi_set_opmode(STATIONAP_MODE) succeeded? %d\n", wifi_set_opmode( STATIONAP_MODE ) ); - _meshPrefix = prefix; + _meshSSID = ssid; _meshPassword = password; _meshPort = port; - _chipId = system_get_chip_id(); - _mySSID = _meshPrefix + String( _chipId ); + _meshChannel = channel; + _meshAuthMode = authmode; + if( password == "" ) + _meshAuthMode = AUTH_OPEN; //if no password ... set auth mode to open + _meshHidden = hidden; + _meshMaxConn = maxconn; + + uint8_t MAC[] = {0,0,0,0,0,0}; + wifi_get_macaddr(SOFTAP_IF, MAC); + _nodeId = encodeNodeId(MAC); apInit(); // setup AP stationInit(); // setup station @@ -89,7 +101,5 @@ bool ICACHE_FLASH_ATTR easyMesh::sendSingle( uint32_t &destId, String &msg ){ //*********************************************************************** bool ICACHE_FLASH_ATTR easyMesh::sendBroadcast( String &msg ) { debugMsg( COMMUNICATION, "sendBroadcast(): msg=%s\n", msg.c_str()); - broadcastMessage( _chipId, BROADCAST, msg ); + broadcastMessage( _nodeId, BROADCAST, msg ); } - - diff --git a/src/easyMesh.h b/src/easyMesh.h index ef7ab68..7d45767 100644 --- a/src/easyMesh.h +++ b/src/easyMesh.h @@ -12,11 +12,10 @@ extern "C" { #include "easyMeshSync.h" -//#define MESH_PREFIX "mesh" +//#define MESH_SSID "mesh" //#define MESH_PASSWORD "bootyboo" //#define MESH_PORT 4444 #define NODE_TIMEOUT 3000000 //uSecs - #define JSON_BUFSIZE 300 // initial size for the DynamicJsonBuffers. @@ -68,7 +67,7 @@ enum debugType { struct meshConnectionType { espconn *esp_conn; - uint32_t chipId = 0; + uint32_t nodeId = 0; String subConnections; timeSync time; uint32_t lastRecieved = 0; @@ -90,7 +89,7 @@ struct meshConnectionType { class easyMesh { public: //inline functions - uint32 getChipId( void ) { return _chipId;}; + uint32_t getNodeId( void ) { return _nodeId;}; // in easyMeshDebug.cpp void setDebugMsgTypes( uint16_t types ); @@ -98,8 +97,7 @@ class easyMesh { // in easyMesh.cpp // void init( void ); - void init( String prefix, String password, uint16_t port ); - + void init( String ssid, String password, uint16_t port, _auth_mode authmode = AUTH_WPA2_PSK, uint8_t channel = 0, phy_mode_t phymode = PHY_MODE_11G, uint8_t maxtpw = 82, uint8_t hidden = 0, uint8_t maxconn = 4 ); void update( void ); bool sendSingle( uint32_t &destId, String &msg ); bool sendBroadcast( String &msg ); @@ -126,8 +124,8 @@ class easyMesh { bool sendMessage( uint32_t destId, meshPackageType type, String &msg ); bool broadcastMessage( uint32_t fromId, meshPackageType type, String &msg, meshConnectionType *exclude = NULL ); - bool sendPackage( meshConnectionType *connection, String &package ); - String buildMeshPackage(uint32_t destId, meshPackageType type, String &msg); + bool sendPackage( meshConnectionType *connection, String &package ); + String buildMeshPackage(uint32_t destId, meshPackageType type, String &msg); // in easyMeshSync.cpp @@ -141,7 +139,7 @@ class easyMesh { // in easyMeshConnection.cpp void manageConnections( void ); String subConnectionJson( meshConnectionType *exclude ); - meshConnectionType* findConnection( uint32_t chipId ); + meshConnectionType* findConnection( uint32_t nodeId ); meshConnectionType* findConnection( espconn *conn ); void cleanDeadConnections( void ); void tcpConnect( void ); @@ -151,34 +149,37 @@ class easyMesh { // in easyMeshSTA.cpp void manageStation( void ); - - // in ? - static void stationScanCb(void *arg, STATUS status); - static void scanTimerCallback( void *arg ); - void stationInit( void ); - bool stationConnect( void ); - void startStationScan( void ); - - void apInit( void ); - void tcpServerInit(espconn &serverConn, esp_tcp &serverTcp, espconn_connect_callback connectCb, uint32 port); + static void stationScanCb(void *arg, STATUS status); + static void scanTimerCallback( void *arg ); + void stationInit( void ); + bool stationConnect( void ); + void startStationScan( void ); + uint32_t encodeNodeId( uint8_t *hwaddr ); + + // in easyMeshAP.cpp + void apInit( void ); + void tcpServerInit(espconn &serverConn, esp_tcp &serverTcp, espconn_connect_callback connectCb, uint32 port); // callbacks // in easyMeshConnection.cpp - static void wifiEventCb(System_Event_t *event); - static void meshConnectedCb(void *arg); - static void meshSentCb(void *arg); - static void meshRecvCb(void *arg, char *data, unsigned short length); - static void meshDisconCb(void *arg); - static void meshReconCb(void *arg, sint8 err); + static void wifiEventCb(System_Event_t *event); + static void meshConnectedCb(void *arg); + static void meshSentCb(void *arg); + static void meshRecvCb(void *arg, char *data, unsigned short length); + static void meshDisconCb(void *arg); + static void meshReconCb(void *arg, sint8 err); // variables - uint32_t _chipId; - String _mySSID; - String _meshPrefix; + uint32_t _nodeId; + String _meshSSID; String _meshPassword; uint16_t _meshPort; - + uint8_t _meshChannel; + _auth_mode _meshAuthMode; + uint8_t _meshHidden; + uint8_t _meshMaxConn; + os_timer_t _scanTimer; espconn _meshServerConn; @@ -190,4 +191,3 @@ class easyMesh { #endif // _EASY_MESH_H_ - diff --git a/src/easyMeshAP.cpp b/src/easyMeshAP.cpp index 439b1ac..7a6cb2e 100644 --- a/src/easyMeshAP.cpp +++ b/src/easyMeshAP.cpp @@ -3,7 +3,7 @@ // // // Created by Bill Gray on 7/26/16. -// +// // #include @@ -22,7 +22,7 @@ void ICACHE_FLASH_ATTR easyMesh::apInit( void ) { // String password( MESH_PASSWORD ); ip_addr ip, netmask; - IP4_ADDR( &ip, 192, 168, ( _chipId & 0xFF ), 1); + IP4_ADDR( &ip, 192, 168, ( _nodeId & 0xFF ), 1); IP4_ADDR( &netmask, 255, 255, 255, 0); ip_info ipInfo; @@ -34,7 +34,7 @@ void ICACHE_FLASH_ATTR easyMesh::apInit( void ) { } debugMsg( STARTUP, "apInit(): Starting AP with SSID=%s IP=%d.%d.%d.%d GW=%d.%d.%d.%d NM=%d.%d.%d.%d\n", - _mySSID.c_str(), + _meshSSID.c_str(), IP2STR( &ipInfo.ip ), IP2STR( &ipInfo.gw ), IP2STR( &ipInfo.netmask ) ); @@ -44,12 +44,15 @@ void ICACHE_FLASH_ATTR easyMesh::apInit( void ) { memset( apConfig.ssid, 0, 32 ); memset( apConfig.password, 0, 64); - memcpy( apConfig.ssid, _mySSID.c_str(), _mySSID.length()); + memcpy( apConfig.ssid, _meshSSID.c_str(), _meshSSID.length()); memcpy( apConfig.password, _meshPassword.c_str(), _meshPassword.length() ); - apConfig.authmode = AUTH_WPA2_PSK; - apConfig.ssid_len = _mySSID.length(); + + apConfig.authmode = _meshAuthMode; // AUTH_WPA2_PSK + apConfig.ssid_len = _meshSSID.length(); + apConfig.ssid_hidden = _meshHidden; + apConfig.channel = _meshChannel; apConfig.beacon_interval = 100; - apConfig.max_connection = 4; // how many stations can connect to ESP8266 softAP at most. + apConfig.max_connection = _meshMaxConn; // how many stations can connect to ESP8266 softAP at most. wifi_softap_set_config(&apConfig);// Set ESP8266 softap config . if ( !wifi_softap_dhcps_start() ) diff --git a/src/easyMeshComm.cpp b/src/easyMeshComm.cpp index f21efd5..d090b9e 100644 --- a/src/easyMeshComm.cpp +++ b/src/easyMeshComm.cpp @@ -17,8 +17,8 @@ extern easyMesh* staticThis; // communications functions //*********************************************************************** bool ICACHE_FLASH_ATTR easyMesh::sendMessage( meshConnectionType *conn, uint32_t destId, meshPackageType type, String &msg ) { - debugMsg( COMMUNICATION, "sendMessage(conn): conn-chipId=%d destId=%d type=%d msg=%s\n", - conn->chipId, destId, (uint8_t)type, msg.c_str()); + debugMsg( COMMUNICATION, "sendMessage(conn): conn-nodeId=%d destId=%d type=%d msg=%s\n", + conn->nodeId, destId, (uint8_t)type, msg.c_str()); String package = buildMeshPackage( destId, type, msg ); @@ -51,7 +51,7 @@ bool ICACHE_FLASH_ATTR easyMesh::broadcastMessage(uint32_t from, if ( exclude != NULL ) debugMsg( COMMUNICATION, "broadcastMessage(): from=%d type=%d, msg=%s exclude=%d\n", - from, type, msg.c_str(), exclude->chipId); + from, type, msg.c_str(), exclude->nodeId); else debugMsg( COMMUNICATION, "broadcastMessage(): from=%d type=%d, msg=%s exclude=NULL\n", from, type, msg.c_str()); @@ -59,7 +59,7 @@ bool ICACHE_FLASH_ATTR easyMesh::broadcastMessage(uint32_t from, SimpleList::iterator connection = _connections.begin(); while ( connection != _connections.end() ) { if ( connection != exclude ) { - sendMessage( connection, connection->chipId, type, msg ); + sendMessage( connection, connection->nodeId, type, msg ); } connection++; } @@ -68,7 +68,7 @@ bool ICACHE_FLASH_ATTR easyMesh::broadcastMessage(uint32_t from, //*********************************************************************** bool ICACHE_FLASH_ATTR easyMesh::sendPackage( meshConnectionType *connection, String &package ) { - debugMsg( COMMUNICATION, "Sending to %d-->%s<--\n", connection->chipId, package.c_str() ); + debugMsg( COMMUNICATION, "Sending to %d-->%s<--\n", connection->nodeId, package.c_str() ); if ( package.length() > 1400 ) debugMsg( ERROR, "sendPackage(): err package too long length=%d\n", package.length()); @@ -97,7 +97,7 @@ String ICACHE_FLASH_ATTR easyMesh::buildMeshPackage( uint32_t destId, meshPackag DynamicJsonBuffer jsonBuffer( JSON_BUFSIZE ); JsonObject& root = jsonBuffer.createObject(); root["dest"] = destId; - root["from"] = _chipId; + root["from"] = _nodeId; root["type"] = (uint8_t)type; switch( type ) { diff --git a/src/eashMeshConnection.cpp b/src/easyMeshConnection.cpp similarity index 90% rename from src/eashMeshConnection.cpp rename to src/easyMeshConnection.cpp index bfe5cae..1ba31f1 100644 --- a/src/eashMeshConnection.cpp +++ b/src/easyMeshConnection.cpp @@ -1,5 +1,5 @@ // -// eashMeshConnection.cpp +// easyMeshConnection.cpp // // // Created by Bill Gray on 7/26/16. @@ -39,7 +39,7 @@ void ICACHE_FLASH_ATTR easyMesh::setNewConnectionCallback( void(*onNewConnection meshConnectionType* ICACHE_FLASH_ATTR easyMesh::closeConnection( meshConnectionType *conn ) { // It seems that more should be done here... perhas send off a packette to // make an attempt to tell the other node that we are closing this conneciton? - debugMsg( CONNECTION, "closeConnection(): conn-chipId=%d\n", conn->chipId ); + debugMsg( CONNECTION, "closeConnection(): conn-nodeId=%d\n", conn->nodeId ); espconn_disconnect( conn->esp_conn ); return _connections.erase( conn ); } @@ -47,24 +47,30 @@ meshConnectionType* ICACHE_FLASH_ATTR easyMesh::closeConnection( meshConnectionT //*********************************************************************** void ICACHE_FLASH_ATTR easyMesh::manageConnections( void ) { debugMsg( GENERAL, "manageConnections():\n"); + + uint32_t nowNodeTime; + uint32_t nodeTimeOut = NODE_TIMEOUT; + uint32_t connLastRecieved; + SimpleList::iterator connection = _connections.begin(); while ( connection != _connections.end() ) { - if ( connection->lastRecieved + NODE_TIMEOUT < getNodeTime() ) { - debugMsg( CONNECTION, "manageConnections(): dropping %d NODE_TIMEOUT last=%u node=%u\n", connection->chipId, connection->lastRecieved, getNodeTime() ); - + nowNodeTime = getNodeTime(); + connLastRecieved = connection->lastRecieved; + if ( nowNodeTime - connLastRecieved > nodeTimeOut ) { + debugMsg( CONNECTION, "manageConnections(): dropping %d now= %u - last= %u ( %u ) > timeout= %u \n", connection->nodeId, nowNodeTime, connLastRecieved, nowNodeTime - connLastRecieved, nodeTimeOut ); connection = closeConnection( connection ); continue; } if( connection->esp_conn->state == ESPCONN_CLOSE ) { - debugMsg( CONNECTION, "manageConnections(): dropping %d ESPCONN_CLOSE\n",connection->chipId); + debugMsg( CONNECTION, "manageConnections(): dropping %d ESPCONN_CLOSE\n",connection->nodeId); connection = closeConnection( connection ); continue; } switch ( connection->nodeSyncStatus ) { case NEEDED: // start a nodeSync - debugMsg( SYNC, "manageConnections(): start nodeSync with %d\n", connection->chipId); + debugMsg( SYNC, "manageConnections(): start nodeSync with %d\n", connection->nodeId); startNodeSync( connection ); connection->nodeSyncStatus = IN_PROGRESS; @@ -75,7 +81,7 @@ void ICACHE_FLASH_ATTR easyMesh::manageConnections( void ) { switch ( connection->timeSyncStatus ) { case NEEDED: - debugMsg( SYNC, "manageConnections(): starting timeSync with %d\n", connection->chipId); + debugMsg( SYNC, "manageConnections(): starting timeSync with %d\n", connection->nodeId); startTimeSync( connection ); connection->timeSyncStatus = IN_PROGRESS; @@ -98,11 +104,11 @@ void ICACHE_FLASH_ATTR easyMesh::manageConnections( void ) { if ( connection->nodeSyncRequest == 0 ) { // nodeSync not in progress if ( (connection->esp_conn->proto.tcp->local_port == _meshPort // we are AP && - connection->lastRecieved + ( NODE_TIMEOUT / 2 ) < nodeTime ) + nowNodeTime - connLastRecieved > ( nodeTimeOut / 2 ) ) || (connection->esp_conn->proto.tcp->local_port != _meshPort // we are the STA && - connection->lastRecieved + ( NODE_TIMEOUT * 3 / 4 ) < nodeTime ) + nowNodeTime - connLastRecieved > ( nodeTimeOut * 3 / 4 ) ) ) { connection->nodeSyncStatus = NEEDED; } @@ -112,26 +118,26 @@ void ICACHE_FLASH_ATTR easyMesh::manageConnections( void ) { } //*********************************************************************** -meshConnectionType* ICACHE_FLASH_ATTR easyMesh::findConnection( uint32_t chipId ) { - debugMsg( GENERAL, "In findConnection(chipId)\n"); +meshConnectionType* ICACHE_FLASH_ATTR easyMesh::findConnection( uint32_t nodeId ) { + debugMsg( GENERAL, "In findConnection(nodeId)\n"); SimpleList::iterator connection = _connections.begin(); while ( connection != _connections.end() ) { - if ( connection->chipId == chipId ) { // check direct connections - debugMsg( GENERAL, "findConnection(chipId): Found Direct Connection\n"); + if ( connection->nodeId == nodeId ) { // check direct connections + debugMsg( GENERAL, "findConnection(nodeId): Found Direct Connection\n"); return connection; } - String chipIdStr(chipId); - if ( connection->subConnections.indexOf(chipIdStr) != -1 ) { // check sub-connections - debugMsg( GENERAL, "findConnection(chipId): Found Sub Connection\n"); + String nodeIdStr(nodeId); + if ( connection->subConnections.indexOf(nodeIdStr) != -1 ) { // check sub-connections + debugMsg( GENERAL, "findConnection(nodeId): Found Sub Connection\n"); return connection; } connection++; } - debugMsg( CONNECTION, "findConnection(%d): did not find connection\n", chipId ); + debugMsg( CONNECTION, "findConnection(%d): did not find connection\n", nodeId ); return NULL; } @@ -155,7 +161,7 @@ meshConnectionType* ICACHE_FLASH_ATTR easyMesh::findConnection( espconn *conn ) //*********************************************************************** String ICACHE_FLASH_ATTR easyMesh::subConnectionJson( meshConnectionType *exclude ) { - debugMsg( GENERAL, "subConnectionJson(), exclude=%d\n", exclude->chipId ); + debugMsg( GENERAL, "subConnectionJson(), exclude=%d\n", exclude->nodeId ); DynamicJsonBuffer jsonBuffer( JSON_BUFSIZE ); JsonArray& subArray = jsonBuffer.createArray(); @@ -164,12 +170,12 @@ String ICACHE_FLASH_ATTR easyMesh::subConnectionJson( meshConnectionType *exclud SimpleList::iterator sub = _connections.begin(); while ( sub != _connections.end() ) { - if ( sub != exclude && sub->chipId != 0 ) { //exclude connection that we are working with & anything too new. + if ( sub != exclude && sub->nodeId != 0 ) { //exclude connection that we are working with & anything too new. JsonObject& subObj = jsonBuffer.createObject(); if ( !subObj.success() ) debugMsg( ERROR, "subConnectionJson(): ran out of memory 2"); - subObj["chipId"] = sub->chipId; + subObj["nodeId"] = sub->nodeId; if ( sub->subConnections.length() != 0 ) { //debugMsg( GENERAL, "subConnectionJson(): sub->subConnections=%s\n", sub->subConnections.c_str() ); @@ -273,7 +279,7 @@ void ICACHE_FLASH_ATTR easyMesh::meshConnectedCb(void *arg) { void ICACHE_FLASH_ATTR easyMesh::meshRecvCb(void *arg, char *data, unsigned short length) { meshConnectionType *receiveConn = staticThis->findConnection( (espconn *)arg ); - staticThis->debugMsg( COMMUNICATION, "meshRecvCb(): data=%s fromId=%d\n", data, receiveConn->chipId ); + staticThis->debugMsg( COMMUNICATION, "meshRecvCb(): data=%s fromId=%d\n", data, receiveConn->nodeId ); if ( receiveConn == NULL ) { staticThis->debugMsg( ERROR, "meshRecvCb(): recieved from unknown connection 0x%x ->%s<-\n", arg, data); @@ -282,7 +288,8 @@ void ICACHE_FLASH_ATTR easyMesh::meshRecvCb(void *arg, char *data, unsigned shor } - + String somestring(data); //copy data before json parsing FIXME: can someone explain why this works? + DynamicJsonBuffer jsonBuffer( JSON_BUFSIZE ); JsonObject& root = jsonBuffer.parseObject( data ); if (!root.success()) { // Test if parsing succeeded. @@ -290,7 +297,7 @@ void ICACHE_FLASH_ATTR easyMesh::meshRecvCb(void *arg, char *data, unsigned shor return; } - staticThis->debugMsg( GENERAL, "Recvd from %d-->%s<--\n", receiveConn->chipId, data); + staticThis->debugMsg( GENERAL, "Recvd from %d-->%s<--\n", receiveConn->nodeId, data); String msg = root["msg"]; @@ -305,7 +312,7 @@ void ICACHE_FLASH_ATTR easyMesh::meshRecvCb(void *arg, char *data, unsigned shor break; case SINGLE: - if ( (uint32_t)root["dest"] == staticThis->getChipId() ) { // msg for us! + if ( (uint32_t)root["dest"] == staticThis->getNodeId() ) { // msg for us! receivedCallback( (uint32_t)root["from"], msg); } else { // pass it along //staticThis->sendMessage( (uint32_t)root["dest"], (uint32_t)root["from"], SINGLE, msg ); //this is ineffiecnt @@ -326,6 +333,7 @@ void ICACHE_FLASH_ATTR easyMesh::meshRecvCb(void *arg, char *data, unsigned shor // record that we've gotten a valid package receiveConn->lastRecieved = staticThis->getNodeTime(); + staticThis->debugMsg( COMMUNICATION, "meshRecvCb(): lastRecieved=%u fromId=%d\n", receiveConn->lastRecieved, receiveConn->chipId ); return; } @@ -414,4 +422,3 @@ void ICACHE_FLASH_ATTR easyMesh::wifiEventCb(System_Event_t *event) { break; } } - diff --git a/src/easyMeshDebug.cpp b/src/easyMeshDebug.cpp index eae6c10..53281fe 100644 --- a/src/easyMeshDebug.cpp +++ b/src/easyMeshDebug.cpp @@ -37,4 +37,3 @@ void easyMesh::debugMsg( debugType type, const char* format ... ) { va_end(args); } } - diff --git a/src/easyMeshSTA.cpp b/src/easyMeshSTA.cpp index 3665688..a816590 100644 --- a/src/easyMeshSTA.cpp +++ b/src/easyMeshSTA.cpp @@ -72,18 +72,29 @@ void ICACHE_FLASH_ATTR easyMesh::startStationScan( void ) { if ( _scanStatus != IDLE ) { return; } - - if ( !wifi_station_scan(NULL, stationScanCb) ) { + + char tempssid[32]; + struct scan_config scanConfig; + memset( &scanConfig, 0, sizeof(scanConfig) ); + staticThis->_meshSSID.toCharArray( tempssid, staticThis->_meshSSID.length()+1 ); + + scanConfig.ssid = (uint8_t *) tempssid; // limit scan to mesh ssid + scanConfig.bssid = 0; + scanConfig.channel = staticThis->_meshChannel; // also limit scan to mesh channel to speed things up ... + scanConfig.show_hidden = 1; // add hidden APs ... why not? we might want to hide ... + + if ( !wifi_station_scan( &scanConfig, stationScanCb ) ) { debugMsg( ERROR, "wifi_station_scan() failed!?\n"); return; } _scanStatus = SCANNING; - debugMsg( CONNECTION, "-->scan started @ %d<--\n", system_get_time()); + debugMsg( CONNECTION, "-->scan started @ %u<--\n", staticThis->getNodeTime() ); return; } //*********************************************************************** void ICACHE_FLASH_ATTR easyMesh::scanTimerCallback( void *arg ) { + //os_timer_disarm(&staticThis->_scanTimer); staticThis->startStationScan(); // this function can be totally elimiated! @@ -93,20 +104,18 @@ void ICACHE_FLASH_ATTR easyMesh::scanTimerCallback( void *arg ) { void ICACHE_FLASH_ATTR easyMesh::stationScanCb(void *arg, STATUS status) { char ssid[32]; bss_info *bssInfo = (bss_info *)arg; - staticThis->debugMsg( CONNECTION, "stationScanCb():-- > scan finished @ % d < --\n", system_get_time()); + staticThis->debugMsg( CONNECTION, "stationScanCb():-- > scan finished @ %u < --\n", staticThis->getNodeTime() ); staticThis->_scanStatus = IDLE; staticThis->_meshAPs.clear(); while (bssInfo != NULL) { staticThis->debugMsg( CONNECTION, "\tfound : % s, % ddBm", (char*)bssInfo->ssid, (int16_t) bssInfo->rssi ); - if ( strncmp( (char*)bssInfo->ssid, staticThis->_meshPrefix.c_str(), staticThis->_meshPrefix.length() ) == 0 ) { - staticThis->debugMsg( CONNECTION, " MESH_PRE< ---"); - staticThis->_meshAPs.push_back( *bssInfo ); - } + staticThis->debugMsg( CONNECTION, " MESH< ---"); + staticThis->_meshAPs.push_back( *bssInfo ); staticThis->debugMsg( CONNECTION, "\n"); bssInfo = STAILQ_NEXT(bssInfo, next); } - staticThis->debugMsg( CONNECTION, "\tFound % d nodes with _meshPrefix = \"%s\"\n", staticThis->_meshAPs.size(), staticThis->_meshPrefix.c_str() ); + staticThis->debugMsg( CONNECTION, "\tFound % d nodes with _meshSSID = \"%s\"\n", staticThis->_meshAPs.size(), staticThis->_meshSSID.c_str() ); staticThis->connectToBestAP(); } @@ -114,14 +123,15 @@ void ICACHE_FLASH_ATTR easyMesh::stationScanCb(void *arg, STATUS status) { //*********************************************************************** bool ICACHE_FLASH_ATTR easyMesh::connectToBestAP( void ) { debugMsg( CONNECTION, "connectToBestAP():"); + uint32_t apNodeId = 0; // drop any _meshAP's we are already connected to SimpleList::iterator ap = _meshAPs.begin(); while( ap != _meshAPs.end() ) { - String apChipId = (char*)ap->ssid + _meshPrefix.length(); - // debugMsg( GENERAL, "connectToBestAP: sort - ssid=%s, apChipId=%s", ap->ssid, apChipId.c_str()); + apNodeId = encodeNodeId(ap->bssid); + // debugMsg( GENERAL, "connectToBestAP: sort - ssid=%s, apNodeId=%d", ap->ssid, apNodeId); - if ( findConnection( apChipId.toInt() ) != NULL ) { + if ( findConnection( apNodeId ) != NULL ) { ap = _meshAPs.erase( ap ); // debugMsg( GENERAL, "<--already connected\n"); } @@ -159,9 +169,10 @@ bool ICACHE_FLASH_ATTR easyMesh::connectToBestAP( void ) { } // connect to bestAP - debugMsg( CONNECTION, "connectToBestAP(): Best AP is %s<---\n", (char*)bestAP->ssid ); + debugMsg( CONNECTION, "connectToBestAP(): Best AP is %d<---\n", encodeNodeId( bestAP->bssid )); struct station_config stationConf; - stationConf.bssid_set = 0; + stationConf.bssid_set = 1; + memcpy(&stationConf.bssid, bestAP->bssid, 6); memcpy(&stationConf.ssid, bestAP->ssid, 32); memcpy(&stationConf.password, _meshPassword.c_str(), 64); wifi_station_set_config(&stationConf); @@ -216,3 +227,14 @@ void ICACHE_FLASH_ATTR easyMesh::tcpConnect( void ) { debugMsg( ERROR, "tcpConnect(): err Something un expected in tcpConnect()\n"); } } +//*********************************************************************** +uint32_t ICACHE_FLASH_ATTR easyMesh::encodeNodeId( uint8_t *hwaddr ) { + debugMsg( GENERAL, "encodeNodeId():\n"); + uint32 value = 0; + + value |= hwaddr[2] << 24; //Big endian (aka "network order"): + value |= hwaddr[3] << 16; + value |= hwaddr[4] << 8; + value |= hwaddr[5]; + return value; +} diff --git a/src/easyMeshSync.cpp b/src/easyMeshSync.cpp index 2f72506..3bb9e94 100644 --- a/src/easyMeshSync.cpp +++ b/src/easyMeshSync.cpp @@ -13,7 +13,7 @@ uint32_t timeAdjuster = 0; uint32_t ICACHE_FLASH_ATTR easyMesh::getNodeTime( void ) { uint32_t ret = system_get_time() + timeAdjuster; - debugMsg( GENERAL, "getNodeTime(): time=%d\n", ret); + debugMsg( GENERAL, "getNodeTime(): time=%u\n", ret); return ret; } @@ -69,7 +69,7 @@ bool ICACHE_FLASH_ATTR timeSync::processTimeStamp( String &str ) { } //*********************************************************************** -void ICACHE_FLASH_ATTR timeSync::calcAdjustment ( bool odd ) { +void ICACHE_FLASH_ATTR timeSync::calcAdjustment( bool odd ) { staticThis->debugMsg( SYNC, "calcAdjustment(): odd=%u\n", odd); uint32_t bestInterval = 0xFFFFFFFF; @@ -107,34 +107,34 @@ void ICACHE_FLASH_ATTR timeSync::calcAdjustment ( bool odd ) { // easyMesh Syncing functions //*********************************************************************** void ICACHE_FLASH_ATTR easyMesh::startNodeSync( meshConnectionType *conn ) { - debugMsg( SYNC, "startNodeSync(): with %u\n", conn->chipId); + debugMsg( SYNC, "startNodeSync(): with %d\n", conn->nodeId ); String subs = subConnectionJson( conn ); - sendMessage( conn, conn->chipId, NODE_SYNC_REQUEST, subs ); + sendMessage( conn, conn->nodeId, NODE_SYNC_REQUEST, subs ); conn->nodeSyncRequest = getNodeTime(); conn->nodeSyncStatus = IN_PROGRESS; } //*********************************************************************** void ICACHE_FLASH_ATTR easyMesh::handleNodeSync( meshConnectionType *conn, JsonObject& root ) { - debugMsg( SYNC, "handleNodeSync(): with %u\n", conn->chipId); + debugMsg( SYNC, "handleNodeSync(): with %d\n", conn->nodeId ); meshPackageType type = (meshPackageType)(int)root["type"]; - uint32_t remoteChipId = (uint32_t)root["from"]; + uint32_t remoteNodeId = (uint32_t)root["from"]; uint32_t destId = (uint32_t)root["dest"]; bool reSyncAllSubConnections = false; - if( (destId == 0) && (findConnection( remoteChipId ) != NULL) ) { + if( (destId == 0) && (findConnection( remoteNodeId ) != NULL) ) { // this is the first NODE_SYNC_REQUEST from a station // is we are already connected drop this connection - debugMsg( SYNC, "handleNodeSync(): Already connected to node %d. Dropping\n", conn->chipId); + debugMsg( SYNC, "handleNodeSync(): Already connected to node %d. Dropping\n", conn->nodeId); closeConnection( conn ); return; } - if ( conn->chipId != remoteChipId ) { - debugMsg( SYNC, "handleNodeSync(): conn->chipId updated from %d to %d\n", conn->chipId, remoteChipId ); - conn->chipId = remoteChipId; + if ( conn->nodeId != remoteNodeId ) { + debugMsg( SYNC, "handleNodeSync(): conn->nodeId updated from %d to %d\n", conn->nodeId, remoteNodeId ); + conn->nodeId = remoteNodeId; } @@ -148,13 +148,13 @@ void ICACHE_FLASH_ATTR easyMesh::handleNodeSync( meshConnectionType *conn, JsonO switch ( type ) { case NODE_SYNC_REQUEST: { - debugMsg( SYNC, "handleNodeSync(): valid NODE_SYNC_REQUEST %d sending NODE_SYNC_REPLY\n", conn->chipId ); + debugMsg( SYNC, "handleNodeSync(): valid NODE_SYNC_REQUEST %d sending NODE_SYNC_REPLY\n", conn->nodeId ); String myOtherSubConnections = subConnectionJson( conn ); - sendMessage( conn, _chipId, NODE_SYNC_REPLY, myOtherSubConnections ); + sendMessage( conn, conn->nodeId, NODE_SYNC_REPLY, myOtherSubConnections ); break; } case NODE_SYNC_REPLY: - debugMsg( SYNC, "handleNodeSync(): valid NODE_SYNC_REPLY from %d\n", conn->chipId ); + debugMsg( SYNC, "handleNodeSync(): valid NODE_SYNC_REPLY from %d\n", conn->nodeId ); conn->nodeSyncRequest = 0; //reset nodeSyncRequest Timer ???? if ( conn->lastTimeSync == 0 ) startTimeSync( conn ); @@ -176,7 +176,7 @@ void ICACHE_FLASH_ATTR easyMesh::handleNodeSync( meshConnectionType *conn, JsonO //*********************************************************************** void ICACHE_FLASH_ATTR easyMesh::startTimeSync( meshConnectionType *conn ) { - debugMsg( SYNC, "startTimeSync(): with %d\n", conn->chipId ); + debugMsg( SYNC, "startTimeSync(): with %d\n", conn->nodeId ); if ( conn->time.num > TIME_SYNC_CYCLES ) { debugMsg( ERROR, "startTimeSync(): Error timeSync.num not reset conn->time.num=%d\n", conn->time.num ); @@ -188,7 +188,7 @@ void ICACHE_FLASH_ATTR easyMesh::startTimeSync( meshConnectionType *conn ) { // debugMsg( GENERAL, "startTimeSync(): remoteSubCount=%d adopt=%d\n", remoteSubCount, conn->time.adopt); String timeStamp = conn->time.buildTimeStamp(); - staticThis->sendMessage( conn, _chipId, TIME_SYNC, timeStamp ); + staticThis->sendMessage( conn, conn->nodeId, TIME_SYNC, timeStamp ); conn->timeSyncStatus = IN_PROGRESS; } @@ -202,7 +202,7 @@ bool ICACHE_FLASH_ATTR easyMesh::adoptionCalc( meshConnectionType *conn ) { bool ret = ( mySubCount > remoteSubCount ) ? false : true; - debugMsg( GENERAL, "adoptionCalc(): mySubCount=%d remoteSubCount=%d ret = %d\n", mySubCount, remoteSubCount, ret); + debugMsg( GENERAL, "adoptionCalc(): mySubCount=%d remoteSubCount=%d ret = %d\n", mySubCount, remoteSubCount, ret ); return ret; } @@ -211,15 +211,15 @@ bool ICACHE_FLASH_ATTR easyMesh::adoptionCalc( meshConnectionType *conn ) { void ICACHE_FLASH_ATTR easyMesh::handleTimeSync( meshConnectionType *conn, JsonObject& root ) { String timeStamp = root["msg"]; - debugMsg( SYNC, "handleTimeSync(): with %d in timestamp=%s\n", conn->chipId, timeStamp.c_str()); + debugMsg( SYNC, "handleTimeSync(): with %d in timestamp=%s\n", conn->nodeId, timeStamp.c_str() ); conn->time.processTimeStamp( timeStamp ); //varifies timeStamp and updates it with a new one. - debugMsg( SYNC, "handleTimeSync(): with %d out timestamp=%s\n", conn->chipId, timeStamp.c_str()); + debugMsg( SYNC, "handleTimeSync(): with %d out timestamp=%s\n", conn->nodeId, timeStamp.c_str() ); if ( conn->time.num < TIME_SYNC_CYCLES ) { - staticThis->sendMessage( conn, _chipId, TIME_SYNC, timeStamp ); + staticThis->sendMessage( conn, conn->nodeId, TIME_SYNC, timeStamp ); } uint8_t odd = conn->time.num % 2; @@ -245,3 +245,5 @@ void ICACHE_FLASH_ATTR easyMesh::handleTimeSync( meshConnectionType *conn, JsonO + +