Created
December 27, 2017 17:36
-
-
Save benjaminwand/428b6fb873e48e69541f79f593935254 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Dhcp.h> | |
#include <Dns.h> | |
#include <SPI.h> | |
#include <EthernetClient.h> | |
#include <EtherCard.h> | |
#include <Wire.h> | |
#include "Adafruit_MCP23017.h" | |
/* | |
TODO: Ethernet | |
TCP | |
Kommunikation mit dem Voctocore | |
und Stream Status abfragen etc | |
Hardware frontend for Voctomix | |
https://github.com/voc/voctomix | |
created 9. Nov 2017 | |
last improved 25. December 2017 | |
With help from | |
http://www.arduino.cc/en/Tutorial/ButtonStateChange | |
and several friends | |
wenn man den voctocore fragt get_config antwortet er ngefähr sowas | |
"server_config {"DEFAULT": | |
{}, "mix": {"videocaps": "video/x-raw,format=I420,width=960, | |
height=540,framerate=25/1,pixel-aspect-ratio=1/1, | |
interlace-mode=progressive", "audiocaps": "audio/x-raw,format=S16LE, | |
channels=2,layout=interleaved,rate=48000", | |
"sources": "cam1,cam2,cam3,grabber", "kind": "img", "imguri": | |
"file:///home/sophie/Documents/rollout/background.png"}, | |
"output-buffers": {"mix_out": "10000"}, "fullscreen": {}, | |
"side-by-side-equal": {}, "side-by-side-preview": | |
{"asize": "800x450", "apos": "12/12", "bsize": "320x180", "bpos": | |
"640/360"}, "picture-in-picture": {"pipsize": "320x180", "pippos": | |
"640/360"}, "previews": {"enabled": "false", "deinterlace": "false"}, | |
"stream-blanker": {"enabled": "true", "sources": "pause", "volume": | |
"1.0", "kind": "img", "imguri": | |
"file:///home/sophie/Documents/rollout/background.png"}, | |
"mirrors": {"enabled": "true"}}" | |
Da kann man sehen wie die chanels heißen etc. | |
*/ | |
Adafruit_MCP23017 mcp1; // Create MCP 1 | |
Adafruit_MCP23017 mcp2; // Create MCP 2 | |
// pin mapping | |
const int button_fullscreen = 8; | |
const int led_fullscreen = 9; | |
const int button_side_by_side_preview = 10; | |
const int led_side_by_side_preview = 11; | |
const int button_picture_in_picture = 12; | |
const int led_picture_in_picture = 13; | |
const int button_slides_a = 14; | |
const int led_slides_a = 15; | |
const int button_cam1_a = 0; | |
const int led_cam1_a = 1; | |
const int button_cam2_a = 2; | |
const int led_cam2_a = 3; | |
const int button_cam3_a = 4; | |
const int led_cam3_a = 5; | |
const int button_slides_b = 8; | |
const int led_slides_b = 9; | |
const int button_cam1_b = 10; | |
const int led_cam1_b = 11; | |
const int button_cam2_b = 12; | |
const int led_cam2_b = 13; | |
const int button_cam3_b = 14; | |
const int led_cam3_b = 15; | |
const int button_take = 0; | |
const int led_take = 1; | |
const int button_stream = 5; | |
const int led_stream_red = 6; | |
const int led_stream_green = 7; | |
int buttonState = 0; // current state of a button | |
int lastButtonState_fullscreen = 0; // previous state of each button | |
int lastButtonState_side_by_side_preview = 0; | |
int lastButtonState_picture_in_picture = 0; | |
int lastButtonState_slides_a = 0; | |
int lastButtonState_cam1_a = 0; | |
int lastButtonState_cam2_a = 0; | |
int lastButtonState_cam3_a = 0; | |
int lastButtonState_slides_b = 0; | |
int lastButtonState_cam1_b = 0; | |
int lastButtonState_cam2_b = 0; | |
int lastButtonState_cam3_b = 0; | |
int lastButtonState_take = 0; | |
int lastButtonState_stream = 0; | |
String video_a = "slides"; // building blocks for take-message | |
String video_b = "cam_1"; | |
String composite_mode = "side_by_side_preview"; | |
String stream_status; | |
byte mac[] = { | |
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED | |
}; | |
IPAddress ip(192, 168, 1, 177); | |
// Enter the IP address of the server you're connecting to: | |
IPAddress server(192, 168, 1, 1); | |
// Initialize the Ethernet client library | |
// with the IP address and port of the server | |
// that you want to connect to (port 23 is default for telnet; | |
// if you're using Processing's ChatServer, use port 10002): | |
EthernetClient client; | |
void setup() { | |
// start the Ethernet connection: | |
client.begin(mac, ip); | |
client. | |
// Open serial communications and wait for port to open: | |
Serial.begin(9600); | |
while (!Serial) { | |
; // wait for serial port to connect. Needed for native USB port only | |
} | |
// give the Ethernet shield a second to initialize: | |
delay(6000); | |
Serial.println("connecting..."); | |
// if you get a connection, report back via serial: | |
if (client.connect(server, 10002)) { | |
Serial.println("has connected"); | |
} else { | |
// if you didn't get a connection to the server: | |
Serial.println("connection failed"); | |
} | |
delay(6000); | |
// if you get a connection, report back via serial: | |
if (client.connect(server, 10002)) { | |
Serial.println("has connected"); | |
} else { | |
// if you didn't get a connection to the server: | |
Serial.println("connection failed"); | |
} | |
mcp1.begin(0); // Start MCP 1 on Hardware address 0x20 | |
mcp2.begin(1); // Start MCP 2 on Hardware address 0x21 | |
// initialize the button pins as input: | |
mcp1.pinMode(button_fullscreen, INPUT); | |
mcp1.pinMode(button_side_by_side_preview, INPUT); | |
mcp1.pinMode(button_picture_in_picture, INPUT); | |
mcp1.pinMode(button_slides_a, INPUT); | |
mcp1.pinMode(button_cam1_a, INPUT); | |
mcp1.pinMode(button_cam2_a, INPUT); | |
mcp1.pinMode(button_cam3_a, INPUT); | |
mcp2.pinMode(button_slides_b, INPUT); | |
mcp2.pinMode(button_cam1_b, INPUT); | |
mcp2.pinMode(button_cam2_b, INPUT); | |
mcp2.pinMode(button_cam3_b, INPUT); | |
mcp2.pinMode(button_take, INPUT); | |
pinMode(button_stream, INPUT); | |
// initialize the LEDs as output: | |
mcp1.pinMode(led_fullscreen, OUTPUT); | |
mcp1.pinMode(led_side_by_side_preview, OUTPUT); | |
mcp1.pinMode(led_picture_in_picture, OUTPUT); | |
mcp1.pinMode(led_slides_a, OUTPUT); | |
mcp1.pinMode(led_cam1_a, OUTPUT); | |
mcp1.pinMode(led_cam2_a, OUTPUT); | |
mcp1.pinMode(led_cam3_a, OUTPUT); | |
mcp2.pinMode(led_slides_b, OUTPUT); | |
mcp2.pinMode(led_cam1_b, OUTPUT); | |
mcp2.pinMode(led_cam2_b, OUTPUT); | |
mcp2.pinMode(led_cam3_b, OUTPUT); | |
mcp2.pinMode(led_take, OUTPUT); | |
pinMode(led_stream_red, OUTPUT); | |
pinMode(led_stream_green, OUTPUT); | |
// test LEDs | |
mcp1.digitalWrite(led_fullscreen, HIGH); | |
mcp1.digitalWrite(led_side_by_side_preview, HIGH); | |
mcp1.digitalWrite(led_picture_in_picture, HIGH); | |
mcp1.digitalWrite(led_slides_a, HIGH); | |
mcp1.digitalWrite(led_cam1_a, HIGH); | |
mcp1.digitalWrite(led_cam2_a, HIGH); | |
mcp1.digitalWrite(led_cam3_a, HIGH); | |
mcp2.digitalWrite(led_slides_b, HIGH); | |
mcp2.digitalWrite(led_cam1_b, HIGH); | |
mcp2.digitalWrite(led_cam2_b, HIGH); | |
mcp2.digitalWrite(led_cam3_b, HIGH); | |
mcp2.digitalWrite(led_take, HIGH); | |
digitalWrite(led_stream_red, HIGH); | |
digitalWrite(led_stream_green, HIGH); | |
delay(1000); | |
/* | |
because of: | |
String video_a = "slides"; | |
String video_b = "cam_1"; | |
String composite_mode = "side_by_side_preview"; | |
keep some buttons illuminated: | |
*/ | |
mcp1.digitalWrite(led_fullscreen, LOW); | |
mcp1.digitalWrite(led_picture_in_picture, LOW); | |
mcp1.digitalWrite(led_cam1_a, LOW); | |
mcp1.digitalWrite(led_cam2_a, LOW); | |
mcp1.digitalWrite(led_cam3_a, LOW); | |
mcp2.digitalWrite(led_slides_b, LOW); | |
mcp2.digitalWrite(led_cam2_b, LOW); | |
mcp2.digitalWrite(led_cam3_b, LOW); | |
digitalWrite(led_stream_red, LOW); | |
digitalWrite(led_stream_green, LOW); | |
} | |
void loop() { | |
client.print("hi"); | |
// OnButtonPush | |
// fullscreen | |
buttonState = mcp1.digitalRead(button_fullscreen); // read the pushbutton input pin | |
if (buttonState != lastButtonState_fullscreen) { // compare to lastButtonState | |
if (buttonState == HIGH) { | |
// if the current state is LOW, then | |
composite_mode = "fullscreen"; // the button just got pushed | |
Serial.println("composite_mode fullscreen selected"); // and things happen | |
mcp1.digitalWrite(led_fullscreen, HIGH); | |
mcp1.digitalWrite(led_side_by_side_preview, LOW); | |
mcp1.digitalWrite(led_picture_in_picture, LOW); | |
} | |
else { // do nothing / placeholder | |
} | |
delay(1); // delay bit to avoid bouncing | |
} | |
lastButtonState_fullscreen = buttonState; // save the current state as the last state, | |
// for next time through the loop | |
// end OnButtonPush | |
// side-by-side-preview | |
buttonState = mcp1.digitalRead(button_side_by_side_preview); | |
if (buttonState != lastButtonState_side_by_side_preview) { | |
if (buttonState == HIGH) { | |
composite_mode = "side_by_side_preview"; | |
Serial.println("composite_mode side_by_side_preview selected"); | |
mcp1.digitalWrite(led_side_by_side_preview, HIGH); | |
mcp1.digitalWrite(led_fullscreen, LOW); | |
mcp1.digitalWrite(led_picture_in_picture, LOW); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_side_by_side_preview = buttonState; | |
// picture_in_picture | |
buttonState = mcp1.digitalRead(button_picture_in_picture); | |
if (buttonState != lastButtonState_picture_in_picture) { | |
if (buttonState == HIGH) { | |
composite_mode = "picture_in_picture"; | |
Serial.println("composite_mode picture_in_picture selected"); | |
mcp1.digitalWrite(led_picture_in_picture, HIGH); | |
mcp1.digitalWrite(led_side_by_side_preview, LOW); | |
mcp1.digitalWrite(led_fullscreen, LOW); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_picture_in_picture = buttonState; | |
//slides_a | |
buttonState = mcp1.digitalRead(button_slides_a); | |
if (buttonState != lastButtonState_slides_a) { | |
if (buttonState == HIGH) { | |
video_a = "slides"; | |
Serial.println("slides for channel a selected"); | |
mcp1.digitalWrite(led_slides_a, HIGH); | |
mcp1.digitalWrite(led_cam1_a, LOW); | |
mcp1.digitalWrite(led_cam2_a, LOW); | |
mcp1.digitalWrite(led_cam3_a, LOW); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_slides_a = buttonState; | |
//cam1_a | |
buttonState = mcp1.digitalRead(button_cam1_a); | |
if (buttonState != lastButtonState_cam1_a) { | |
if (buttonState == HIGH) { | |
video_a = "cam1"; | |
Serial.println("cam1 for channel a selected"); | |
mcp1.digitalWrite(led_slides_a, LOW); | |
mcp1.digitalWrite(led_cam1_a, HIGH); | |
mcp1.digitalWrite(led_cam2_a, LOW); | |
mcp1.digitalWrite(led_cam3_a, LOW); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_cam1_a = buttonState; | |
//cam2_a | |
buttonState = mcp1.digitalRead(button_cam2_a); | |
if (buttonState != lastButtonState_cam2_a) { | |
if (buttonState == HIGH) { | |
video_a = "cam2"; | |
Serial.println("cam2 for channel a selected"); | |
mcp1.digitalWrite(led_slides_a, LOW); | |
mcp1.digitalWrite(led_cam1_a, LOW); | |
mcp1.digitalWrite(led_cam2_a, HIGH); | |
mcp1.digitalWrite(led_cam3_a, LOW); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_cam2_a = buttonState; | |
//cam3_a | |
buttonState = mcp1.digitalRead(button_cam3_a); | |
if (buttonState != lastButtonState_cam3_a) { | |
if (buttonState == HIGH) { | |
video_a = "cam3"; | |
Serial.println("cam3 for channel a selected"); | |
mcp1.digitalWrite(led_slides_a, LOW); | |
mcp1.digitalWrite(led_cam1_a, LOW); | |
mcp1.digitalWrite(led_cam2_a, LOW); | |
mcp1.digitalWrite(led_cam3_a, HIGH); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_cam3_a = buttonState; | |
//slides_b | |
buttonState = mcp2.digitalRead(button_slides_b); | |
if (buttonState != lastButtonState_slides_b) { | |
if (buttonState == HIGH) { | |
video_b = "slides"; | |
Serial.println("slides for channel b selected"); | |
mcp2.digitalWrite(led_slides_b, HIGH); | |
mcp2.digitalWrite(led_cam1_b, LOW); | |
mcp2.digitalWrite(led_cam2_b, LOW); | |
mcp2.digitalWrite(led_cam3_b, LOW); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_slides_b = buttonState; | |
//cam1_b | |
buttonState = mcp2.digitalRead(button_cam1_b); | |
if (buttonState != lastButtonState_cam1_b) { | |
if (buttonState == HIGH) { | |
video_b = "cam1"; | |
Serial.println("cam1 for channel b selected"); | |
mcp2.digitalWrite(led_slides_b, LOW); | |
mcp2.digitalWrite(led_cam1_b, HIGH); | |
mcp2.digitalWrite(led_cam2_b, LOW); | |
mcp2.digitalWrite(led_cam3_b, LOW); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_cam1_b = buttonState; | |
//cam2_b | |
buttonState = mcp2.digitalRead(button_cam2_b); | |
if (buttonState != lastButtonState_cam2_b) { | |
if (buttonState == HIGH) { | |
video_b = "cam2"; | |
Serial.println("cam2 for channel b selected"); | |
mcp2.digitalWrite(led_slides_b, LOW); | |
mcp2.digitalWrite(led_cam1_b, LOW); | |
mcp2.digitalWrite(led_cam2_b, HIGH); | |
mcp2.digitalWrite(led_cam3_b, LOW); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_cam2_b = buttonState; | |
//cam3_b | |
buttonState = mcp2.digitalRead(button_cam3_b); | |
if (buttonState != lastButtonState_cam3_b) { | |
if (buttonState == HIGH) { | |
video_b = "cam3"; | |
Serial.println("cam3 for channel b selected"); | |
mcp2.digitalWrite(led_slides_b, LOW); | |
mcp2.digitalWrite(led_cam1_b, LOW); | |
mcp2.digitalWrite(led_cam2_b, LOW); | |
mcp2.digitalWrite(led_cam3_b, HIGH); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_cam3_b = buttonState; | |
//take | |
buttonState = mcp2.digitalRead(button_take); | |
if (buttonState != lastButtonState_take) { | |
if (buttonState == HIGH) { | |
Serial.println("< set_videos_and_composite " + video_a + " " + video_b + " " + composite_mode); | |
mcp2.digitalWrite(led_take, HIGH); | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_take = buttonState; | |
//abfragen ob stream status geändert hat, dann LED LOW | |
/* | |
stream | |
stream_status = ; // muss noch gemacht werden !! | |
// < get_stream_status | |
if (stream_status == live) { | |
digitalWrite(led_stream_red, LOW); | |
digitalWrite(led_stream_green, HIGH); | |
} | |
else { | |
digitalWrite(led_stream_red, HIGH); | |
digitalWrite(led_stream_green, LOW); | |
} | |
buttonState = digitalRead(button_stream); //OnButtonPush | |
if (buttonState != lastButtonState_stream) { | |
if (buttonState == HIGH) { | |
if (stream_status == live) { | |
Serial.println("<set_stream_blank pause"); | |
digitalWrite(led_stream_red, HIGH); | |
digitalWrite(led_stream_green, LOW); | |
} | |
else { | |
Serial.println("set_stream_live"); | |
digitalWrite(led_stream_red, LOW); | |
digitalWrite(led_stream_green, HIGH); | |
} | |
} | |
else { | |
} | |
delay(1); | |
} | |
lastButtonState_stream = buttonState; | |
*/ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment