changeset 15:901d205d1a3c

Updated to latest PRU library; external PRU file no longer needed. Also catch SIGTERM as well as SIGINT to clean up gracefully.
author andrewm
date Sat, 07 Feb 2015 16:41:56 +0000
parents 06f93bef7dd2
children 670be80463a3 0d80ff9e2227
files .cproject core/PRU.cpp core/RTAudio.cpp include/GPIOcontrol.h include/PRU.h include/pru_rtaudio_bin.h include/pruss_intc_mapping.h include/prussdrv.h libprussdrv.a projects/audio_in_FFT/main.cpp projects/basic/main.cpp projects/basic_analog_output/main.cpp projects/basic_passthru/main.cpp projects/basic_sensor/main.cpp projects/d-box/DboxSensors.cpp projects/d-box/DboxSensors.h projects/d-box/I2c_TouchKey.cpp projects/d-box/I2c_TouchKey.h projects/d-box/main.cpp projects/d-box/sensors.cpp projects/d-box/sensors.h projects/filter_FIR/main.cpp projects/filter_IIR/main.cpp projects/oscillator_bank/main.cpp projects/samples/main.cpp projects/tank_wars/main.cpp
diffstat 25 files changed, 733 insertions(+), 112 deletions(-) [+]
line wrap: on
line diff
--- a/.cproject	Fri Jan 23 15:35:10 2015 +0000
+++ b/.cproject	Sat Feb 07 16:41:56 2015 +0000
@@ -73,7 +73,7 @@
 					<sourceEntries>
 						<entry excluding="audio_routines_old.S" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="core"/>
 						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="include"/>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="projects/basic"/>
+						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="projects/basic_analog_output"/>
 					</sourceEntries>
 				</configuration>
 			</storageModule>
@@ -147,7 +147,7 @@
 					<sourceEntries>
 						<entry excluding="audio_routines_old.S" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="core"/>
 						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="include"/>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="projects/basic"/>
+						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="projects/basic_analog_output"/>
 					</sourceEntries>
 				</configuration>
 			</storageModule>
--- a/core/PRU.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/core/PRU.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -18,6 +18,7 @@
 #include "../include/pruss_intc_mapping.h"
 #include "../include/GPIOcontrol.h"
 #include "../include/render.h"
+#include "../include/pru_rtaudio_bin.h"
 
 #include <iostream>
 #include <stdlib.h>
@@ -249,7 +250,7 @@
 
     /* Allocate and initialize memory */
     prussdrv_init();
-    if(prussdrv_open(PRU_EVTOUT_0)) {
+    if(prussdrv_open(pru_number == 0 ? PRU_EVTOUT_0 : PRU_EVTOUT_1)) {
     	rt_printf("Failed to open PRU driver\n");
     	return 1;
     }
@@ -331,14 +332,17 @@
 }
 
 // Run the code image in the specified file
