# CoreX Library - Firmware API

{% hint style="info" %}

* Maksimum data yang dapat dikirim adalah 128 byte secara default. Untuk mengubah ukuran buffer, gunakan pembuatan object seperti `CoreX corex(256);` atau `CoreX corex(256, 512);` tidak hanya sekedar memanggil `CoreX corex;` pada awal kode program kamu. Jika hanya memberikan satu parameter saja maka nilai tersebut berlaku untuk ukuran buffer pada send dan receive sekaligus, jika menggunakan dua parameter maka ukuran buffer send dan receive akan berbeda sesuai nilai yang ditulis.
* Pada ESP8266 menambahkan `delay(10);` setelah `client.loop();` dapat memperbaiki banyak masalah stabilitas WiFi.
  {% endhint %}

## Inisialisasi Penggunaan CoreX

```cpp
corex.begin(Client &client);
```

CoreX dapat digunakan di perangkat apapun selama perangkat tersebut menyediakan implementasi [Client](https://www.arduino.cc/en/Reference/ClientConstructor) based network.&#x20;

## Menghubungkan Ke Server

Untuk dapat terhubung ke CoreX gunakan fungsi `connect`.

```cpp
corex.connect();
```

Fungsi connect juga dapat digunakan untuk memeriksa apakah perangkat sudah berhasil terhubung ke server atau belum.

```cpp
// Tampilkan karakter titik setiap 1 detik selama perangkat tidak terhubung ke server
while (!corex.connect()) {
    Serial.print(".");
    delay(1000);
}
```

## Mendapatkan Data Dari Bucket

Untuk mendapatkan data dari Bucket gunakan fungsi `onMessage` dan buat fungsi receive:

```cpp
corex.onMessage(receive);
```

```cpp
void receive(String &bucket, String &data){
    Serial.println(bucket + " - " + data);
}
```

## Mengirim Data Ke Bucket

Untuk mengirim data dapat menggunakan fungsi `send()`.

```cpp
corex.send("data", "bucket");
```

Dapat juga menggunakan tipe data lainnya.

```cpp
corex.send("abc", "nama_bucket");
corex.send(123, "nama_bucket");
corex.send(12.3, "nama_bucket");
```

Kita juga bisa memeriksa apakah data berhasil dikirim atau tidak.

```cpp
if(corex.send("abc", "nama_bucket")){
    Serial.println("Data berhasil dikirim ke nama_bucket");
} else {
    Serial.println("Data gagal dikirim ke nama_bucket");
}
```

## Periksa Data Diterima

Fungsi ini harus dieksekusi pada `void loop()` agar terus memeriksa apakah ada data yang masuk atau tidak.

```cpp
corex.loop();
```

## Periksa Apakah Perangkat Masih Terhubung

Untuk memeriksa perangkat apakah masih terhubung ke CoreX atau tidak bisa menggunakan fungsi `connected()`.

```cpp
corex.connected();
```

Gunakan pengkondisian `if` untuk memeriksa status.

```cpp
if(!corex.connected()){
    Serial.println("Terputus dari server");
}
```

Fungsi ini dapat digunakan pada `loop()` agar perangkat dapat terus menerus memastikan masih terhubung ke CoreX. Jika tidak terhubung maka lakukan penghubungan ulang ke CoreX.

## Memutuskan Koneksi Dari CoreX

Untuk memutuskan koneksi dapat menggunakan fungsi `disconnected()`.

```cpp
corex.disconnected();
```

Gunakan pengkondisian `if` untuk memeriksa status.

```cpp
if(corex.disconnected()){
    Serial.println("Terputus dari server");
}
```

Fungsi ini dapat digunakan pada loop() agar perangkat dapat terus menerus memastikan masih terhubung ke CoreX. Jika tidak terhubung maka lakukan penghubungan ulang ke CoreX.

## Penggunaan Timer

CoreX menyediakan fitur timer dimana dengan fitur ini kamu bisa mengeksekusi kode program tanpa menggunakan `delay()` ataupun `milis()`.

{% hint style="danger" %}
Dalam proyek yang memerlukan operasi data realtime harus menghindari penggunaan `delay()` karena bersifat *blocking* yang artinya perangkat kamu akan "mogok kerja" tidak akan melakukan apapun selama jeda yang sudah ditentukan pada delay.
{% endhint %}

Untuk menggunakan timer maka kamu perlu membuat objek timer terlebih dahulu.

```cpp
CoreXTimer timer;
```

Selanjutnya pada `void loop()` perlu melakukan pemanggilan fungsi `run()` agar timer dapat dieksekusi.

```cpp
void loop(){
    timer.run();
}
```

### Eksekusi Fungsi Setiap Detik

```cpp
timer.setInterval(1000, namaFungsi);

void namaFungsi(){
    Serial.println("Dieksekusi setiap 1 detik");
}
```

### Eksekusi Fungsi Satu Kali Setelah Beberapa Detik Berlalu

```cpp
timer.setTimeout(1000, namaFungsi);

void namaFungsi(){
    Serila.println("Dieksekusi 1 kali setelah 1 detik berlalu");
}
```

### Eksekusi Fungsi Beberapa Kali Setiap Interval Tertentu

```cpp
timer.setTimer(1000, namaFungsi, 7);

void namaFungsi(){
    Serial.println("Dieksekusi sebanyak 7 kali setiap 1 detik");
}
```
