diff --git a/eclipse_usb/.cproject b/eclipse_usb/.cproject
old mode 100755
new mode 100644
diff --git a/eclipse_usb/.gdbinit b/eclipse_usb/.gdbinit
old mode 100755
new mode 100644
diff --git a/eclipse_usb/.project b/eclipse_usb/.project
old mode 100755
new mode 100644
diff --git a/eclipse_usb/.settings/language.settings.xml b/eclipse_usb/.settings/language.settings.xml
old mode 100755
new mode 100644
index 9051cd6..89c536c
--- a/eclipse_usb/.settings/language.settings.xml
+++ b/eclipse_usb/.settings/language.settings.xml
@@ -5,7 +5,7 @@
-
+
@@ -16,7 +16,7 @@
-
+
diff --git a/eclipse_wifi/.cproject b/eclipse_wifi/.cproject
old mode 100755
new mode 100644
diff --git a/eclipse_wifi/.gdbinit b/eclipse_wifi/.gdbinit
old mode 100755
new mode 100644
diff --git a/eclipse_wifi/.project b/eclipse_wifi/.project
old mode 100755
new mode 100644
diff --git a/eclipse_wifi/.settings/language.settings.xml b/eclipse_wifi/.settings/language.settings.xml
old mode 100755
new mode 100644
diff --git a/src/client.c b/src/client.c
old mode 100755
new mode 100644
index c303579..5614756
--- a/src/client.c
+++ b/src/client.c
@@ -15,6 +15,7 @@
#include "client.h"
+char_t tx_buffer [MSG_TEXT_SIZE];
static bool_t ping (devAEM_t dev) {
char_t cmd[72];
@@ -23,7 +24,7 @@ static bool_t ping (devAEM_t dev) {
// ask host to ping and make a little pre-process before take the answer
sprintf (cmd,
"test $(ping -c1 -w%d %u.%u.%u.%u| grep received |cut -d' ' -f4) = 1",
- settings.pingTimeout, ip.A, ip.B, ip.C, ip.D
+ (int)settings.pingTimeout, ip.A, ip.B, ip.C, ip.D
);
return (system(cmd) == 0) ? true:false;
}
@@ -33,12 +34,15 @@ static size_t seeker (void) {
log_debug ("Debug: Pinging devices...\n");
for (int i=0 ; itext, strlen(msg->text), MSG_CONFIRM) == -1) {
+ size_t len = cMsg_cat (msg, tx_buffer);
+ if (send (sock, tx_buffer, len, MSG_CONFIRM) == -1) {
ret = false;
log_debug ("Debug: Sending failed\n");
break;
@@ -156,7 +161,7 @@ static status_t client (void) {
memset ((void*)&msg, 0, sizeof (msg)); // create a new message
cMsg_make (&msg.cMsg);
msg.sender = settings.me;
- log_debug ("Debug: Message created for %d\n", msg.cMsg.to);
+ log_msg_new (&msg);
statsUpdateCreate (&msg);
@@ -194,6 +199,8 @@ static status_t client (void) {
}
}
msgList_release (); // Unlock resources
+ if (statsPrint (&stats) == MSG_ERROR)
+ log_error ("Error: Writing to statistics file failed\n");
}
return MSG_ERROR;
}
diff --git a/src/client.h b/src/client.h
old mode 100755
new mode 100644
diff --git a/src/core.c b/src/core.c
old mode 100755
new mode 100644
index 2244912..4a8917a
--- a/src/core.c
+++ b/src/core.c
@@ -60,8 +60,9 @@ devIP_t addr2ip (in_addr_t in_addr) {
//! log API
//! @{
-static char_t* _frm_msg_io = "dev=%d, message: from=%d, to=%d, timestamp=%lld, text=%s";
-static char_t* _frm_msg_new = "new message: from=%d, to=%d, timestamp=%lld, text=%s";
+static char_t* _frm_msg_io = "dev=%d, message: from=%d, to=%d, timestamp=%lld, text=%s\n";
+static char_t* _frm_msg_new = "new message: from=%d, to=%d, timestamp=%lld, text=%s\n";
+#define _HEAD_SIZE 25
status_t log_init (void) {
if (pthread_mutex_init(&lock_stderr, NULL) != 0) {
@@ -77,9 +78,9 @@ status_t log_init (void) {
void log_msg_io (msg_t* msg) {
if (settings.outLevel >= OUTLEVEL_1) {
- char_t head[16];
- strncpy (head, cMsg_getText(&msg->cMsg), sizeof(head));
- head[16] = 0;
+ char_t head[_HEAD_SIZE];
+ memcpy (head, msg->cMsg.text, (_HEAD_SIZE-1));
+ head[_HEAD_SIZE-1] = 0;
pthread_mutex_lock(&lock_stdout);
fprintf (stdout, _frm_msg_io,
msg->sender,
@@ -95,9 +96,9 @@ void log_msg_io (msg_t* msg) {
void log_msg_new (msg_t* msg) {
if (settings.outLevel >= OUTLEVEL_1) {
- char_t head[16];
- strncpy (head, cMsg_getText(&msg->cMsg), sizeof(head));
- head[16] = 0;
+ char_t head[_HEAD_SIZE];
+ memcpy (head, msg->cMsg.text, (_HEAD_SIZE-1));
+ head[_HEAD_SIZE-1] = 0;
pthread_mutex_lock(&lock_stdout);
fprintf (stdout, _frm_msg_new,
cMsg_getFrom (&msg->cMsg),
@@ -145,21 +146,43 @@ void log_error (const char *fmt, ...) {
*/
void cMsg_make (cMsg_t* msg) {
static int msgID =0; // unique msg ID
-
msg->from = settings.me; // from me
- msg->to = devList[rand()%AEMLIST_SIZE].dev; // randomly select device
- msg->ts = time(NULL);
+ do {
+ // randomly select recipient device
+ msg->to = devList[rand() % AEMLIST_SIZE].dev;
+ } while (msg->to == settings.me);
+ msg->ts = time(NULL);
// stream the first fields and take the quote text iterator
- msg->text_it = sprintf (msg->text, "%d_%d_%lld_",
- msg->from,
- msg->to,
- msg->ts
- );
- // stream out the quote with a unique ID
- sprintf (&msg->text[msg->text_it], MESSAGE_BODY" #%d", msgID++);
+ sprintf (msg->text, "%s #%d", MESSAGE_BODY, msgID++);
}
+size_t cMsg_cat (cMsg_t* msg, char_t* buffer) {
+ return sprintf (buffer, "%d_%d_%lld_%s",
+ msg->from,
+ msg->to,
+ msg->ts,
+ msg->text
+ );
+}
+
+char_t* _strtok (char_t* str, char_t c, size_t max) {
+ static char_t* last = NULL;
+ char_t* ret = str;
+
+ // init last
+ if (str != NULL) last = str;
+
+ // loop
+ for (size_t i=0 ; i MSG_TEXT_SIZE)
return MSG_ERROR;
- int d =0;
- for (size_t i =0; rawMsg[i] && itext, rawMsg);
// Parse message
- char_t del[2] = {MSG_DELIMITER, '\0'};
- char_t* tok;
+ char_t* rest = rawMsg;
+ char_t* tok[4];
+ bool_t done = true;
- tok = strtok (cMsg->text, del);
- cMsg->from = atoi (tok);
+ for (size_t i =0; i < 3; ++i) {
+ tok[i] = _strtok (rest, MSG_DELIMITER, size);
- tok = strtok(NULL, del);
- cMsg->to = atoi (tok);
+ if (tok[i] == NULL) {
+ done = false;
+ break;
+ }
+ else {
+ int l = strlen(rest);
+ rest += l + 1;
+ size -= l + 1;
+ }
+ }
+ tok[3] = rest;
- tok = strtok(NULL, del);
- cMsg->ts = atoll (tok);
+ if (done) {
+ cMsg->from = atoi (tok[0]);
+ cMsg->to = atoi (tok[1]);
+ cMsg->ts = atoi (tok[2]);
+ strcpy (cMsg->text, tok[3]);
+ return MSG_OK;
+ }
- tok = strtok(NULL, del);
- cMsg->text_it = tok - cMsg->text;
-
- return MSG_OK;
+ return MSG_ERROR;
}
/*! getter for cMsg_t member fromAEM */
@@ -212,7 +238,7 @@ uint32_t cMsg_getTo(cMsg_t* cMsg) { return cMsg->to; }
/*! getter for cMsg_t member fromAEM */
uint64_t cMsg_getTs(cMsg_t* cMsg) { return cMsg->ts; }
/*! getter for payload text member */
-char_t* cMsg_getText(cMsg_t* cMsg) { return (char_t*)& cMsg->text[cMsg->text_it]; }
+char_t* cMsg_getText(cMsg_t* cMsg) { return cMsg->text; }
/*!
* Predicate to check core message equality
@@ -224,7 +250,7 @@ bool_t cMsg_equal (cMsg_t* m1, cMsg_t* m2) {
if (m1->from != m2->from) return false;
if (m1->to != m2->to) return false;
if (m1->ts != m2->ts) return false;
- if (strncmp (cMsg_getText(m1), cMsg_getText(m2), sizeof(m1->text)))
+ if (strncmp (m1->text, m2->text, sizeof(m1->text)))
return false;
return true;
}
@@ -235,7 +261,7 @@ bool_t cMsg_equal (cMsg_t* m1, cMsg_t* m2) {
*/
//! @{
void msg_init (msg_t* msg) {
- memset ((void*)msg, 0, sizeof(msg_t));
+ memset ((void*)msg, 0, sizeof(msg));
}
//! @}
@@ -390,30 +416,38 @@ void statsUpdateCreate (msg_t* msg) {
++stats.myMsg;
// average message size
- uint32_t saved = stats.totalMsg - stats.duplicateMsg;
- stats.avMsgSize += strlen(cMsg_getText(&msg->cMsg)) / (saved -1);
- stats.avMsgSize *= (saved-1)/saved;
-
+ int32_t saved = stats.totalMsg - stats.duplicateMsg;
+ if ((saved-1) > 0) {
+ int32_t l = strlen(msg->cMsg.text);
+ stats.avMsgSize += l / (fpdata_t)(saved -1);
+ stats.avMsgSize *= (fpdata_t)(saved-1)/saved;
+ }
pthread_mutex_unlock (&lock_stats);
}
void statsUpdateIn (msg_t* msg, bool_t dup) {
pthread_mutex_lock (&lock_stats);
- bool_t forMe;
+ bool_t forMe = msg->cMsg.to == settings.me;
stats.totalMsg++;
stats.duplicateMsg += (dup) ? 1:0;
- stats.forMeMsg += ((forMe = msg->cMsg.to == settings.me)) ? 1:0;
+ stats.forMeMsg += (forMe) ? 1:0;
stats.inDirectMsg += (forMe && (msg->cMsg.from == msg->sender)) ? 1:0;
// averages
- uint32_t saved = stats.totalMsg - stats.duplicateMsg;
- stats.avMsgSize += strlen(cMsg_getText(&msg->cMsg)) / (saved -1);
- stats.avMsgSize *= (saved-1)/saved;
+ int32_t saved = stats.totalMsg - stats.duplicateMsg;
+ if ((saved-1) > 0) {
+ int32_t l = strlen(msg->cMsg.text);
+ stats.avMsgSize += l / (fpdata_t)(saved -1);
+ stats.avMsgSize *= (fpdata_t)(saved-1)/saved;
- if (settings.trackTime) {
- stats.avTimeToMe += ((tstamp_t)time(NULL) - msg->cMsg.ts) / (saved -1);
- stats.avTimeToMe *= (saved-1)/saved;
+ if (settings.trackTime) {
+ tstamp_t dt = (tstamp_t)time(NULL) - msg->cMsg.ts;
+ if (dt < 0)
+ dt = 0;
+ stats.avTimeToMe += dt / (fpdata_t)(saved -1);
+ stats.avTimeToMe *= (fpdata_t)(saved-1)/saved;
+ }
}
pthread_mutex_unlock (&lock_stats);
}
@@ -424,5 +458,29 @@ void statsUpdateOut (msg_t* msg, devAEM_t dev) {
pthread_mutex_unlock (&lock_stats);
}
+status_t statsPrint (stats_t* stats) {
+ FILE* fp = fopen ("statistics.txt", "w");
+ if (fp == NULL) {
+ fclose (fp);
+ return MSG_ERROR;
+ }
+ fprintf (fp, "\nStatistics\n");
+ fprintf (fp, " total messages: %d\n", stats->totalMsg);
+ fprintf (fp, " duplicate messages: %d\n", stats->duplicateMsg);
+ fprintf (fp, " messages for me: %d\n", stats->forMeMsg);
+ fprintf (fp, " messages by me: %d\n",stats->myMsg);
+ fprintf (fp, " In messages direct for me: %d\n", stats->inDirectMsg);
+ fprintf (fp, " Out direct messages: %d\n", stats->outDirectMsg);
+ fprintf (fp, " Average message size: %g\n", stats->avMsgSize);
+ fprintf (fp, " Average time to me: %g\n", stats->avTimeToMe);
+
+ for (size_t i =0 ; i
#include
#include
+#include
+#include
#include
#include "listener.h"
@@ -13,7 +15,7 @@
//! @{
settings_t settings_init (settings);
-devList_t devList_init (devList[AEMLIST_SIZE]);
+devList_t devList_init(devList[AEMLIST_SIZE]);
stats_t stats;
//! @}
@@ -21,16 +23,15 @@ stats_t stats;
/*!
* CLI short options
*/
-const char *short_opt = "nd:i:l:p:s:w:th";
+const char *short_opt = "li:v:p:s:w:th";
/*!
* CLI long options
*/
const struct option long_opt[] = {
- {"port", required_argument, NULL, 'n'},
- {"duration", required_argument, NULL, 'd'},
+ {"port", required_argument, NULL, 'l'},
{"interval", required_argument, NULL, 'i'},
- {"outlevel", required_argument, NULL, 'l'},
+ {"outlevel", required_argument, NULL, 'v'},
{"pingtimeout",required_argument, NULL, 'p'},
{"sendtimeout",required_argument, NULL, 's'},
{"who", required_argument, NULL, 'w'},
@@ -39,6 +40,13 @@ const struct option long_opt[] = {
{NULL, 0, NULL, 0}
};
+//// Interrupt handler
+//void intHandler(int dummy) {
+// (void)dummy;
+// statsPrint (&stats);
+// exit (0);
+//}
+
/*!
* \brief
* Parse input argument and fill the kcli_input_t struct
@@ -57,10 +65,9 @@ int parse_args (settings_t *s, int argc, char const *argv[]) {
case -1: /* no more arguments */
case 0: /* long options toggles */
break;
- case 'n': s->port = atoi(optarg); break;
- case 'd': s->duration = atoi (optarg); break;
+ case 'l': s->port = atoi(optarg); break;
case 'i': s->msgInterval = atoi (optarg); break;
- case 'l':
+ case 'v':
s->outLevel = atoi (optarg);
if (s->outLevel >= OUTLEVEL_2) s->outLevel = OUTLEVEL_2;
if (s->outLevel < OUTLEVEL_0) s->outLevel = OUTLEVEL_0;
@@ -69,7 +76,7 @@ int parse_args (settings_t *s, int argc, char const *argv[]) {
case 's': s->sendTimeout.tv_sec = atoi (optarg); break;
case 'w': s->me = atoi (optarg); break;
case 't': s->trackTime = true; break;
- case 'h': printf ("This will be the help text\n");
+ case 'h': printf ("This will be the help text\n"); break;
case ':':
default:
case '?':
@@ -89,6 +96,8 @@ int main(int argc, char const *argv[]) {
stats_init (&stats);
msgList_init (&msgList);
+// if (signal(SIGTERM, intHandler) == SIG_ERR) //catching interrupt
+// log_error("Error: Can not catch SIGINT\n");
// Create threads
pthread_t ptL, ptC;
pthread_create (&ptL, NULL, pthListener, NULL);
diff --git a/src/messenger.c b/src/messenger.c
old mode 100644
new mode 100755
diff --git a/src/msg_impl.h b/src/msg_impl.h
old mode 100755
new mode 100644
index c19465d..8cae98d
--- a/src/msg_impl.h
+++ b/src/msg_impl.h
@@ -19,18 +19,19 @@
/*!
* AEM list
*/
-#define AEMLIST_SIZE (9)
+#define AEMLIST_SIZE (10)
#define devList_init(l) l = { \
- { 10, 0}, \
- { 43, 0}, \
- { 7200, 0}, \
- { 7300, 0}, \
- { 8000, 0}, \
- { 8765, 0}, \
- { 8844, 0}, \
- { 8855, 0}, \
- { 8997, 0} \
+ { 7700, 0, 0, 0}, \
+ { 8000, 0, 0, 0}, \
+ { 8765, 0, 0, 0}, \
+ { 8844, 0, 0, 0}, \
+ { 8880, 0, 0, 0}, \
+ { 8861, 0, 0, 0}, \
+ { 8877, 0, 0, 0}, \
+ { 8941, 0, 0, 0}, \
+ { 8934, 0, 0, 0}, \
+ { 8997, 0, 0, 0} \
}
/*!
@@ -42,8 +43,8 @@
#define DEVICE_LIST_SIZE 100 //!< Maximum size of the device list
#define MSG_DELIMITER '_' //!< Message delimiter
-#define ADHOC_NET_A 192 //!< [A.B.C.D]
-#define ADHOC_NET_B 168
+#define ADHOC_NET_A 10 //!< [A.B.C.D]
+#define ADHOC_NET_B 0
#define ADHOC_NET_C 0
#define ADHOC_NET_D 0
@@ -93,6 +94,8 @@ typedef struct timeval timeval_t;
typedef struct {
devAEM_t dev;
bool_t onRange;
+ tstamp_t begin;
+ tstamp_t end;
} devList_t;
extern devList_t devList[];
@@ -114,7 +117,6 @@ typedef struct {
devAEM_t from; //!< sender's AEM
devAEM_t to; //!< destination AEM
tstamp_t ts; //!< UNIX timestamp compatible
- size_t text_it; //!< text offset
char_t text[MSG_TEXT_SIZE]; //!< The actual message stream
} cMsg_t;
@@ -200,7 +202,7 @@ typedef struct {
uint32_t outDirectMsg; //!< Outgoing messages from me for the recipient
fpdata_t avMsgSize; //!< average message payload size
- time_t avTimeToMe; //!< average time to me
+ fpdata_t avTimeToMe; //!< average time to me
} stats_t;
extern stats_t stats;
@@ -215,7 +217,6 @@ typedef enum {
typedef struct {
devAEM_t me;
uint16_t port;
- time_t duration;
time_t msgInterval;
outLevel_en outLevel;
time_t pingTimeout;
@@ -228,12 +229,11 @@ extern settings_t settings;
#define settings_init(s) s = { \
.me = 8997, \
.port = 2288, \
- .duration = 7200, \
- .msgInterval = 2, \
- .outLevel = OUTLEVEL_2, \
+ .msgInterval = 60, \
+ .outLevel = OUTLEVEL_1, \
.pingTimeout = 1, \
- .sendTimeout = {5, 0}, \
- .trackTime = false \
+ .sendTimeout = {4, 0}, \
+ .trackTime = true \
}
//! @}