-int PRU::start(char * const filename)
+int PRU::start()
 {
 	/* Clear any old interrupt */
-	prussdrv_pru_clear_event(pru_number == 0 ? PRU0_ARM_INTERRUPT : PRU1_ARM_INTERRUPT);
+	if(pru_number == 0)
+		prussdrv_pru_clear_event(PRU_EVTOUT_0, PRU0_ARM_INTERRUPT);
+	else
+		prussdrv_pru_clear_event(PRU_EVTOUT_1, PRU1_ARM_INTERRUPT);
 
     /* Load and execute binary on PRU */
-    if(prussdrv_exec_program(pru_number, filename)) {
-    	rt_printf("Failed to execute PRU code from %s\n", filename);
+	if(prussdrv_exec_code(pru_number, PRUcode, sizeof(PRUcode))) {
+    	rt_printf("Failed to execute PRU code\n");
     	return 1;
     }
 
@@ -450,8 +454,11 @@
 {
 	if(!running)
 		return;
-    prussdrv_pru_wait_event (PRU_EVTOUT_0);
-    prussdrv_pru_clear_event(pru_number == 0 ? PRU0_ARM_INTERRUPT : PRU1_ARM_INTERRUPT);
+    prussdrv_pru_wait_event (pru_number == 0 ? PRU_EVTOUT_0 : PRU_EVTOUT_1);
+	if(pru_number == 0)
+		prussdrv_pru_clear_event(PRU_EVTOUT_0, PRU0_ARM_INTERRUPT);
+	else
+		prussdrv_pru_clear_event(PRU_EVTOUT_1, PRU1_ARM_INTERRUPT);
 }
 
 // Turn off the PRU when done
--- a/core/RTAudio.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/core/RTAudio.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -57,7 +57,6 @@
 
 // general settings
 int gRTAudioVerbose = 0;   						// Verbosity level for debugging
-char gPRUFilename[256]	 = "pru_rtaudio.bin"; 	// path to PRU binary file
 int gAmplifierMutePin = -1;
 int gAmplifierShouldBeginMuted = 0;
 
@@ -209,8 +208,8 @@
 		gShouldStop = 1;
 	}
 	else {
-		if(gPRU->start(gPRUFilename)) {
-			rt_printf("Error: unable to start PRU from file %s\n", gPRUFilename);
+		if(gPRU->start()) {
+			rt_printf("Error: unable to start PRU\n");
 			gShouldStop = 1;
 		}
 		else {
--- a/include/PRU.h	Fri Jan 23 15:35:10 2015 +0000
+++ b/include/PRU.h	Sat Feb 07 16:41:56 2015 +0000
@@ -36,8 +36,8 @@
 	int initialise(int pru_num, int frames_per_buffer, int spi_channels,
 				   bool xenomai_test_pin = false);
 
-	// Run the code image in the specified file
-	int start(char * const filename);
+	// Run the code image in pru_rtaudio_bin.h
+	int start();
 
 	// Loop: read and write data from the PRU
 	void loop();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/pru_rtaudio_bin.h	Sat Feb 07 16:41:56 2015 +0000
@@ -0,0 +1,531 @@
+
+
+/* This file contains the PRU instructions in a C array which are to  */
+/* be downloaded from the host CPU to the PRU instruction memory.     */
+/* This file is generated by the PRU assembler.                       */
+
+const unsigned int PRUcode[] =  {
+     0x240002c3,
+     0x24202083,
+     0x240000e2,
+     0xe1002382,
+     0x240002c3,
+     0x24202883,
+     0x240120e2,
+     0xe1002382,
+     0x240001d9,
+     0x24000099,
+     0x244803da,
+     0x2401009a,
+     0x244803dd,
+     0x2480009d,
+     0x91042480,
+     0x1d04e0e0,
+     0x81042480,
+     0x240000f8,
+     0x240008e9,
+     0xf1243982,
+     0x5100e202,
+     0x1f01f8f8,
+     0xc901f868,
+     0xf1283989,
+     0x6108e903,
+     0x240008e9,
+     0x79000005,
+     0x6104e903,
+     0x240004e9,
+     0x79000002,
+     0x240002e9,
+     0x240002e2,
+     0x2444e0c3,
+     0x24004c83,
+     0xe1002382,
+     0x240002e2,
+     0xe1103a82,
+     0xf1143a82,
+     0xcf00e2ff,
+     0x240000e2,
+     0xe1343a82,
+     0xe1483a82,
+     0x240000e2,
+     0xe1283a82,
+     0x241801c2,
+     0x240fc582,
+     0xe12c3a82,
+     0x241801c2,
+     0x24078482,
+     0xe1403a82,
+     0x240001e2,
+     0xe1343a82,
+     0xe1483a82,
+     0x240700c2,
+     0x24000082,
+     0x240020fb,
+     0x2444e0dc,
+     0x2471909c,
+     0xe1003c9b,
+     0xe1383a82,
+     0xf1303a9b,
+     0xcf00fbff,
+     0x240020fb,
+     0x2444e0dc,
+     0x2471949c,
+     0xe1003c9b,
+     0xf13c3a9b,
+     0x24f120e2,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1909c,
+     0xe1003c9b,
+     0xe14c3a82,
+     0xf1443a9b,
+     0xcf00fbff,
+     0xf1503a82,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1949c,
+     0xe1003c9b,
+     0x240800c2,
+     0x24000182,
+     0x240020fb,
+     0x2444e0dc,
+     0x2471909c,
+     0xe1003c9b,
+     0xe1383a82,
+     0xf1303a9b,
+     0xcf00fbff,
+     0x240020fb,
+     0x2444e0dc,
+     0x2471949c,
+     0xe1003c9b,
+     0xf13c3a9b,
+     0x24f120e2,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1909c,
+     0xe1003c9b,
+     0xe14c3a82,
+     0xf1443a9b,
+     0xcf00fbff,
+     0xf1503a82,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1949c,
+     0xe1003c9b,
+     0x24f320e2,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1909c,
+     0xe1003c9b,
+     0xe14c3a82,
+     0xf1443a9b,
+     0xcf00fbff,
+     0xf1503a82,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1949c,
+     0xe1003c9b,
+     0x240000fb,
+     0xe1443d9b,
+     0x240000fb,
+     0x240180fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240000fb,
+     0x240184fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240000fb,
+     0x240188fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240000fb,
+     0x24018cfc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240000fb,
+     0x240190fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240000fb,
+     0x240194fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240002fb,
+     0xe1043d9b,
+     0x240000fb,
+     0xe1103d9b,
+     0x240800db,
+     0x2400049b,
+     0xe1143d9b,
+     0x240000fb,
+     0xe14c3d9b,
+     0x240000fb,
+     0xe1503d9b,
+     0x24fffffb,
+     0xe1643d9b,
+     0x24807cfb,
+     0xe1683d9b,
+     0x240100fb,
+     0xe16c3d9b,
+     0x240080fb,
+     0xe1703d9b,
+     0x248001fb,
+     0xe1743d9b,
+     0x240003fb,
+     0xe1783d9b,
+     0x240000fb,
+     0xe17c3d9b,
+     0x24fffffb,
+     0xe1a43d9b,
+     0x24807cfb,
+     0xe1a83d9b,
+     0x240100fb,
+     0xe1ac3d9b,
+     0x240000fb,
+     0xe1b03d9b,
+     0x248001fb,
+     0xe1b43d9b,
+     0x240003fb,
+     0xe1b83d9b,
+     0x240000fb,
+     0xe1bc3d9b,
+     0x240002fb,
+     0x240180fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240001fb,
+     0x240188fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240000fb,
+     0x241000fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240000fb,
+     0x241008fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x2400fffb,
+     0xe1c03d9b,
+     0x2400fffb,
+     0xe1803d9b,
+     0x240002fb,
+     0xf1603d9c,
+     0x12fbfcfc,
+     0xe1603d9c,
+     0xf1603d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0x240200fb,
+     0xf1a03d9c,
+     0x12fbfcfc,
+     0xe1a03d9c,
+     0xf1a03d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0x241000c2,
+     0x24000082,
+     0x244804c3,
+     0x24c19483,
+     0xe1002382,
+     0x240001c2,
+     0x2486a082,
+     0x0501e2e2,
+     0x6f00e2ff,
+     0x241000c2,
+     0x24000082,
+     0x244804c3,
+     0x24c19083,
+     0xe1002382,
+     0x240001fb,
+     0xf1603d9c,
+     0x12fbfcfc,
+     0xe1603d9c,
+     0xf1603d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0x240100fb,
+     0xf1a03d9c,
+     0x12fbfcfc,
+     0xe1a03d9c,
+     0xf1a03d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0x240004fb,
+     0xf1603d9c,
+     0x12fbfcfc,
+     0xe1603d9c,
+     0xf1603d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0x240400fb,
+     0xf1a03d9c,
+     0x12fbfcfc,
+     0xe1a03d9c,
+     0xf1a03d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0x240008fb,
+     0xf1603d9c,
+     0x12fbfcfc,
+     0xe1603d9c,
+     0xf1603d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0x240800fb,
+     0xf1a03d9c,
+     0x12fbfcfc,
+     0xe1a03d9c,
+     0xf1a03d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0x240000fb,
+     0x240208fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0x240010fb,
+     0xf1603d9c,
+     0x12fbfcfc,
+     0xe1603d9c,
+     0xf1603d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0x241000fb,
+     0xf1a03d9c,
+     0x12fbfcfc,
+     0xe1a03d9c,
+     0xf1a03d9c,
+     0x10fbfcfc,
+     0x5700fcfe,
+     0xf108398b,
+     0x240000f0,
+     0x0901ebf1,
+     0x2701e9e2,
+     0x08e2f1f1,
+     0x240000f4,
+     0x08e2ebf5,
+     0x1d00f8f8,
+     0x240000e2,
+     0xe1203982,
+     0xf1c03d82,
+     0xcf05e2ff,
+     0x240000fb,
+     0x240208fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0xf1803d82,
+     0xcf05e2ff,
+     0x240280fc,
+     0x00fcfdfc,
+     0xf1003c82,
+     0x10f0f0f2,
+     0x2701e9e2,
+     0x08e2ebf3,
+     0x0902f3f3,
+     0x00f2f3f3,
+     0x10f4f4f6,
+     0x08e2ebf7,
+     0x0901f7f7,
+     0x02f6f7f7,
+     0x240000ea,
+     0x240000e1,
+     0xc901f805,
+     0x90f2388c,
+     0x240000e2,
+     0x80f23882,
+     0x0104f2f2,
+     0xd102f808,
+     0x90f63c8e,
+     0x240000e2,
+     0x80f63c82,
+     0x0104f6f6,
+     0x24ffffe2,
+     0x10e2eee7,
+     0x79000002,
+     0x0b10eee7,
+     0xf1c03d82,
+     0xcf05e2ff,
+     0x10e7e7fb,
+     0x240208fc,
+     0x00fcfdfc,
+     0xe1003c9b,
+     0xd102f80a,
+     0x240000ef,
+     0xf1803d82,
+     0xcf05e2ff,
+     0x240280fc,
+     0x00fcfdfc,
+     0xf1003c83,
+     0x24ffffe2,
+     0x10e2e3ef,
+     0x7900000a,
+     0xf1803d82,
+     0xcf05e2ff,
+     0x240280fc,
+     0x00fcfdfc,
+     0xf1003c83,
+     0x0910e3e3,
+     0x12e3efef,
+     0x80f73c8f,
+     0x0104f7f7,
+     0xc901f85c,
+     0x24ffffe2,
+     0x10e2ece7,
+     0x0904e7e7,
+     0x240300c8,
+     0x24000088,
+     0x12e8e7e7,
+     0x0914e1e8,
+     0x12e8e7e7,
+     0x240020fb,
+     0x2444e0dc,
+     0x2471909c,
+     0xe1003c9b,
+     0xe1383a87,
+     0xf1303a9b,
+     0xcf00fbff,
+     0x240020fb,
+     0x2444e0dc,
+     0x2471949c,
+     0xe1003c9b,
+     0xf13c3a9b,
+     0x240000ed,
+     0x0102e1e8,
+     0x0501e9e7,
+     0x10e7e8e8,
+     0x0909e8e8,
+     0x24f120e7,
+     0x12e8e7e7,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1909c,
+     0xe1003c9b,
+     0xe14c3a87,
+     0xf1443a9b,
+     0xcf00fbff,
+     0xf1503a87,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1949c,
+     0xe1003c9b,
+     0x24ffffe2,
+     0x10e2e7ed,
+     0x0101e1e1,
+     0x0b10ece7,
+     0x0904e7e7,
+     0x240300c8,
+     0x24000088,
+     0x12e8e7e7,
+     0x0914e1e8,
+     0x12e8e7e7,
+     0x240020fb,
+     0x2444e0dc,
+     0x2471909c,
+     0xe1003c9b,
+     0xe1383a87,
+     0xf1303a9b,
+     0xcf00fbff,
+     0x240020fb,
+     0x2444e0dc,
+     0x2471949c,
+     0xe1003c9b,
+     0xf13c3a9b,
+     0x0102e1e8,
+     0x0501e9e7,
+     0x10e7e8e8,
+     0x0909e8e8,
+     0x24f120e7,
+     0x12e8e7e7,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1909c,
+     0xe1003c9b,
+     0xe14c3a87,
+     0xf1443a9b,
+     0xcf00fbff,
+     0xf1503a87,
+     0x240001db,
+     0x2400009b,
+     0x244804dc,
+     0x24c1949c,
+     0xe1003c9b,
+     0x0910e7e7,
+     0x12e7eded,
+     0x80f3388d,
+     0x0104f3f3,
+     0x1504f8f8,
+     0x0101e1e1,
+     0x6ee9e17f,
+     0x79000004,
+     0x1504f8f8,
+     0x0102e1e1,
+     0x6ee9e17b,
+     0x0101eaea,
+     0x6eebea78,
+     0x10f0f0e2,
+     0x10f1f1f0,
+     0x10e2e2f1,
+     0x10f4f4e2,
+     0x10f5f5f4,
+     0x10e2e2f5,
+     0x1501f8f8,
+     0x1101f8e2,
+     0xe1043982,
+     0xf1203982,
+     0x00ebe2e2,
+     0xe1203982,
+     0xf1183983,
+     0x5100e30d,
+     0x241000e1,
+     0x10e1e2e2,
+     0x5100e206,
+     0xf11c3982,
+     0x240194e1,
+     0x00e1e3e3,
+     0xe1002382,
+     0x79000005,
+     0xf11c3982,
+     0x240190e1,
+     0x00e1e3e3,
+     0xe1002382,
+     0xc900f807,
+     0x241000c2,
+     0x24000082,
+     0x244804c3,
+     0x24c19483,
+     0xe1002382,
+     0x79000006,
+     0x241000c2,
+     0x24000082,
+     0x244804c3,
+     0x24c19083,
+     0xe1002382,
+     0xf1003982,
+     0x5700e246,
+     0x240000fb,
+     0xe1443d9b,
+     0xc901f80c,
+     0x244803c3,
+     0x24012c83,
+     0xf1002382,
+     0x1d0de2e2,
+     0x1d1be2e2,
+     0xe1002382,
+     0x244803c3,
+     0x24013483,
+     0xf1002382,
+     0x1d01e2e2,
+     0xe1002382,
+     0x2400231f,
+     0x2a000000 };
+
--- a/include/pruss_intc_mapping.h	Fri Jan 23 15:35:10 2015 +0000
+++ b/include/pruss_intc_mapping.h	Sat Feb 07 16:41:56 2015 +0000
@@ -1,37 +1,37 @@
 /*
  * pruss_intc_mapping.h
- * 
+ *
  * Example PRUSS INTC mapping for the application
  *
- * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
- * 
- * 
- *  Redistribution and use in source and binary forms, with or without 
- *  modification, are permitted provided that the following conditions 
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ *
+ *  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 
+ *    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   
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the
  *    distribution.
  *
  *    Neither the name of Texas Instruments Incorporated 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 
+ *  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 
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *  OWNER OR 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 
+ *  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.
  *
 */
@@ -96,7 +96,7 @@
 
 
 #define PRUSS_INTC_INITDATA {   \
-{ PRU0_PRU1_INTERRUPT, PRU1_PRU0_INTERRUPT, PRU0_ARM_INTERRUPT, PRU1_ARM_INTERRUPT, ARM_PRU0_INTERRUPT, ARM_PRU1_INTERRUPT,  -1  },  \
+{ PRU0_PRU1_INTERRUPT, PRU1_PRU0_INTERRUPT, PRU0_ARM_INTERRUPT, PRU1_ARM_INTERRUPT, ARM_PRU0_INTERRUPT, ARM_PRU1_INTERRUPT,  (char)-1  },  \
 { {PRU0_PRU1_INTERRUPT,CHANNEL1}, {PRU1_PRU0_INTERRUPT, CHANNEL0}, {PRU0_ARM_INTERRUPT,CHANNEL2}, {PRU1_ARM_INTERRUPT, CHANNEL3}, {ARM_PRU0_INTERRUPT, CHANNEL0}, {ARM_PRU1_INTERRUPT, CHANNEL1},  {-1,-1}},  \
  {  {CHANNEL0,PRU0}, {CHANNEL1, PRU1}, {CHANNEL2, PRU_EVTOUT0}, {CHANNEL3, PRU_EVTOUT1}, {-1,-1} },  \
  (PRU0_HOSTEN_MASK | PRU1_HOSTEN_MASK | PRU_EVTOUT0_HOSTEN_MASK | PRU_EVTOUT1_HOSTEN_MASK) /*Enable PRU0, PRU1, PRU_EVTOUT0 */ \
--- a/include/prussdrv.h	Fri Jan 23 15:35:10 2015 +0000
+++ b/include/prussdrv.h	Sat Feb 07 16:41:56 2015 +0000
@@ -1,37 +1,37 @@
 /*
  * prussdrv.h
- * 
+ *
  * Describes PRUSS userspace driver for Industrial Communications
  *
- * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 
- * 
- * 
- *  Redistribution and use in source and binary forms, with or without 
- *  modification, are permitted provided that the following conditions 
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ *
+ *  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 
+ *    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   
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the
  *    distribution.
  *
  *    Neither the name of Texas Instruments Incorporated 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 
+ *  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 
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *  OWNER OR 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 
+ *  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.
  *
 */
@@ -49,7 +49,6 @@
 #define _PRUSSDRV_H
 
 #include <sys/types.h>
-#include <pthread.h>
 
 #if defined (__cplusplus)
 extern "C" {
@@ -65,6 +64,9 @@
 #define PRUSS0_PRU0_IRAM        2
 #define PRUSS0_PRU1_IRAM        3
 
+#define PRUSS_V1                1 // AM18XX
+#define PRUSS_V2                2 // AM33XX
+
 //Available in AM33xx series - begin
 #define PRUSS0_SHARED_DATARAM   4
 #define	PRUSS0_CFG              5
@@ -84,7 +86,6 @@
 #define PRU_EVTOUT_6            6
 #define PRU_EVTOUT_7            7
 
-    typedef void *(*prussdrv_function_handler) (void *);
     typedef struct __sysevt_to_channel_map {
         short sysevt;
         short channel;
@@ -103,56 +104,98 @@
         //Channel to Host map.Channels -Range: 0..9  HOSTs - Range:0..9
         //{-1, -1} indicates end of list
         tchannel_to_host_map channel_to_host_map[NUM_PRU_CHANNELS];
-        //10-bit mask - Enable Host0-Host9 {Host0/1:PRU0/1, Host2..9 : PRUEVT_OUT0..7)
+        //10-bit mask - Enable Host0-Host9 {Host0/1:PRU0/1, Host2..9 : PRUEVT_OUT0..7}
         unsigned int host_enable_bitmask;
     } tpruss_intc_initdata;
 
     int prussdrv_init(void);
 
-    int prussdrv_open(unsigned int pru_evtout_num);
+    int prussdrv_open(unsigned int host_interrupt);
+
+    /** Return version of PRU.  This must be called after prussdrv_open. */
+    int prussdrv_version();
+
+    /** Return string description of PRU version. */
+    const char* prussdrv_strversion(int version);
 
     int prussdrv_pru_reset(unsigned int prunum);
 
     int prussdrv_pru_disable(unsigned int prunum);
 
     int prussdrv_pru_enable(unsigned int prunum);
+    int prussdrv_pru_enable_at(unsigned int prunum, size_t addr);
 
     int prussdrv_pru_write_memory(unsigned int pru_ram_id,
                                   unsigned int wordoffset,
-                                  unsigned int *memarea,
+                                  const unsigned int *memarea,
                                   unsigned int bytelength);
 
-    int prussdrv_pruintc_init(tpruss_intc_initdata * prussintc_init_data);
+    int prussdrv_pruintc_init(const tpruss_intc_initdata *prussintc_init_data);
+
+    /** Find and return the channel a specified event is mapped to.
+     * Note that this only searches for the first channel mapped and will not
+     * detect error cases where an event is mapped erroneously to multiple
+     * channels.
+     * @return channel-number to which a system event is mapped.
+     * @return -1 for no mapping found
+     */
+    short prussdrv_get_event_to_channel_map( unsigned int eventnum );
+
+    /** Find and return the host interrupt line a specified channel is mapped
+     * to.  Note that this only searches for the first host interrupt line
+     * mapped and will not detect error cases where a channel is mapped
+     * erroneously to multiple host interrupt lines.
+     * @return host-interrupt-line to which a channel is mapped.
+     * @return -1 for no mapping found
+     */
+    short prussdrv_get_channel_to_host_map( unsigned int channel );
+
+    /** Find and return the host interrupt line a specified event is mapped
+     * to.  This first finds the intermediate channel and then the host.
+     * @return host-interrupt-line to which a system event is mapped.
+     * @return -1 for no mapping found
+     */
+    short prussdrv_get_event_to_host_map( unsigned int eventnum );
 
     int prussdrv_map_l3mem(void **address);
 
     int prussdrv_map_extmem(void **address);
 
+    unsigned int prussdrv_extmem_size(void);
+
     int prussdrv_map_prumem(unsigned int pru_ram_id, void **address);
 
     int prussdrv_map_peripheral_io(unsigned int per_id, void **address);
 
-    unsigned int prussdrv_get_phys_addr(void *address);
+    unsigned int prussdrv_get_phys_addr(const void *address);
 
     void *prussdrv_get_virt_addr(unsigned int phyaddr);
 
-    int prussdrv_pru_wait_event(unsigned int pru_evtout_num);
+    /** Wait for the specified host interrupt.
+     * @return the number of times the event has happened. */
+    unsigned int prussdrv_pru_wait_event(unsigned int host_interrupt);
+
+    int prussdrv_pru_event_fd(unsigned int host_interrupt);
 
     int prussdrv_pru_send_event(unsigned int eventnum);
 
-    int prussdrv_pru_clear_event(unsigned int eventnum);
+    /** Clear the specified event and re-enable the host interrupt. */
+    int prussdrv_pru_clear_event(unsigned int host_interrupt,
+                                 unsigned int sysevent);
 
     int prussdrv_pru_send_wait_clear_event(unsigned int send_eventnum,
-                                           unsigned int pru_evtout_num,
+                                           unsigned int host_interrupt,
                                            unsigned int ack_eventnum);
 
     int prussdrv_exit(void);
 
-    int prussdrv_exec_program(int prunum, char *filename);
+    int prussdrv_exec_program(int prunum, const char *filename);
+    int prussdrv_exec_program_at(int prunum, const char *filename, size_t addr);
 
-    int prussdrv_start_irqthread(unsigned int pru_evtout_num, int priority,
-                                 prussdrv_function_handler irqhandler);
-
+    int prussdrv_exec_code(int prunum, const unsigned int *code, int codelen);
+    int prussdrv_exec_code_at(int prunum, const unsigned int *code, int codelen, size_t addr);
+    int prussdrv_load_data(int prunum, const unsigned int *code, int codelen);
+    int prussdrv_load_datafile(int prunum, const char *filename);
 
 #if defined (__cplusplus)
 }
Binary file libprussdrv.a has changed
--- a/projects/audio_in_FFT/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/audio_in_FFT/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -79,8 +79,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {
--- a/projects/basic/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/basic/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -77,8 +77,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {
--- a/projects/basic_analog_output/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/basic_analog_output/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -84,8 +84,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {
--- a/projects/basic_passthru/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/basic_passthru/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -71,8 +71,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {
--- a/projects/basic_sensor/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/basic_sensor/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -97,8 +97,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {
--- a/projects/d-box/DboxSensors.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/d-box/DboxSensors.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -13,14 +13,14 @@
 
 
 
-int DboxSensors::initSensors(int tk0_bus, int tk0_address, int tk1_bus, int tk1_address, int tk_file, int fsr_pin, int fsrmax, bool useNewSensors, int gpio_0, int gpio_1)
+int DboxSensors::initSensors(int tk0_bus, int tk0_address, int tk1_bus, int tk1_address, int tk_file, int fsr_pin, int fsrmax, int sensorTypeToUse, int gpio_0, int gpio_1)
 {
-	newSensors = useNewSensors;
+	sensorType = sensorTypeToUse;
 	// init first touch key on i2c bus
 	if(tk0_address >= 0) {
 		if(TK0.initI2C_RW(tk0_bus, tk0_address, tk_file)>0)
 			return 1;
-		if(TK0.initTouchKey(newSensors)>0)
+		if(TK0.initTouchKey(sensorType)>0)
 			return 2;
 	}
 
@@ -28,7 +28,7 @@
 	if(tk1_address >= 0) {
 		if(TK1.initI2C_RW(tk1_bus, tk1_address, tk_file)>0)
 			return 1;
-		if(TK1.initTouchKey(newSensors)>0)
+		if(TK1.initTouchKey(sensorType)>0)
 			return 2;
 	}
 
@@ -77,7 +77,7 @@
 
 
 	int max = 3;
-	if(newSensors)
+	if(sensorType != kSensorTypeTouchKey)
 		max = 5;
 	// if touches detected on main touch key
 	if(tk0_touchCnt == 0 && tk1_touchCnt == 0)
@@ -131,7 +131,7 @@
 void DboxSensors::resetSensorsData()
 {
 	int max = 3;
-	if(newSensors)
+	if(sensorType != kSensorTypeTouchKey)
 		max = 5;
 
 	for(int i=0; i<max; i++)
--- a/projects/d-box/DboxSensors.h	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/d-box/DboxSensors.h	Sat Feb 07 16:41:56 2015 +0000
@@ -37,7 +37,7 @@
 class DboxSensors
 {
 public:
-	int initSensors(int tk0_bus, int tk0_address, int tk1_bus, int tk1_address, int tk_file, int fsr_pin, int fsrmax, bool useNewSensors, int gpio0=-1, int gpio1=-1);
+	int initSensors(int tk0_bus, int tk0_address, int tk1_bus, int tk1_address, int tk_file, int fsr_pin, int fsrmax, int sensorTypeToUse, int gpio0=-1, int gpio1=-1);
 	int readSensors();
 	int getTKTouchCount(int index);
 	float *getTKXPositions(int index);
@@ -50,7 +50,7 @@
 	~DboxSensors();
 
 private:
-	bool newSensors;
+	int sensorType;
 
 	I2c_TouchKey TK0;
 	int tk0_touchCnt;
--- a/projects/d-box/I2c_TouchKey.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/d-box/I2c_TouchKey.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -14,17 +14,20 @@
 I2c_TouchKey::I2c_TouchKey()
 {
 	isReady = false;
-	newSensor = false;
+	sensorType = kSensorTypeTouchKey;
 	touchCount = 0;
 	sliderSize[0] = sliderSize[1] = sliderSize[2] = -1;
 	sliderPosition[0] = sliderPosition[1] = sliderPosition[2] = -1;
 	sliderPositionH = -1;
 }
 
-int I2c_TouchKey::initTouchKey(bool useNewSensor)
+int I2c_TouchKey::initTouchKey(int sensorTypeToUse)
 {
-	newSensor = useNewSensor;
-	numBytesToRead = newSensor ? NUM_BYTES_NEW : NUM_BYTES_OLD;
+	sensorType = sensorTypeToUse;
+	if(sensorType > 2 || sensorType < 0)
+		sensorType = 2;
+
+	numBytesToRead = kSensorBytes[sensorType];
 
 	char buf[3] = { 0x00, 0x01, 0x00 }; // code for centroid mode
 	if(write(i2C_file, buf, 3) !=3)
@@ -44,7 +47,11 @@
 
 	usleep(5000); // need to give TouchKey enough time to process command
 
-	buf[0] = 0x06; // code for data collection
+	if(sensorType == kSensorTypeDBox2)
+		buf[0] = 0x04; // code for data collection
+	else
+		buf[0] = 0x06; // code for data collection
+
 	if(write(i2C_file, buf, 1) !=1)
 	{
 		cout << "Failed to prepare data collection " << endl;
@@ -75,39 +82,52 @@
 
 	touchCount = 0;
 
-	rawSliderPosition[0] = (((dataBuffer[0] & 0xF0) << 4) + dataBuffer[1]);
-	rawSliderPosition[1] = (((dataBuffer[0] & 0x0F) << 8) + dataBuffer[2]);
-	rawSliderPosition[2] = (((dataBuffer[3] & 0xF0) << 4) + dataBuffer[4]);
-
 	// Old TouchKeys sensors have 3 touch locations plus horizontal positions
 	// New D-Box sensors have 5 touch locations but no horizontal position
-	if(newSensor)
-	{
+	// Later D-Box sensors have same data in a different format
+	if(sensorType == kSensorTypeDBox1) {
+		rawSliderPosition[0] = (((dataBuffer[0] & 0xF0) << 4) + dataBuffer[1]);
+		rawSliderPosition[1] = (((dataBuffer[0] & 0x0F) << 8) + dataBuffer[2]);
+		rawSliderPosition[2] = (((dataBuffer[3] & 0xF0) << 4) + dataBuffer[4]);
 		rawSliderPosition[3] = (((dataBuffer[5] & 0xF0) << 4) + dataBuffer[6]);
 		rawSliderPosition[4] = (((dataBuffer[5] & 0x0F) << 8) + dataBuffer[7]);
 		rawSliderPositionH = 0x0FFF;
 	}
-	else
-	{
+	else if(sensorType == kSensorTypeDBox2) {
+		rawSliderPosition[0] = ((dataBuffer[0] << 8) + dataBuffer[1]) & 0x0FFF;
+		rawSliderPosition[1] = ((dataBuffer[2] << 8) + dataBuffer[3]) & 0x0FFF;
+		rawSliderPosition[2] = ((dataBuffer[4] << 8) + dataBuffer[5]) & 0x0FFF;
+		rawSliderPosition[3] = ((dataBuffer[6] << 8) + dataBuffer[7]) & 0x0FFF;
+		rawSliderPosition[4] = ((dataBuffer[8] << 8) + dataBuffer[9]) & 0x0FFF;
+		rawSliderPositionH = 0x0FFF;
+	}
+	else {
+		rawSliderPosition[0] = (((dataBuffer[0] & 0xF0) << 4) + dataBuffer[1]);
+		rawSliderPosition[1] = (((dataBuffer[0] & 0x0F) << 8) + dataBuffer[2]);
+		rawSliderPosition[2] = (((dataBuffer[3] & 0xF0) << 4) + dataBuffer[4]);
 		rawSliderPosition[3] = 0x0FFF;
 		rawSliderPosition[4] = 0x0FFF;
 		rawSliderPositionH   = (((dataBuffer[3] & 0x0F) << 8) + dataBuffer[5]);
 	}
 
-
 	for(int i = 0; i < 5; i++)
 	{
 		if(rawSliderPosition[i] != 0x0FFF) // 0x0FFF means no touch
 		{
-			//sliderPosition[i] = (float)rawSliderPosition[i] / 1536.0;	// Black keys, vertical (128 * 12)
-			//sliderPosition[i] = (float)rawSliderPosition[i] / 768.0;	// Cute white key, for simple instrument
-			if(newSensor)
+			if(sensorType != kSensorTypeTouchKey)
 				sliderPosition[i] = (float)rawSliderPosition[i] / 3200.0;   // New sensors; 26 pads (128 * 25)
 			else
 				sliderPosition[i] = (float)rawSliderPosition[i] / 2432.0;	// White keys, vertical (128 * 19)
-			if(sliderPosition[i]>1.0)
+
+			if(sliderPosition[i] > 1.0)
 				sliderPosition[i] = 1.0;
-			if(newSensor)
+
+			if(sensorType == kSensorTypeDBox2) {
+				sliderSize[i]     = (float)((dataBuffer[2*i + 10] << 8) + dataBuffer[2*i + 11]) / 5000.0;
+				if(sliderSize[i] > 1.0)
+					sliderSize[i] = 1.0;
+			}
+			else if(sensorType == kSensorTypeDBox1)
 				sliderSize[i]     = (float)dataBuffer[i + 8] / 255.0;
 			else {
 				if(i < 3)
--- a/projects/d-box/I2c_TouchKey.h	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/d-box/I2c_TouchKey.h	Sat Feb 07 16:41:56 2015 +0000
@@ -10,18 +10,28 @@
 
 #include "../../include/I2c.h"
 
-#define NUM_BYTES_OLD 9
-#define NUM_BYTES_NEW 13
+// #define NUM_BYTES_OLD 9
+// #define NUM_BYTES_NEW 13
+
+#define MAX_SENSOR_BYTES 20
+
+enum {
+	kSensorTypeTouchKey = 0,
+	kSensorTypeDBox1 = 1,
+	kSensorTypeDBox2 = 2
+};
+
+static const int kSensorBytes[3] = {9, 13, 20};
 
 class I2c_TouchKey : public I2c
 {
 private:
 	bool isReady;
-	bool newSensor;
+	int sensorType;
 	int numBytesToRead;
 
 	// read NUM_BYTES bytes, which have to be properly parsed
-	char dataBuffer[NUM_BYTES_NEW];
+	char dataBuffer[MAX_SENSOR_BYTES];
 	int bytesRead;
 
 	int rawSliderPosition[5];
@@ -34,7 +44,7 @@
 
 
 public:
-	int initTouchKey(bool useNewSensor = false);
+	int initTouchKey(int sensorTypeToUse = kSensorTypeTouchKey);
 	int readI2C();
 	int getTouchCount();
 	float * getSlidersize();
--- a/projects/d-box/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/d-box/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -71,7 +71,7 @@
 
 int touchSensor0Address = 0x0C;				// I2C addresses of touch sensors
 int touchSensor1Address = 0x0B;
-bool useNewSensors = false;
+int sensorType = 0;
 
 char sdPath[256]			= "/dev/mmcblk0p2";			// system path of the SD, partition 2
 char mountPath[256]			= "/root/d-box/usersounds";	// mount point of SD partition 2 [where user files are]
@@ -275,7 +275,7 @@
 		{"file", 1, NULL, 'f'},
 		{"keyboard", 1, NULL, 'k'},
 		{"audio-test", 0, NULL, 'T'},
-		{"new-sensors", 0, NULL, 'S'},
+		{"sensor-type", 1, NULL, 'S'},
 		{"sensor0", 1, NULL, 'Q'},
 		{"sensor1", 1, NULL, 'R'},
 		{"log", 1, NULL, 'l'},
@@ -293,7 +293,7 @@
 	while (1)
 	{
 		int c;
-		if ((c = BeagleRT_getopt_long(args.argc, args.argv, "hf:ki:sTQ:R:Sl:u:o:n:g:", long_option, settings)) < 0)
+		if ((c = BeagleRT_getopt_long(args.argc, args.argv, "hf:ki:sTQ:R:S:l:u:o:n:g:", long_option, settings)) < 0)
 				break;
 		switch (c)
 		{
@@ -317,7 +317,7 @@
 				useAudioTest = true;
 				break;
 		case 'S':
-				useNewSensors = true;
+				sensorType = atoi(optarg);
 				break;
 		case 'Q':
 				touchSensor0Address = atoi(optarg);
@@ -396,7 +396,7 @@
 		free(gPartialFilename);
 
 	if(!useAudioTest) {
-		if(initSensorLoop(touchSensor0Address, touchSensor1Address, useNewSensors) != 0)
+		if(initSensorLoop(touchSensor0Address, touchSensor1Address, sensorType) != 0)
 			return -1;
 	}
 
@@ -450,8 +450,9 @@
 		}
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// load all other files into oscBanks
 	loadAudioFiles(false);
--- a/projects/d-box/sensors.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/d-box/sensors.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -56,7 +56,7 @@
 
 using namespace std;
 
-int initSensorLoop(int sensorAddress0, int sensorAddress1, bool useNewSensors)
+int initSensorLoop(int sensorAddress0, int sensorAddress1, int sensorType)
 {
 	int tk0_bus			= 1;
 	int tk0_address		= sensorAddress0;
@@ -69,7 +69,7 @@
 	if(gVerbose==1)
 		cout << "---------------->Init Control Thread" << endl;
 
-	if(Sensors.initSensors(tk0_bus, tk0_address, tk1_bus, tk1_address, tk_file, fsr_pinNum, fsr_max, useNewSensors)>0)
+	if(Sensors.initSensors(tk0_bus, tk0_address, tk1_bus, tk1_address, tk_file, fsr_pinNum, fsr_max, sensorType)>0)
 	{
 		gShouldStop = 1;
 		cout << "control cannot start" << endl;
--- a/projects/d-box/sensors.h	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/d-box/sensors.h	Sat Feb 07 16:41:56 2015 +0000
@@ -10,7 +10,7 @@
 
 #include "config.h"
 
-int initSensorLoop(int sensorAddress0, int sensorAddress1, bool useNewSensors);
+int initSensorLoop(int sensorAddress0, int sensorAddress1, int sensorType);
 
 void sensorLoop(void *);
 void *keyboardLoop(void *);
--- a/projects/filter_FIR/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/filter_FIR/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -158,8 +158,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {
--- a/projects/filter_IIR/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/filter_IIR/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -164,8 +164,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {
--- a/projects/oscillator_bank/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/oscillator_bank/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -96,8 +96,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {
--- a/projects/samples/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/samples/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -158,8 +158,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {
--- a/projects/tank_wars/main.cpp	Fri Jan 23 15:35:10 2015 +0000
+++ b/projects/tank_wars/main.cpp	Sat Feb 07 16:41:56 2015 +0000
@@ -82,8 +82,9 @@
 		return -1;
 	}
 
-	// Set up interrupt handler to catch Control-C
+	// Set up interrupt handler to catch Control-C and SIGTERM
 	signal(SIGINT, interrupt_handler);
+	signal(SIGTERM, interrupt_handler);
 
 	// Run until told to stop
 	while(!gShouldStop) {