#include <iostream> // cincout
#include <cstring>
#include <fcntl.h> // buka koneksi ke port
#include <unistd.h> // baca tulis ke file
#include <termios.h> // setting file/terminal/koneksi
#include <sys/ioctl.h>

int main()
{
const char *portName = "/dev/ttyACM0"; // Replace with your serial port name

int serialPort = open(portName, O_RDWR | O_NOCTTY); // fcntl: | open : membuka koneksi ke port | O_RDWR : terbuka untuk baca tulis | O_NOCTTY : Jika set dan jalur mengidentifikasi perangkat terminal, open () tidak akan menyebabkan perangkat terminal menjadi terminal pengontrol untuk proses tersebut.

if (serialPort == -1)
{
std::cerr << "Failed to open the serial port." << std::endl;
return 1;
}

std::cout << serialPort << std::endl;

struct termios serialParams; // init dari termios.h
if (tcgetattr(serialPort, &serialParams) == -1) // termios | mendapatkan parameter yang terkait dengan terminal yang dirujuk oleh serialPort dan menyimpannya dalam struktur termios(serialParams)
{
std::cerr << "Failed to get serial port attributes." << std::endl;
close(serialPort); // menutup koneksi
return 1;
}

serialParams.c_cflag = B230400 | CS8 | CLOCAL | CREAD; // Configure baud rate, data bits, and enable receiver
serialParams.c_iflag = IGNPAR; // Ignore parity errors
serialParams.c_oflag = 0;
serialParams.c_lflag = 0; // Disable ECHO and ICANON for raw data mode

if (tcsetattr(serialPort, TCSANOW, &serialParams) == -1) // termios | mengatur parameter yang terkait dengan terminal | TCSANOW : perubahan segera terjadi
{
std::cerr << "Failed to set serial port attributes." << std::endl;
close(serialPort); // menutup koneksi
return 1;
}

// Send data
const char *dataToSend = "$I\n";

if (write(serialPort, dataToSend, strlen(dataToSend)) < 0) // unistd | menulis pada file
{
printf("Error: Could not write to serial port\n");
return false;
}

// Receive data
char receivedData[256];
ssize_t bytesRead = read(serialPort, receivedData, sizeof(receivedData)); // unistd | membaca dari file

if (bytesRead > 0)
{
receivedData[bytesRead] = '\0'; // Null-terminate the received data
std::cout << "Received: " << receivedData << std::endl;
}
else
{
std::cerr << "Failed to read data from the serial port." << std::endl;
}

close(serialPort); // menutup koneksi

return 0;
}