349 lines
10 KiB
C
349 lines
10 KiB
C
#include "Raindrop.h"
|
|
|
|
const float pi = 3.14159265359;
|
|
//float displayPropellerAngle = 0;
|
|
int displayPropellerAngle = 0;
|
|
int diplayAniTick = 0;
|
|
int diplayAniDropTick = 0;
|
|
|
|
int displayStateTick3 = 0;
|
|
int displayDemoTick = 0;
|
|
|
|
uint32_t footerScrollSpeed = 3;
|
|
String footerText = "";
|
|
uint32_t footerDelayTick = 0;
|
|
int footerX = 4;
|
|
int footerY = 61;
|
|
int footerDisplayLength = 0;
|
|
uint32_t footerScrollTick = 0;
|
|
|
|
void DisplayFooterText(String v){
|
|
if (footerText!=v){
|
|
//reset and delay
|
|
footerX = 4;
|
|
footerText = v;
|
|
footerDisplayLength = DrawTextAtWitdh(v.c_str());
|
|
footerDelayTick = millis();
|
|
footerScrollTick = millis();
|
|
DrawTextAt(footerX, footerY, footerText.c_str());
|
|
}
|
|
|
|
//animation of text
|
|
if (footerDisplayLength<=120){
|
|
DrawTextAt(footerX, footerY, footerText.c_str());
|
|
}else{
|
|
//scrolling animation
|
|
if ((millis()-footerDelayTick) > 2000){
|
|
if (millis()-footerScrollTick >= 20){
|
|
footerScrollTick = millis();
|
|
footerX-=footerScrollSpeed;
|
|
if (footerX+footerDisplayLength+8<0){
|
|
footerScrollTick = millis();
|
|
footerX = 128;
|
|
}
|
|
DrawTextAt(footerX, footerY, footerText.c_str());
|
|
}
|
|
}else{
|
|
DrawTextAt(footerX, footerY, footerText.c_str());
|
|
}
|
|
}
|
|
}
|
|
|
|
String formatTime(int minutes, int seconds) {
|
|
char buffer[6];
|
|
sprintf(buffer, "%02d:%02d", minutes, seconds);
|
|
return String(buffer);
|
|
}
|
|
|
|
String MillisToMMSS(uint32_t v){
|
|
uint32_t sec = v / 1000;
|
|
uint32_t m = sec / 60;
|
|
sec = sec - (m*60);
|
|
String timeString = formatTime(m, sec);
|
|
return timeString;
|
|
}
|
|
|
|
void DashboardRoutine(){
|
|
ClearDisplayBuffer();
|
|
//gambar bingkai
|
|
DrawFrame(0,0,128,64);
|
|
|
|
DrawFrame(0,0,128,12); //kotak kiri atas
|
|
DrawFrame(0,0,43,12); //kotak tengah atas
|
|
DrawFrame(42,0,43,12); //kotak kanan atas
|
|
|
|
DrawFrame(0,52,128,12); //kotak bawah
|
|
|
|
DrawTextAt(4, 9, "pH ---"); //isi dengan PH
|
|
DrawTextAt(46, 9, "NTU ---"); //isi dengan NTU
|
|
DrawTextAt(88, 9, "Auto"); //isi dengan apalah: sinyal wifi kek, sisa batre kek ya apalah gitu. Asal jangan isi dengan perasaanmu padanya.
|
|
|
|
//draw tank ==================================
|
|
int x = 0;
|
|
int y = 15;
|
|
int w = 25;
|
|
int h = 34;
|
|
int gap = 11;
|
|
//int startX = (128 - ((2*(w+gap)) + w)) / 2; //center, ignore pump draw
|
|
int startX = (128 - ((3*(w+gap)) + 0)) / 2; //center includes pump draw
|
|
String v = "";
|
|
for (int i = 0; i<3; i++){
|
|
|
|
//tong
|
|
x = startX + (i*(w+gap));
|
|
//DrawTank(x,y,w,h);
|
|
|
|
//kotak pompa samping
|
|
DrawFrame(x+w-1, y+4, gap+2, gap+2);
|
|
|
|
//animasi ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
bool drawPump = false;
|
|
if (i==0){
|
|
//pompa in 1 (ke tong penampung setelah sterilisasi)
|
|
drawPump = GetSwitchState(STERILIZED_CHAMBER_FILL_PUMP_SWITCH);
|
|
}else if (i==1){
|
|
//pompa in 2 (tong sterilisasi)
|
|
drawPump = GetSwitchState(STERILIZATION_CHAMBER_FILL_PUMP_SWITCH);
|
|
}else{
|
|
//pompa in 3 (tong penampung air kotor)
|
|
drawPump = GetSwitchState(WATER_BANK_FILL_PUMP_SWITCH);
|
|
}
|
|
|
|
if (drawPump){
|
|
//propeller
|
|
drawPropeller(x+w+5,y+4+6,10,displayPropellerAngle);
|
|
//bulatan propeller
|
|
DrawCircle(x+w+5,y+4+6,5);
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
if (i==1){
|
|
//large propeller on tank 2
|
|
bool drawSterilizationFX = false;
|
|
drawSterilizationFX = GetSwitchState(STERILIZATION_OZONE_AND_UV_SWITCH);
|
|
if (drawSterilizationFX){
|
|
//draw big propeller
|
|
drawPropeller(x+(w/2),y+4+17,11,displayPropellerAngle);
|
|
//drawPropeller(x+(w/2),y+4+15,11,displayPropellerAngle+45);
|
|
//draw waves
|
|
DrawCircle(x+(w/2),y+4+17,0+diplayAniTick<10?7+diplayAniTick:10);
|
|
DrawCircle(x+(w/2),y+4+17,5+diplayAniTick<10?5+diplayAniTick:10);
|
|
DrawCircle(x+(w/2),y+4+17,7+diplayAniTick<10?7+diplayAniTick:10);
|
|
}
|
|
}
|
|
|
|
//wave animation on tank 1
|
|
if (i==0){
|
|
bool drawUvFX = false;
|
|
drawUvFX = GetSwitchState(STERILIZED_UV_SWITCH);
|
|
if (drawUvFX){
|
|
DrawCircle(x+(w/2),y+4+17,0+diplayAniTick<10?diplayAniTick:10);
|
|
DrawCircle(x+(w/2),y+4+17,5+diplayAniTick<10?5+diplayAniTick:10);
|
|
DrawCircle(x+(w/2),y+4+17,7+diplayAniTick<10?7+diplayAniTick:10);
|
|
}
|
|
}
|
|
|
|
//draw between empty-lower-upper with xor mode
|
|
int waterState = 0;
|
|
if (i==0){
|
|
//(tong penampung setelah sterilisasi)
|
|
if (GetInSwitchState(STERILIZED_CHAMBER_FLOAT_SWITCH_LOWER)) waterState = 1;
|
|
if (GetInSwitchState(STERILIZED_CHAMBER_FLOAT_SWITCH_UPPER)) waterState = 2;
|
|
}else if (i==1){
|
|
//(tong sterilisasi)
|
|
if (GetInSwitchState(STERILIZATION_CHAMBER_FLOAT_SWITCH_LOWER)) waterState = 1;
|
|
if (GetInSwitchState(STERILIZATION_CHAMBER_FLOAT_SWITCH_UPPER)) waterState = 2;
|
|
}else{
|
|
//(tong penampung air kotor)
|
|
if (GetInSwitchState(WATER_BANK_FLOAT_SWITCH_LOWER)) waterState = 1;
|
|
if (GetInSwitchState(WATER_BANK_FLOAT_SWITCH_UPPER)) waterState = 2;
|
|
}
|
|
//drawing
|
|
if (waterState==1){
|
|
//lower
|
|
DrawTankFilled(x+2,y+(h-10)-2,w-4,10); //h harus minimal radius*2 hedeh
|
|
}else if (waterState==2){
|
|
//upper
|
|
DrawTankFilled(x+2,y+(h-24)-1,w-4,23); //h harus minimal radius*2 hedeh
|
|
}
|
|
|
|
DrawTank(x,y,w,h);
|
|
|
|
if (drawPump){
|
|
//watering animation on all tank
|
|
initRaindrops(6, h-11);
|
|
animateRain(diplayAniDropTick, (x+w)-9, y+7, 6, h-11);
|
|
}
|
|
|
|
//angka pada tong
|
|
v = (String) (i+1);
|
|
DrawTextAt(x+10, y+8, v.c_str());
|
|
}
|
|
//===========================================
|
|
|
|
diplayAniTick++;
|
|
if (diplayAniTick>5) diplayAniTick = 0;
|
|
diplayAniDropTick++;
|
|
if (diplayAniDropTick>8) diplayAniDropTick = 8;
|
|
|
|
if (millis()-displayDemoTick>2000){
|
|
displayDemoTick = millis();
|
|
displayStateTick3++;
|
|
if (displayStateTick3>=3) displayStateTick3 = 0;
|
|
}
|
|
|
|
//footer info
|
|
//ni nih paling susah karena harus sinkronasi sama error dan perubahan text error
|
|
String footerToDisplay = "";
|
|
if (ChamberIsError()){
|
|
footerToDisplay = ChamberErrorString();
|
|
}else if (IsWaterBankError()){
|
|
footerToDisplay = WaterBankErrorString();
|
|
}else{
|
|
if (ChamberIsIdle()){
|
|
if (ChamberIsSuccess()){
|
|
footerToDisplay = "Selesai.";
|
|
}else{
|
|
if (IsWaterBankSystemRunning()){
|
|
footerToDisplay = "Mengisi Tangki 3...";
|
|
}else{
|
|
footerToDisplay = "Sistem siap."; //ready
|
|
}
|
|
}
|
|
}else if (IsChamberSystemRunning()){
|
|
//display state
|
|
if (IsChamberFilling()){
|
|
footerToDisplay = "Mengisi Tangki 2...";
|
|
}else if (IsChamberUnload()){
|
|
footerToDisplay = "Memindahkan ke Tangki 1...";
|
|
}else{
|
|
uint32_t t = GetSterilizationRemainingMillis();
|
|
if (t>0){
|
|
bool onPostUV = OnPostUV();
|
|
bool onOzone = OnOzoneStrelization();
|
|
if (onOzone){
|
|
footerToDisplay = "Sedang Sterilisasi " + MillisToMMSS(t);
|
|
}else if (onPostUV){
|
|
footerToDisplay = "Post UV " + MillisToMMSS(t);
|
|
}else{
|
|
footerToDisplay = "Sedang Sterilisasi..."; //aneh sih kalau disini, dahlah
|
|
}
|
|
}else{
|
|
footerToDisplay = "Sedang Sterilisasi...";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
DisplayFooterText(footerToDisplay);
|
|
//DrawTextAt(4, 61, "Ready.");
|
|
|
|
|
|
SendDisplayBuffer();
|
|
|
|
//displayPropellerAngle+=pi/10;
|
|
//if (displayPropellerAngle>=pi) displayPropellerAngle-=pi;
|
|
displayPropellerAngle-=15;
|
|
if (displayPropellerAngle<=-360) displayPropellerAngle=-(abs(displayPropellerAngle)%360);
|
|
}
|
|
|
|
void DashboardDemoRoutine(){
|
|
ClearDisplayBuffer();
|
|
//gambar bingkai
|
|
DrawFrame(0,0,128,64);
|
|
|
|
DrawFrame(0,0,128,12); //kotak kiri atas
|
|
DrawFrame(0,0,43,12); //kotak tengah atas
|
|
DrawFrame(42,0,43,12); //kotak kanan atas
|
|
|
|
DrawFrame(0,52,128,12); //kotak bawah
|
|
//draw lines for
|
|
|
|
//DrawDashboardBackground(); //not implemented yet
|
|
DrawTextAt(4, 9, "pH 14.0"); //isi dengan PH
|
|
DrawTextAt(46, 9, "NTU 999"); //isi dengan NTU
|
|
DrawTextAt(88, 9, "Auto"); //isi dengan apalah: sinyal wifi kek, sisa batre kek
|
|
|
|
//draw tank ==================================
|
|
int x = 0;
|
|
int y = 15;
|
|
int w = 25;
|
|
int h = 34;
|
|
int gap = 11;
|
|
//int startX = (128 - ((2*(w+gap)) + w)) / 2; //center, ignore pump draw
|
|
int startX = (128 - ((3*(w+gap)) + 0)) / 2; //center includes pump draw
|
|
String v = "";
|
|
for (int i = 0; i<3; i++){
|
|
|
|
//tong
|
|
x = startX + (i*(w+gap));
|
|
//DrawTank(x,y,w,h);
|
|
|
|
//pompa samping
|
|
DrawFrame(x+w-1, y+4, gap+2, gap+2);
|
|
//propeller
|
|
drawPropeller(x+w+5,y+4+6,10,displayPropellerAngle);
|
|
//bulatan propeller
|
|
DrawCircle(x+w+5,y+4+6,5);
|
|
|
|
if (i==1){
|
|
//large propeller on tank 2
|
|
drawPropeller(x+(w/2),y+4+17,11,displayPropellerAngle);
|
|
//drawPropeller(x+(w/2),y+4+15,11,displayPropellerAngle+45);
|
|
DrawCircle(x+(w/2),y+4+17,0+diplayAniTick<10?0+diplayAniTick:10);
|
|
DrawCircle(x+(w/2),y+4+17,5+diplayAniTick<10?5+diplayAniTick:10);
|
|
DrawCircle(x+(w/2),y+4+17,7+diplayAniTick<10?7+diplayAniTick:10);
|
|
}
|
|
|
|
//wave animation on tank 1
|
|
if (i==0){
|
|
DrawCircle(x+(w/2),y+4+17,0+diplayAniTick<10?diplayAniTick:10);
|
|
DrawCircle(x+(w/2),y+4+17,5+diplayAniTick<10?5+diplayAniTick:10);
|
|
DrawCircle(x+(w/2),y+4+17,7+diplayAniTick<10?7+diplayAniTick:10);
|
|
}
|
|
|
|
//draw between empty-lower-upper with xor mode
|
|
if (displayStateTick3==1){
|
|
//lower
|
|
DrawTankFilled(x+2,y+(h-10)-2,w-4,10); //h harus minimal radius*2 hedeh
|
|
}else if (displayStateTick3==2){
|
|
//upper
|
|
DrawTankFilled(x+2,y+(h-24)-1,w-4,23); //h harus minimal radius*2 hedeh
|
|
}
|
|
|
|
DrawTank(x,y,w,h);
|
|
|
|
//watering animation on all tank
|
|
initRaindrops(6, h-11);
|
|
animateRain(diplayAniDropTick, (x+w)-9, y+7, 6, h-11);
|
|
|
|
//angka pada tong
|
|
v = (String) (i+1);
|
|
DrawTextAt(x+10, y+8, v.c_str());
|
|
}
|
|
//===========================================
|
|
|
|
diplayAniTick++;
|
|
if (diplayAniTick>5) diplayAniTick = 0;
|
|
diplayAniDropTick++;
|
|
if (diplayAniDropTick>8) diplayAniDropTick = 8;
|
|
|
|
if (millis()-displayDemoTick>2000){
|
|
displayDemoTick = millis();
|
|
displayStateTick3++;
|
|
if (displayStateTick3>=3) displayStateTick3 = 0;
|
|
}
|
|
|
|
//footer info
|
|
|
|
DrawTextAt(4, 61, "Ready.");
|
|
|
|
SendDisplayBuffer();
|
|
|
|
//displayPropellerAngle+=pi/10;
|
|
//if (displayPropellerAngle>=pi) displayPropellerAngle-=pi;
|
|
displayPropellerAngle-=15;
|
|
if (displayPropellerAngle<=-360) displayPropellerAngle=-(abs(displayPropellerAngle)%360);
|
|
}
|
|
|