You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.0 KiB
130 lines
3.0 KiB
#include <SPI.h>
|
|
#include <UIPEthernet.h>
|
|
#include <UIP_ATEM.h>
|
|
#include <RF24.h>
|
|
#include <nRF24L01.h>
|
|
|
|
//Ethernet
|
|
byte mac[] = {0xAA, 0xDD, 0xBB, 0x10, 0x01, 0x01};
|
|
IPAddress ip(192, 168, 178, 30);
|
|
|
|
//IP of the ATEM switcher
|
|
ATEM AtemSwitcher(IPAddress(192, 168, 178, 20), 56417);
|
|
|
|
//program
|
|
boolean programStat[4] = {1,1,1,1};
|
|
# define programStatLength 4
|
|
|
|
//preview
|
|
boolean previewStat[4] = {1,1,1,1};
|
|
# define previewStatLength 4
|
|
|
|
//program LEDs
|
|
const int programLED[] = {2,4};
|
|
# define programLEDlength 2
|
|
|
|
//preview LEDs
|
|
const int previewLED[] = {3,5};
|
|
# define previewLEDlength 2
|
|
|
|
//init NRF
|
|
RF24 radio (7, 8);
|
|
const uint16_t address = 0xADB5;
|
|
uint16_t datasend = 0;
|
|
|
|
//define min interval to send data
|
|
unsigned long currentTime = millis();
|
|
unsigned long previousTime = 0;
|
|
const long intervalTime = 1000;
|
|
|
|
void setup(){
|
|
for (int i=0; i < programLEDlength; i++){
|
|
pinMode(programLED[i], OUTPUT);
|
|
digitalWrite(programLED[i], HIGH);
|
|
}
|
|
for (int i=0; i < previewLEDlength; i++){
|
|
pinMode(previewLED[i], OUTPUT);
|
|
digitalWrite(previewLED[i], HIGH);
|
|
}
|
|
|
|
//start Ethernet
|
|
Ethernet.begin(mac,ip);
|
|
|
|
//start Serial
|
|
Serial.begin(9600);
|
|
Serial.println("start serial");
|
|
|
|
//connect to the switcher
|
|
Serial.println("connect to ATEM");
|
|
AtemSwitcher.serialOutput(false);
|
|
AtemSwitcher.connect();
|
|
|
|
//start NRF
|
|
Serial.println("start NRF");
|
|
radio.begin();
|
|
radio.openWritingPipe(address);
|
|
radio.setPALevel(RF24_PA_MIN);
|
|
radio.setDataRate(RF24_1MBPS);
|
|
//radio.disableDynamicPayloads();
|
|
radio.setAutoAck(false);
|
|
radio.disableCRC();
|
|
radio.stopListening();
|
|
|
|
delay(100);
|
|
}
|
|
|
|
void loop(){
|
|
//check for new packages
|
|
AtemSwitcher.runLoop();
|
|
|
|
currentTime = millis();
|
|
if (dataChanged() || currentTime - previousTime >= intervalTime){
|
|
sendNRF();
|
|
previousTime = currentTime;
|
|
delay(20);
|
|
}
|
|
}
|
|
|
|
void sendNRF(){
|
|
//program
|
|
for (int i=0; i < programStatLength; i++) {
|
|
datasend = (datasend << 1) + programStat[i];
|
|
}
|
|
datasend = datasend << (8 - programStatLength);
|
|
//preview
|
|
for (int i=0; i < programStatLength; i++) {
|
|
datasend = (datasend << 1) + previewStat[i];
|
|
}
|
|
datasend = datasend << (8 - previewStatLength);
|
|
//datasend = (datasend << 8) + getChecksum(datasend & 0xFF);
|
|
Serial.print(" datasend: ");
|
|
Serial.println(datasend, BIN);
|
|
|
|
radio.writeFast(&datasend, sizeof(datasend));
|
|
}
|
|
|
|
boolean dataChanged(){
|
|
boolean changed = false;
|
|
for (int i=0; i < programStatLength; i++){
|
|
if (AtemSwitcher.getProgramTally(i+1) != programStat[i]){
|
|
programStat[i] = AtemSwitcher.getProgramTally(i+1);
|
|
if(programLEDlength > i)digitalWrite(programLED[i], programStat[i]);
|
|
changed = true;
|
|
}
|
|
}
|
|
for (int i=0; i < previewStatLength; i++){
|
|
if (AtemSwitcher.getPreviewTally(i+1) != previewStat[i]){
|
|
previewStat[i] = AtemSwitcher.getPreviewTally(i+1);
|
|
if(previewLEDlength > i)digitalWrite(previewLED[i], previewStat[i]);
|
|
changed = true;
|
|
}
|
|
}
|
|
return changed;
|
|
}
|
|
|
|
byte getChecksum(byte data){
|
|
byte checksum = 0;
|
|
for (int i=8; i<8; i++) checksum += (data >> i) & B1;
|
|
return checksum;
|
|
}
|