import processing.io.*;
import g4p_controls.*;
import processing.video.*;
import org.guilhermesilveira.Timers;
import processing.net.*;
Server my_server;
int tx_d = 123;
Capture camera;
Capture camera2;
Capture camera3;
// 멀티타임시 적용
// Timers timers = new Timers(this);
/*
void every5Seconds() {
println("every 5 seconds");
}
// runs every second, 10 times a lambda
timers.add(1000, 10, () -> println("every 1 second"));
// runs 10 times every 10 seconds, a lambda with a counter
timers.add(10 * 1000, 10, (k) -> println("#" + k + " invocation on 10 seconds"));
// runs 10 times every 5 seconds a method by its reference
timers.add(5 * 1000, 10, this::every5Seconds);
// runs 2 times every 3 seconds a method with the counter
timers.add(3 * 1000, 2, () -> println("every 3 seconds"),
(k) -> println("Finished the 3 seconds counter after " + k + " calls"));
*/
PFont myFont;
int cnt = 0;
int led_buf = 0;
int[] led_box = new int[10];
int cnt1 = 0;
//int[] led_box = {0,0,0,0,0,0,0,0};
String[] captureDevices;
String rx_buf = "Test";
String client_ip;
String tx_buf = "test";
int rx_cnt = 0;
void setup()
{
size(1200,900); // org = 680 x 800
smooth();
background(220);
// 뷰어창 전체 바탕색 표시
fill(80);
rect(680, 20, 500, 860);
// 시스템 초기화 및 한글 폰트 설정
myFont = createFont("한초롬바탕", 32);
textFont(myFont);
textAlign(CENTER, CENTER);
// 타이틀 표시
textSize(50);
strokeWeight(6);
stroke(0,0,255);
fill(255,0);
text("IoT 전문가 과정(PC용)", 340, 50);
// led 구성 표시
led_dis(60, 200);
// R-Pi LED 디바이스 초기화
led_init();
//chk box, 옵션box, 이미지 스위치 화면 디자인 표시 = G4P LIB 사용
createGUI();
// FND 모듈 화면 디자인 표시
noStroke();
fnd_blk(200,490); // x_1000 = x 측 좌표 배열 범위 70식 배치
fnd_blk(270,490); // x_100
fnd_blk(340,490); // x_10
fnd_blk(410,490); // x_1
// server 소켓생성
my_server = new Server(this, 5000); // server port set
// 준비여부 즉 서버 소켓이 생성되었는지 체크 = 소켓 유효성 확인
if( my_server.active() == false )
{
println("연결안됨, 활성화 안됨, Connet Error");
exit();
} else println("Clrent 연결 OK!!");
camera = new Capture(this, "TSG-WC200U"); // PC에서 할 경우
//camera2 = new Capture(this, "ABKO APC480 SD WEBCAM"); // R-Pi에서 USB 카메라 할 경우 1296, 972
// camera = new Capture(this, 640, 480); // R-Pi 전용 카메라로 할 경우 1296, 972
camera.start();
//camera2.start();
//camera3.start();
// 시스템 터이머 IRQ 설정
// new Timers(this).add(1, -1, this::hello); // 싱글 타임시 적용
// new Timers(this).add(1000, 100, this::hello); // 싱글 타임시 적용
//new Timers(this).add(1000, 10, () -> println("every 1 second")); //싱글타밍시 적용
}
void hello(int fnd_dis)
{
cnt1++;
println(cnt1);
}
void captureEvent(Capture c){
camera.read();
//if(c == camera) camera.read();
//else if(c == camera2) camera2.read();
//else camera3.read();
}
void clientEvent(Client song)
{
if(song.available() > 0)
{
String d_buf = song.readString();
if(int(d_buf) > 0)
{
cnt = int(d_buf);
println(d_buf);
rx_buf = d_buf;
}
//println(d_buf);
// song.write(" Server Test OK!!! Event...");
}
}
void draw()
{
/*
// 수신가능한 소켓이 있는지 확인 = 없는경우 null
Client conClient = my_server.available();
if(conClient != null)
{
// 수신가능한 데이터가 있음 = 수신데이터 수납
int recvSize = conClient.available();
if(recvSize > 0)
{
// 방법 1 = byte
//byte[] recvData = conClient.readBytes(recvSize);
// 11111111방법 2 = 문자열로 받는 거
String rxd = conClient.readString();
if(rxd != null)
{
println(conClient.ip() + rxd);
conClient.write(" Server Test OK!!!");
}
}
}
*/
// 실습3 카운터
//1. led output
byte_out(0xffff-int(map(cnt, 0, 1024, 0, 255)));
//byte_out(0xff-cnt); // K(Low) data 출력시
//byte_out(cnt); // A(HIGH) data 출력시
//2. 화면지움
background(220);
fill(255,0,0);
textSize(50);
text("IoT 전문가 양성과정(PC)", 340, 50);
//3. 화면출력
// 뷰어창 전체 바탕색 표시
fill(80);
rect(680, 20, 500, 865);
strokeWeight(8);
stroke(0,0,255);
line(685, 250, 1176, 250);
line(685, 675, 1176, 675);
image(camera, 700, 258, width/2.6, height/2.2);
fill(255, 0, 0);//#F8FC03);
text("IoT 전문가 양성과정", 932, 350);
//-------------------------------------------------------
fill(#05FCF6);
textSize(30);
text("Server 수신 VIEW", 940, 40);
fill(255);
text("Clienr 수신 IP : " + client_ip, 920, 120);
text("Client 수신 Data : " + rx_buf, 915, 180);
fill(#05FCF6);
text("Server 송신 VIEW", 940, 700);
fill(255);
text("Server 송신 IP : " + my_server.ip(), 920, 770);
text("Server 송신 Data : " + tx_buf, 915, 830);
//---------------------------------------------------------
textSize(30);
//fill(255,0,0);
//text("Up Cnt = " + str(cnt), 100,700);
//text("Dn Cnt = " + str(255-cnt), 100,750);
//print("Up Cnt = ");
//println(cnt);
//4. 카운터 값 증가
// cnt++;
//5. 카운터값 Max 체크
if(cnt > 1024) cnt = 0;
//6. 지연
delay(200);
// led + led bar 구성표시
strokeWeight(8);
stroke(0,0,255);
led_dis(60, 200);
// R-Pi로 FND + LED 표시
//cnt = 1234;
// fnd 화면표시
noStroke();
fnd_blk(200,490); // x_1000 = x 측 좌표 배열 범위 70식 배치
fnd_dis(200,490,cnt/1000,255,0); // x_1000 = x 측 좌표 배열 범위 70식 배치
fnd_blk(270,490); // x_100
fnd_dis(270,490,cnt%1000/100,255,0); // x_100
fnd_blk(340,490); // x_10
fnd_dis(340,490,cnt%100/10,255,0); // x_10
fnd_blk(410,490); // x_1
fnd_dis(410,490,cnt%10,255,1);
// Mouse 커셔표시
led_cursor();
// Data 값 LED 표시
//led_buf = cnt; // 1. Counter 값 표시
led_cnt_dis(60, 200, led_buf);
// debuging 용
//print(mouseX);
//print(" ");
// println(mouseY);
}
// 새로운 클라이언트가 연결될때 실행 됨
void serverEvent(Server evtServer, Client smg)
{
println(smg.ip() + " Client 로 연결 되었습니다");
smg.write(smg.ip() + "로 Client 연결되었습니다.");
client_ip = smg.ip();
println(client_ip);
// smg.write('k');
}
// 강제로 서버 닫음 = 절단
void sever_close()
{
my_server.stop();
}
// 연결이 졸료되면 호출 됨
void disconnectEvent(Client disClient) {
println( disClient.ip() + " 가 연결이 종료 되었습니다.");
}
/*
void mousePressed() {
if (mouseButton == LEFT) {
switch(mouse_cnt)
{
case 1: led_cnt_dis(60, 200, 0x01); break;
} //switch end
} // if end
}
*/