You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IFB_dev/FC_InterfaceBoard/FC_InterfaceBoard.h

157 lines
3.8 KiB
C

#include "Arduino.h"
#include <MsTimer2.h> // MsTimer2 v1.1
#include <Ethernet2.h> // Ethernet2 v1.0.4
#include "GP8403.h"
/* ---------- Periodics ---------- */
// Flags
bool T_10ms = false;
bool T_20ms = false;
bool T_50ms = false;
bool T_100ms = false;
bool T_200ms = false;
bool T_500ms = false;
bool T_1000ms = false;
bool T_2000ms = false;
bool T_5000ms = false;
// Datas
int msCnt = 0;
unsigned long timer = 0;
/* ---------- Arduino Mega 2560 Basic IO ---------- */
// Pins
const int DoPin[] = { 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49};
const int DiPin[] = { 26, 27, 28, 29, 30, 31, 32, 33};
const int AiPin[] = { A0, A1, A2, A3, A4, A5, A6, A7,
A8, A9, A10, A11, A12, A13, A14, A15};
// Data Storages
int Size_DO = 16;
int Size_DI = 8;
int Size_AI = 16;
int Values_DI; // digit values to a number
int Values_AI[16];
int Recent_AI[16][10];
/* ---------- I2C (Analog Output, DAC) ---------- */
// Addresses
DFRobot_GP8403 AO_0(&Wire,0x58);
DFRobot_GP8403 AO_2(&Wire,0x59);
DFRobot_GP8403 AO_4(&Wire,0x5A);
DFRobot_GP8403 AO_6(&Wire,0x5B);
DFRobot_GP8403 AO_8(&Wire,0x5C);
DFRobot_GP8403 AO_10(&Wire,0x5D);
DFRobot_GP8403 AO_12(&Wire,0x5E);
DFRobot_GP8403 AO_14(&Wire,0x5F);
// Data Storage
int RngAO[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
/* ---------- Ethernet (Ethernet Sheld2) ---------- */
// Ethernet Client
EthernetClient client;
// SCPI defaults to port 5025
EthernetServer server(5025);
// HTTP defaults to port 5025
EthernetServer web(80);
unsigned long lastDataReceivedTime;
unsigned long timeoutPeriod = 5000; // 이더넷 타임아웃 시간 (5초)
bool State_eth = false;
HardwareSerial* Serials[] = {&Serial1, &Serial2};
const int BUFF_SIZE = 1024;
char Buff_Eth_Rd[BUFF_SIZE] = {0};
char Buff_485_1_Wr[BUFF_SIZE] = {0};
char Buff_485_1_Rd[BUFF_SIZE] = {0};
char Buff_485_2_Wr[BUFF_SIZE] = {0};
char Buff_485_2_Rd[BUFF_SIZE] = {0};
String latest_sent_msg;
int numOf485 = 0;
int returnTime = 0;
/* ---------- RS485 ---------- */
// 485 CH 1
bool Wait_485_1;
int Wait_485_1_cnt;
int RS485_1_Addr[2] = {0,0};
bool RS485_1_Rcv_PV[2] = {false, false};
bool RS485_1_Rcv_SV[2] = {false, false};
int RS485_1_Rcv_size = 8;
int RS485_1_Values_PV[8*2];
int RS485_1_Values_SV[8*2];
// 485 CH 2
bool Wait_485_2;
int Wait_485_2_cnt;
int RS485_2_Addr[2];
bool RS485_2_Rcv_PV[2];
bool RS485_2_Rcv_SV[2];
int RS485_2_Rcv_size = 8;
int RS485_2_Values_PV[8*2];
int RS485_2_Values_SV[8*2];
//Processes
String Prcss_ALL_Read();
String Prcss_DO_Write(unsigned int data[], int dataSize);
String Prcss_DI_Read();
String Prcss_AI_Read();
String Prcss_AO_Write(unsigned int data[], int dataSize);
String Prcss_PV_Read();
String Prcss_SV_Read();
String Prcss_SV_Write(unsigned int data[], int dataSize);
String Prcss_AT_Write(unsigned int data[], int dataSize);
String Prcss_RngAO(unsigned int data[], int dataSize);
String Prcss_ChMC9(unsigned int data[], int dataSize);
//Ethernet
void Ethernet_setup();
void webReponse();
String demuxCMD(String command, String* rightPart);
int demuxNum(String rightPart, unsigned int data[]);
//RS485
void RS485_setup();
void send_485();
int recieve_485();
void recieve_485_0();
//GPIO
void GPIO_setup();
void read_analog();
void read_digital();
//MC9
void setupMC9_1(int i, int data);
String msg_MC9_PV(int addr);
String msg_MC9_SV(int addr);
int saveMC9(String message);
int timeoutMC9();
int parseMC9(const String& message, int& addr, String& mode, int data[8], int& crc);
String sumMC9(String input);
//Utils
int write_buff_c(char* buff, char c);
int write_buff(char* buff, String str);
int write_buff_first(char* buff, String str);
String read_buff(char* buff);
// Periodics
void Periodic_run();
void timer_10ms();
// Analog_Out
void AO_setup(int i, int Rng);
void AO_Write(int i, int volt);
void timer_10ms();
int write_buff_c(char* buff, char c);