/*
  Program     : ...
  Dibuat Oleh : ...
  Tanggal     : ...
  Keterangan  : ...
*/

// Deklarasi semua Variable Bersama
// Tulis semua Variable bersama di sini

float HallFR=0;     // Sensor Hall Effect Kanan Depan
float HallFL=0;
float HallRR=0;     // Sensor Hall Effect Kanan Belakang
float HallRL=0;

float Baterai=0;    // Tegangan Baterai

float RemoteT=0;    // misalkan, data dari Remote Control
float RemoteB=0;
float RemoteC=0;    // Perintah dari Remote Control

float BLDCR=0;      // Nilai BLDC Kanan
float BLDCL=0;

float LoadCell=0;   // Sensor Hall Effect atau lainnya

float Kecepatan=0;  // Kecepatan Longboard saat ini
float SetPoint=0;   // Setting Point Kecepatan dari bagian Safety
                    // sesuai dengan Mode yang diputuskan
                    // Akan digunakan pada bagian Control

#define HOLD  0     // HOLD Mode
#define WALK  1     // WALK Mode
#define RUN   2     // RUN Mode
#define BREAK 3     // BREAK Mode
#define SLIP  4     // SLIP Mode

float Mode=HOLD;    // Mode Operasi sesuai hasil keputusan bagian Safety
                    // Akan digunakan pada bagian Control

void SetupSafety();
void Safety();
void TestSafety();

void SetupControl();
void Control();
void TestControl();

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);

  // Inisialisasi bersama ...
  // Misalkan menampilkan Tulisan tertentu atau Say Hello
  // Atau lainnya

  SetupSafety();        // Jalankan Inisialisasi bagian Safety 
  SetupControl();       // Jalankan Inisialisasi bagian Control
}

void loop()
{
  // Dua bagian program dijalankan secara bergantian
  // Setiap bagian tidak boleh ada loop yang panjang
  // karena akan mengganggu bagian lain

  Safety();     // Jalankan semua proses yang berkaitan dengan Safety
  Control();    // Jalankan semua proses yang berkaitan dengan Control

  // Bagian proses bersama, misalkan menampilkan data ke LCD
  // Bagian ini juga bisa dilakukan secara terpisah
  // pada proses Safety() dan Coontrol()
  
  // WriteLCD ...
  // SendRemote ...
  // SendIoT ...
}

//
// ================================================================
// Bagian Safety
//

void SetupSafety()
{
  // Semua inisialisasi untuk bagian Safety
}

void Safety()
{
  // Semua proses untuk bagian Safety
  // Tidak boleh ada loop yang panjang

  // Baca Sensor Tegangan Bateray
  // Baca Sensor Load Cell
  // Baca Sensor Hall Effect
  // Hitung kecepatan Roda Belakang
  // Hitung Kecepatan Roda Depan
  // Baca data dari Remote Control
  // ...

  // Proses pengecekan semua kondisi sensor
  // Keputusan ... Mode = ? dan SetPoint = ?

  // Tampilkan data-data yang diperlukan ke LCD atau Remote atau IoT,
  // agar mudah untuk dilakukan pengecekan/pengujian bagian Safety

  TestSafety();   // bisa dibuang kalau tidak diperlukan
}

void TestSafety()
{
  // prosedur untuk menguji bagian Safety, bersifat sementara
  // kalau tidak diperlukan, bisa dibuang
}

//
// ================================================================
// Bagian Control
//

void SetupControl()
{
  // Semua inisialisasi untuk bagian Control
}

void Control()
{
  // Semua proses untuk bagian Control
  // Tidak boleh ada loop yang panjang

  // Cek Status Mode dari bagian Safety
  // Lakukan operasi kontrol sesuai Mode Operasi
  // Gunakan kontroler PID
  // Jalankan motor BLDC

  // Tampilkan data-data yang diperlukan ke LCD atau Remote atau IoT,
  // agar mudah untuk dilakukan pengecekan/pengujian bagian Safety

  TestControl();    // bisa dibuang kalau tidak diperlukan
}

void TestControl()
{
  // prosedur untuk menguji bagian Control, bersifat sementara
  // kalau tidak diperlukan, bisa dibuang
}

esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK