diff --git a/promethevs_systemprogramming b/promethevs_systemprogramming
new file mode 160000
index 0000000000000000000000000000000000000000..fbc5d6fbae339db374df99491a62f273ab2b441b
--- /dev/null
+++ b/promethevs_systemprogramming
@@ -0,0 +1 @@
+Subproject commit fbc5d6fbae339db374df99491a62f273ab2b441b
diff --git a/raspberryPi4/Rasp4.cpp b/raspberryPi4/Rasp4.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d73744fbbb0ea64b26884020e5f1e9341b64f67c
--- /dev/null
+++ b/raspberryPi4/Rasp4.cpp
@@ -0,0 +1,162 @@
+/*
+ * See documentation at https://nRF24.github.io/RF24
+ * See License information at root directory of this library
+ * Author: Brendan Doherty (2bndy5)
+ */
+
+/**
+ * A simple example of sending data from 1 nRF24L01 transceiver to another.
+ *
+ * This example was written to be used on 2 devices acting as "nodes".
+ * Use `ctrl+c` to quit at any time.
+ */
+#include <ctime>       // time()
+#include <iostream>    // cin, cout, endl
+#include <string>      // string, getline()
+#include <time.h>      // CLOCK_MONOTONIC_RAW, timespec, clock_gettime()
+#include <RF24/RF24.h> // RF24, RF24_PA_LOW, delay()
+#include <cstdlib>
+
+using namespace std;
+
+/****************** Linux ***********************/
+// Radio CE Pin, CSN Pin, SPI Speed
+// CE Pin uses GPIO number with BCM and SPIDEV drivers, other platforms use their own pin numbering
+// CS Pin addresses the SPI bus number at /dev/spidev<a>.<b>
+// ie: RF24 radio(<ce_pin>, <a>*10+<b>); spidev1.0 is 10, spidev1.1 is 11 etc..
+#define CSN_PIN 0
+#ifdef MRAA
+    #define CE_PIN 15 // GPIO22
+#else
+    #define CE_PIN 22
+#endif
+// Generic:
+RF24 radio(17, CSN_PIN);
+/****************** Linux (BBB,x86,etc) ***********************/
+// See http://nRF24.github.io/RF24/pages.html for more information on usage
+// See http://iotdk.intel.com/docs/master/mraa/ for more information on MRAA
+// See https://www.kernel.org/doc/Documentation/spi/spidev for more information on SPIDEV
+
+// For this example, we'll be using a payload containing
+// a single float number that will be incremented
+// on every successful transmission
+float payload = 0.0;
+
+void setRole(); // prototype to set the node's role
+void master();  // prototype of the TX node's behavior
+void slave();   // prototype of the RX node's behavior
+
+// custom defined timer for evaluating transmission time in microseconds
+struct timespec startTimer, endTimer;
+uint32_t getMicros(); // prototype to get elapsed time in microseconds
+
+int main(int argc, char** argv)
+{
+
+    // perform hardware check
+    if (!radio.begin()) {
+        cout << "radio hardware is not responding!!" << endl;
+        return 0; // quit now
+    }
+
+    bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit
+
+    // print example's name
+    cout << argv[0] << endl;
+
+    // Let these addresses be used for the pair
+    uint8_t address[2][6] = {"SPEAK", "SPEA1"};
+    // It is very helpful to think of an address as a path instead of as
+    // an identifying device destination
+
+    // Set the radioNumber via the terminal on startup
+    cout << "Which radio is this? Enter '0' or '1'. Defaults to '0' ";
+    string input;
+    getline(cin, input);
+    radioNumber = input.length() > 0 && (uint8_t)input[0] == 49;
+
+    // save on transmission time by setting the radio to only transmit the
+    // number of bytes we need to transmit a float
+    radio.setPayloadSize(sizeof(payload)); // float datatype occupies 4 bytes
+
+    // Set the PA Level low to try preventing power supply related problems
+    // because these examples are likely run with nodes in close proximity to
+    // each other.
+    radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default.
+
+    // set the TX address of the RX node into the TX pipe
+    radio.openWritingPipe(address[radioNumber]); // always uses pipe 0
+
+    // set the RX address of the TX node into a RX pipe
+    radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1
+
+    // ready to execute program now
+    setRole(); // calls master() or slave() based on user input
+    return 0;
+}
+
+/**
+ * set this node's role from stdin stream.
+ * this only considers the first char as input.
+ */
+void setRole()
+{
+    string input = "";
+    while (1) {
+        slave();
+    }               // while
+} // setRole()
+
+
+/**
+ * make this node act as the receiver
+ */
+
+void slave()
+{
+
+    radio.startListening(); // put radio in RX mode
+    int check = 0;
+    
+    time_t startTimer = time(nullptr);       // start a timer
+    while (time(nullptr) - startTimer < 100) { // use 100 second timeout
+        uint8_t pipe;
+        if (radio.available(&pipe)) {                        // is there a payload? get the pipe number that recieved it
+            uint8_t bytes = radio.getPayloadSize();          // get the size of the payload
+            radio.read(&payload, bytes);                     // fetch payload from FIFO
+            cout << "Received " << (unsigned int)bytes;      // print the size of the payload
+            cout << " bytes on pipe " << (unsigned int)pipe; // print the pipe number
+            cout << ": " << payload << endl;                 // print the payload's value
+            startTimer = time(nullptr);  // reset timer
+            
+            if (payload == 1) {
+                check++;
+                printf("check : %d\n", check); 
+            }
+        }
+        
+        if (check == 4) {
+            system("./speaker");
+            check = 0;
+        }
+    }
+    
+    cout << "Nothing received in 100 seconds. Leaving RX role." << endl;
+    radio.stopListening();
+}
+
+/**
+ * Calculate the elapsed time in microseconds
+ */
+uint32_t getMicros()
+{
+    // this function assumes that the timer was started using
+    // `clock_gettime(CLOCK_MONOTONIC_RAW, &startTimer);`
+
+    clock_gettime(CLOCK_MONOTONIC_RAW, &endTimer);
+    uint32_t seconds = endTimer.tv_sec - startTimer.tv_sec;
+    uint32_t useconds = (endTimer.tv_nsec - startTimer.tv_nsec) / 1000;
+
+    return ((seconds)*1000 + useconds) + 0.5;
+}
+
diff --git a/raspberryPi4/Rasp4_speaker.cpp b/raspberryPi4/Rasp4_speaker.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7828811170b5c76a632c0221293a71c4e868cf88
--- /dev/null
+++ b/raspberryPi4/Rasp4_speaker.cpp
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+ 
+#include <wiringPi.h>
+#include <softTone.h>
+ 
+#define PIN 28
+
+int scale [35] = {262, 0, 262, 0, 392, 392, 330, 330, 0, 0, 262, 0, 262, 0, 392, 392, 330, 330, 0, 0, 440, 440, 0, 392, 349, 349, 330, 330, 294, 294, 330, 330, 349, 349  } ;
+ 
+int main ()
+{
+  int i ;
+  wiringPiSetup () ;
+  softToneCreate (PIN) ;
+  for (i = 0 ; i < 35; ++i)
+    {
+      printf ("%3d\n", i) ;
+      softToneWrite (PIN, scale [i]) ;
+      delay (100) ;
+    }
+}
+