COMPONENT=TestCollectionAppC
CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/universal
+
CFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/net/
-CFLAGS += -I$(TOSDIR)/lib/net/ -I$(TOSDIR)/lib/net/ctp -I$(TOSDIR)/lib/net/4bitle
+CFLAGS += -I$(TOSDIR)/lib/net/
+
+CFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/net/ctp
+CFLAGS += -I$(TOSDIR)/lib/net/ctp -I$(TOSDIR)/lib/net/4bitle
include $(MAKERULES)
MainC,
BlockingSerialActiveMessageC,
new BlockingSerialAMSenderC(AM_OSCILLOSCOPE);
+
TestCollectionC.MainThread -> MainThread;
TestCollectionC.Boot -> MainC;
barrier_reset(&send_barrier, NUM_SENSORS+1);
barrier_reset(&sense_barrier, NUM_SENSORS+1);
sensor_data = radioGetPayload(&send_msg, sizeof(sensor_data_t));
- //sensor_data->seq_no = 0;
- __nesc_hton_uint32((unsigned char *)&sensor_data->seq_no, (unsigned long )0);
+ sensor_data->seq_no = 0;
amRadioStart();
tosthread_create(&humidity, humidity_thread, NULL, 200);
for(;;) {
(*read)(&val);
mutex_lock(&data_mutex);
- // *nx_val = val;
- __nesc_hton_uint16((unsigned char *)&*nx_val, val);
+ *nx_val = val;
mutex_unlock(&data_mutex);
barrier_block(&send_barrier);
barrier_block(&sense_barrier);
read_sensor(hamamatsuS1087_par_read, &(sensor_data->par));
}
void send_thread(void* arg) {
- //Only needed for nesC magic.... I hate this hack.....
- unsigned long __nesc_temp43;
- unsigned char *__nesc_temp42;
-
for(;;) {
barrier_block(&send_barrier);
barrier_reset(&send_barrier, NUM_SENSORS + 1);
if(amRadioSend(AM_BROADCAST_ADDR, &send_msg, sizeof(sensor_data_t), AM_SENSOR_DATA_MSG) == SUCCESS) {
- //sensor_data->seq_no++;
- (__nesc_temp42 = (unsigned char *)&sensor_data->seq_no, __nesc_hton_uint32(__nesc_temp42, (__nesc_temp43 = __nesc_ntoh_uint32(__nesc_temp42)) + 1), __nesc_temp43);
+ sensor_data->seq_no++;
led0Toggle();
}
//tosthread_sleep(SAMPLING_PERIOD);
barrier_reset(&send_barrier, NUM_SENSORS+1);
barrier_reset(&sense_barrier, NUM_SENSORS+1);
- __nesc_hton_uint32((unsigned char *)&storing_sensor_data.seq_no, (unsigned long )0);
+ storing_sensor_data.seq_no = 0;
amRadioStart();
led0Toggle();
for(;;) {
(*read)(&val);
mutex_lock(&data_mutex);
- // *nx_val = val;
- __nesc_hton_uint16((unsigned char *)&*nx_val, val);
+ *nx_val = val;
mutex_unlock(&data_mutex);
barrier_block(&send_barrier);
barrier_block(&sense_barrier);
storage_len_t sensor_data_len;
bool sensor_records_lost;
- //Only needed for nesC magic.... I hate this hack.....
- unsigned long __nesc_temp43;
- unsigned char *__nesc_temp42;
-
for(;;) {
barrier_block(&send_barrier);
barrier_reset(&send_barrier, NUM_SENSORS + 1);
while( volumeLogAppend(VOLUME_SENSORLOG, &storing_sensor_data, &sensor_data_len, &sensor_records_lost) != SUCCESS );
mutex_unlock(&log_mutex);
- //storing_sensor_data.seq_no++
- (__nesc_temp42 = (unsigned char *)&storing_sensor_data.seq_no, __nesc_hton_uint32(__nesc_temp42, (__nesc_temp43 = __nesc_ntoh_uint32(__nesc_temp42)) + 1), __nesc_temp43);
+ storing_sensor_data.seq_no++;
led0Toggle();
//tosthread_sleep(SAMPLING_PERIOD);
barrier_reset(&send_barrier, NUM_SENSORS+1);
barrier_reset(&sense_barrier, NUM_SENSORS+1);
sending_sensor_data = radioGetPayload(&send_msg, sizeof(sensor_data_t));
- //storing_sensor_data->seq_no = 0;
- __nesc_hton_uint32((unsigned char *)&storing_sensor_data.seq_no, (unsigned long )0);
+ storing_sensor_data.seq_no = 0;
amRadioStart();
led0Toggle();
for(;;) {
(*read)(&val);
mutex_lock(&data_mutex);
- // *nx_val = val;
- __nesc_hton_uint16((unsigned char *)&*nx_val, val);
+ *nx_val = val;
mutex_unlock(&data_mutex);
barrier_block(&send_barrier);
barrier_block(&sense_barrier);
storage_len_t sensor_data_len;
bool sensor_records_lost;
- //Only needed for nesC magic.... I hate this hack.....
- unsigned long __nesc_temp43;
- unsigned char *__nesc_temp42;
-
for(;;) {
barrier_block(&send_barrier);
barrier_reset(&send_barrier, NUM_SENSORS + 1);
while( volumeLogAppend(VOLUME_SENSORLOG, &storing_sensor_data, &sensor_data_len, &sensor_records_lost) != SUCCESS );
mutex_unlock(&log_mutex);
- //storing_sensor_data.seq_no++
- (__nesc_temp42 = (unsigned char *)&storing_sensor_data.seq_no, __nesc_hton_uint32(__nesc_temp42, (__nesc_temp43 = __nesc_ntoh_uint32(__nesc_temp42)) + 1), __nesc_temp43);
+ storing_sensor_data.seq_no++;
led0Toggle();
//tosthread_sleep(SAMPLING_PERIOD);
TOSTHREAD_MAIN=TestCollection.c
+CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/universal
+
+CFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/net/
+CFLAGS += -I$(TOSDIR)/lib/net/
+
+CFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/net/ctp
+CFLAGS += -I$(TOSDIR)/lib/net/ctp -I$(TOSDIR)/lib/net/4bitle
+
include $(MAKERULES)
--- /dev/null
+/*
+ * Copyright (c) 2006 Intel Corporation
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached INTEL-LICENSE
+ * file. If you do not find these files, copies can be found by writing to
+ * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA,
+ * 94704. Attention: Intel License Inquiry.
+ */
+
+/**
+ * @author David Gay
+ * @author Kyle Jamieson
+ */
+
+#ifndef MULTIHOP_OSCILLOSCOPE_H
+#define MULTIHOP_OSCILLOSCOPE_H
+
+enum {
+ /* Number of readings per message. If you increase this, you may have to
+ increase the message_t size. */
+ NREADINGS = 5,
+ /* Default sampling period. */
+ DEFAULT_INTERVAL = 1024,
+ AM_OSCILLOSCOPE = 0x93
+};
+
+typedef nx_struct oscilloscope {
+ nx_uint16_t version; /* Version of the interval. */
+ nx_uint16_t interval; /* Samping period. */
+ nx_uint16_t id; /* Mote id of sending mote. */
+ nx_uint16_t count; /* The readings are samples count * NREADINGS onwards */
+ nx_uint16_t readings[NREADINGS];
+} oscilloscope_t;
+
+#endif
/*
- * Copyright (c) 2008 Johns Hopkins University.
+ * Copyright (c) 2008 Stanford University.
* All rights reserved.
*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose, without fee, and without written
- * agreement is hereby granted, provided that the above copyright
- * notice, the (updated) modification history and the author appear in
- * all copies of this source code.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the
+ * distribution.
+ * - Neither the name of the Stanford University nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA,
- * OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
-*/
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD
+ * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
/**
- * @author Chieh-Jan Mike Liang <cliang4@cs.jhu.edu>
+ * @author Kevin Klues <klueska@cs.stanford.edu>
*/
#include "tosthread.h"
+#include "tosthread_amradio.h"
+#include "tosthread_amserial.h"
+#include "tosthread_leds.h"
+#include "tosthread_collection.h"
+#include "tosthread_sinesensor.h"
+#include "MultihopOscilloscope.h"
+
+void fatal_problem();
+void report_problem();
+void report_sent();
+void report_received();
+
+oscilloscope_t local;
+uint8_t reading = 0; /* 0 to NREADINGS */
+message_t sendbuf;
+message_t recvbuf;
+
+void tosthread_main(void* arg) {
+ local.interval = DEFAULT_INTERVAL;
+ local.id = TOS_NODE_ID;
+ local.version = 0;
+
+ while ( amRadioStart() != SUCCESS );
+ while ( collectionRoutingStart() != SUCCESS );
+
+ if (local.id % 500 == 0) {
+ while ( amSerialStart() != SUCCESS);
+ collectionSetRoot();
+ for (;;) {
+ if ( collectionReceive(&recvbuf, 0, AM_OSCILLOSCOPE) == SUCCESS) {
+ amSerialSend(AM_BROADCAST_ADDR, &recvbuf, sizeof(local), AM_OSCILLOSCOPE);
+ report_received();
+ }
+ }
+ } else {
+ uint16_t var;
+
+ for (;;) {
+ if (reading == NREADINGS) {
+ oscilloscope_t *o = o;
+ o = (oscilloscope_t *) collectionGetPayload(&sendbuf, sizeof(oscilloscope_t));
+ if (o == NULL) {
+ fatal_problem();
+ return;
+ }
+ memcpy(o, &local, sizeof(local));
+ if (collectionSend(&sendbuf, sizeof(local), AM_OSCILLOSCOPE) == SUCCESS) {
+ report_sent();
+ } else {
+ report_problem();
+ }
+
+ reading = 0;
+ }
+
+ if (sinesensor_read(&var) == SUCCESS) {
+ local.readings[reading++] = var;
+ }
+
+ tosthread_sleep(local.interval);
+ }
+ }
+}
+
+// Use LEDs to report various status issues.
+void fatal_problem() {
+ led0On();
+ led1On();
+ led2On();
+}
-void tosthread_main(void* arg) {}
+void report_problem() { led0Toggle(); }
+void report_sent() { led1Toggle(); }
+void report_received() { led2Toggle(); }