public static void On() { // Disable all other buttons and set flag for DISPENSING BUTTON = false; DISPENSING = false; MExceptions mcode = MExceptions.none; // Select position and read bottle data int pos = position.Position; Bottle btl = new Bottle(); btl.Read(pos); // select choice int choice = (position.Volume == Choice.large) ? 3 : (int)position.Volume; // send request if can dispense Ethernet.Request("sn=" + settings.sn.ToString() + "&event=221" + "&time=" + DateTime.Now.Ticks + "&card=" + card.Id + "&bill=" + dispensing.Invoice.ToString() + "&pos=" + pos.ToString() + "&choice=" + choice.ToString() + "&res=" + bottleData.Residue); string residue = bottleData.Residue; // clear bottle data (for sure) bottleData.Clear(); if (DISPENSING) { // read calibration and disable flag for DISPENSING new Calibration().Read(pos); DISPENSING = false; // calculate dispensing time int onTime = httpData.dosevolume * calibData.timeToMl; if (onTime > 0 && onTime < 2000 && TagDetect.IsPresent()) { Buttons.Write(pos, Screen.blank); Buttons.Write(pos, Cmd.Print, 10, 17, 0, 1, " Dispensing"); if (card.Discount != 0) Buttons.Write(pos, Cmd.Print, 10, 33, 0, 1, "Discount " + card.Discount.ToString() + " %"); // starts ventil Buttons.VentilsOnTime(pos, onTime, false); // calculate pricing int price = httpData.doseprice; card.Credit -= price; dispensing.Purchase += price; // calculate wait od program and tarst sleep onTime = ((onTime * 10) + 100); Thread.Sleep(onTime); // show wait please ... because of waiting UniqueId method done Buttons.Write(pos, Cmd.Refresh); Buttons.Write(pos, Cmd.Print, 10, 17, 0, 1, " Wait please"); // save new data to bottle btl.Read(pos); bottleData.residue -= httpData.dosevolume; btl.Save(pos); } else { if (onTime > 0 && onTime < 2000) { mcode = MExceptions.cardRemoved; } else { mcode = MExceptions.calibration; } } // confirm unique ID of last request Ethernet.UniqueId(); btl.Read(pos); // Send confirmDispense or error Ethernet.Request("sn=" + settings.sn.ToString() + "&event=201" + "&time=" + DateTime.Now.Ticks + "&card=" + card.Id + "&bill=" + dispensing.Invoice.ToString() + "&pos=" + pos.ToString() + "&choice=" + choice.ToString() + "&res=" + residue + (string)((mcode != MExceptions.none) ? "&mcode=" + mcode.ToString() : String.Empty)); // confirm unique ID of last request Ethernet.UniqueId(); // write new credit and purchase to alll buttons Buttons.CrePurch(ALL, (int)card.Credit, dispensing.Purchase); if (TagDetect.IsPresent()) { PosStates(Screen.credit, true); } else { PosStates(Screen.prices); } } else if (!DISPENSING && httpData.exception != String.Empty) { int[] displayed = PosStates(Screen.credit, true, true); if(displayed[pos] == 1) { Buttons.Write(pos, Screen.blank); }else { Buttons.Write(pos, Cmd.Refresh); } ExceptionToDisp(httpData.errcode, pos); PosStates(Screen.credit, true); httpData.Clear(); } BUTTON = true; }
public void Pointer(Choice choice, int pos, bool refresh = true) { for (int p = 1; p <= settings.positions; p++) { if (pos != ALL && pos != p) { continue; } switch (posScreen[p]) { case MenuScreen.SELMENU: if (p == settings.positions) { switch (choice) { case Choice.small: case Choice.medium: ActualPosPointer(p, 2); Buttons.Write(p, Cmd.Print, 0, 1, 1, (posPointer[p] == 0) ? 0 : 1, " "); Buttons.Write(p, Cmd.Print, 0, 17, 1, (posPointer[p] == 1) ? 0 : 1, " "); break; case Choice.large: switch (posPointer[p]) { case 0: // Service menu for (int i = 0; i <= settings.positions; i++) { posScreen[i] = MenuScreen.SERVICE; posPointer[i] = 0; } Buttons.Write(settings.positions, Cmd.Refresh); Pointer(Choice.none, ALL, false); break; case 1: // System menu posPointer[p] = 0; posScreen[p] = MenuScreen.SYSTEM; Pointer(Choice.none, p); break; } break; default: if (!refresh) { Buttons.Write(p, Screen.blank); } else { Buttons.Write(p, Cmd.Refresh); } Buttons.Write(p, Cmd.Print, 0, 1, 1, (posPointer[p] == 0) ? 0 : 1, " "); Buttons.Write(p, Cmd.Print, 0, 17, 1, (posPointer[p] == 1) ? 0 : 1, " "); Buttons.Write(p, Cmd.Print, 10, 1, 0, 1, MenuSel[0]); Buttons.Write(p, Cmd.Print, 10, 17, 0, 1, MenuSel[1]); Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " list ok"); break; } } break; case MenuScreen.SERVICE: // service menu switch (choice) { case Choice.small: // list ActualPosPointer(p, 3); Buttons.Write(p, Cmd.Print, 0, 1, 1, (posPointer[p] == 0) ? 0 : 1, " "); Buttons.Write(p, Cmd.Print, 0, 17, 1, (posPointer[p] == 1) ? 0 : 1, " "); Buttons.Write(p, Cmd.Print, 0, 33, 1, (posPointer[p] == 2) ? 0 : 1, " "); break; case Choice.medium: if (card.Role == CardRole.Master) { ResetMenu(); MENUSHOWED = true; posScreen[settings.positions] = MenuScreen.SELMENU; Buttons.Write(ALL, Screen.service); Pointer(Choice.none, settings.positions, false); } break; case Choice.large: // ok switch (posPointer[p]) { case 0: // BTL change posScreen[p] = MenuScreen.BTL; break; case 1: // calibration posScreen[p] = MenuScreen.CAL; break; case 2: // cleaning Cleaning[p] = STATE.Off; posScreen[p] = MenuScreen.CLEAN; break; } posPointer[p] = 0; Pointer(Choice.none, p); break; default: if (!refresh) { Buttons.Write(p, Screen.blank); } else { Buttons.Write(p, Cmd.Refresh); } Buttons.Write(p, Cmd.Print, 0, 1, 1, 0, " "); Buttons.Write(p, Cmd.Print, 0, 17, 1, 1, " "); Buttons.Write(p, Cmd.Print, 0, 33, 1, 1, " "); Buttons.Write(p, Cmd.Print, 10, 1, 0, 1, main[0]); Buttons.Write(p, Cmd.Print, 10, 17, 0, 1, main[1]); Buttons.Write(p, Cmd.Print, 10, 33, 0, 1, main[2]); if (card.Role == CardRole.Master) { Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " list back ok"); } else { Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " list ok"); } break; } break; case MenuScreen.SYSTEM: // system menu if (p == settings.positions) { switch (choice) { case Choice.small: // list ActualPosPointer(p, 3); Buttons.Write(p, Cmd.Print, 0, 1, 1, (posPointer[p] == 0) ? 0 : 1, " "); Buttons.Write(p, Cmd.Print, 0, 17, 1, (posPointer[p] == 1) ? 0 : 1, " "); Buttons.Write(p, Cmd.Print, 0, 33, 1, (posPointer[p] == 2) ? 0 : 1, " "); break; case Choice.medium: // BACK TO SELECTION MENU posPointer[p] = 0; posScreen[p] = MenuScreen.SELMENU; Pointer(Choice.none, p); break; case Choice.large: // ok switch (posPointer[p]) { case 0: // Date posScreen[p] = MenuScreen.DATE; break; case 1: // time posScreen[p] = MenuScreen.TIME; break; case 2: // info 1 posScreen[p] = MenuScreen.INFO1; break; } posPointer[p] = 0; Pointer(Choice.none, p); break; default: Buttons.Write(p, Cmd.Refresh); Buttons.Write(p, Cmd.Print, 0, 1, 1, 0, " "); Buttons.Write(p, Cmd.Print, 0, 17, 1, 1, " "); Buttons.Write(p, Cmd.Print, 0, 33, 1, 1, " "); Buttons.Write(p, Cmd.Print, 10, 1, 0, 1, main[3]); Buttons.Write(p, Cmd.Print, 10, 17, 0, 1, main[4]); Buttons.Write(p, Cmd.Print, 10, 33, 0, 1, main[5]); Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " list back ok"); break; } } break; case MenuScreen.BTL: switch (choice) { case Choice.small: ActualPosPointer(p, 2); Buttons.Write(p, Cmd.Refresh); Buttons.Write(p, Cmd.Print, 0, 1, 1, (posPointer[p] == 0) ? 0 : 1, " "); Buttons.Write(p, Cmd.Print, 0, 17, 1, (posPointer[p] == 1) ? 0 : 1, " "); Buttons.Write(p, Cmd.Print, 10, 1, 0, 1, bottleData.Residue + " -> " + bottleData.Volume + " ml"); Buttons.Write(p, Cmd.Print, 10, 17, 0, 1, bottleData.Residue + " -> ? ml"); if (posPointer[p] == 0) { Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " list change back"); } else if (posPointer[p] == 1) { Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " list select back"); } break; case Choice.medium: if (posPointer[p] == 0) { Buttons.Write(p, Cmd.Refresh); Buttons.Write(pos, Cmd.Print, 10, 17, 0, 1, " Wait please"); BUTTON = false; Bottle btl = new Bottle(); btl.Read(pos); bottleData.residue = bottleData.volume; bottleData.isclosed = 0; btl.Save(pos); new Log().WriteLogg("t=" + DateTime.Now.ToString("HH:mm:ss") + "&c=" + card.Id + "&ev=102" + "&b=" + pos + "&v=" + bottleData.Residue); bottleData.Clear(); Pointer(Choice.none, p); BUTTON = true; } else if (posPointer[p] == 1) { posPointer[p] = 0; posScreen[p] = MenuScreen.BTLOWN; oresidue = bottleData.residue; bottleData.residue = bottleData.volume; Pointer(Choice.none, p); } break; case Choice.large: posPointer[p] = 0; posScreen[p] = MenuScreen.SERVICE; Pointer(Choice.none, p); BTLMENU = 0; bottleData.Clear(); break; default: if (BTLMENU == 0 || BTLMENU == p) // Není manipulováno s jinou pozicí v rámci bottleData nebo calibData lze manipulovat jenom s jednou lahví naráz { BTLMENU = p; new Bottle().Read(p); Buttons.Write(p, Cmd.Refresh); Buttons.Write(p, Cmd.Print, 0, 1, 1, 0, " "); Buttons.Write(p, Cmd.Print, 0, 17, 1, 1, " "); Buttons.Write(p, Cmd.Print, 10, 1, 0, 1, bottleData.Residue + " -> " + bottleData.Volume + " ml"); Buttons.Write(p, Cmd.Print, 10, 17, 0, 1, bottleData.Residue + " -> ? ml"); if (posPointer[p] == 0) { Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " list change back"); } else if (posPointer[p] == 1) { Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " list select back"); } } else { posScreen[p] = MenuScreen.SERVICE; } break; } break; case MenuScreen.BTLOWN: switch (choice) { case Choice.small: if (submenu) { // Plus bottleData.residue = bottleData.residue.AddTo(posPointer[p], 4, 1, bottleData.volume); writeResidue(p); } else { // List AddToPointer(p, 4); writeResidue(p); } break; case Choice.medium: if (submenu) { // Minus bottleData.residue = bottleData.residue.AddTo(posPointer[p], 4, -1, bottleData.volume); writeResidue(p); } else { // To submenu submenu = true; writeResidue(p); } break; case Choice.large: if (submenu) { submenu = false; writeResidue(p); } else { Buttons.Write(p, Cmd.Refresh); Buttons.Write(p, Cmd.Print, 10, 17, 0, 1, " Wait please"); BUTTON = false; bottleData.isclosed = 0; new Bottle().Save(pos); new Log().WriteLogg("t=" + DateTime.Now.ToString("HH:mm:ss") + "&c=" + card.Id + "&ev=102" + "&b=" + pos + "&v=" + bottleData.Residue); bottleData.Clear(); submenu = false; posScreen[p] = MenuScreen.BTL; posPointer[p] = 0; BTLMENU = 0; Pointer(Choice.none, p); BUTTON = true; } break; default: writeResidue(p); break; } break; case MenuScreen.CAL: switch (choice) { case Choice.small: if (DISPENDING) { Buttons.VentilsOnTime(p, 10); // 10 sec výdej Thread.Sleep(10500); DISPENDING = false; submenu = false; writeCalib(p); } else { if (submenu) { // Plus calibData.mlFor10sec = calibData.mlFor10sec.AddTo(posPointer[p], 3, 1, calibData.maxValue); writeCalib(p); } else { // List AddToPointer(p, 3); writeCalib(p); } } break; case Choice.medium: if (!DISPENDING) { if (submenu) { // Minus calibData.mlFor10sec = calibData.mlFor10sec.AddTo(posPointer[p], 3, -1, calibData.maxValue); writeCalib(p); } else { // To submenu submenu = true; writeCalib(p); } } else { DISPENDING = false; submenu = false; writeCalib(p); } break; case Choice.large: if (!DISPENDING) { if (submenu) { submenu = false; writeCalib(p); } else { calibData.SetTime(); new Calibration().Save(p); posPointer[p] = 0; posScreen[p] = MenuScreen.SERVICE; Pointer(Choice.none, p); BTLMENU = 0; submenu = false; new Log().WriteLogg("t=" + DateTime.Now.ToString("HH:mm:ss") + "&c=" + card.Id + "&ev=103" + "&b=" + p + "&ch=123&ms=" + calibData.timeToMl.ToString("F3")); calibData.Clear(); } } break; default: if (BTLMENU == 0 || BTLMENU == p) // Není manipulováno s jinou pozicí v rámci bottleData nebo calibData lze manipulovat jenom s jednou lahví naráz { BTLMENU = p; new Calibration().Read(p); DISPENDING = true; writeCalib(p); } else { posScreen[p] = MenuScreen.SERVICE; } break; } break; case MenuScreen.CLEAN: switch (choice) { case Choice.small: if (onVentils < 5) { Buttons.VentilsOnOff(p, STATE.On); onVentils++; Cleaning[p] = STATE.On; Pointer(Choice.none, p); } break; case Choice.medium: break; case Choice.large: if (Cleaning[p] == STATE.On) { Buttons.VentilsOnOff(p, STATE.Off); Cleaning[p] = STATE.Off; Pointer(Choice.none, p); onVentils--; } else { posScreen[p] = MenuScreen.SERVICE; Pointer(Choice.none, p); Cleaning[p] = STATE.Off; } break; default: if (refresh) { Buttons.Write(p, Cmd.Refresh); } if (Cleaning[p] == STATE.Off) { Buttons.Write(p, Cmd.Print, 25, 1, 0, 1, "Press start"); Buttons.Write(p, Cmd.Print, 15, 17, 0, 1, "for dispensing"); Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " start back"); } else { Buttons.Write(p, Cmd.Print, 25, 1, 0, 1, "Press stop"); Buttons.Write(p, Cmd.Print, 30, 17, 0, 1, "for end"); Buttons.Write(p, Cmd.Print, 20, 33, 0, 1, "dispensing"); Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, "----------- stop"); } break; } break; case MenuScreen.DATE: // date if (p == settings.positions) { switch (choice) { case Choice.small: if (submenu) { // Plus SelectedDate = SelectedDate.AddTo(posPointer[p], 8, 1, 31122099); writeDate(false); } else { // List AddToPointer(settings.positions, 8, 3, 2); writeDate(true); } break; case Choice.medium: if (submenu) { // Minus SelectedDate = SelectedDate.AddTo(posPointer[p], 8, -1, 31122099); writeDate(false); } else { // To submenu submenu = true; writeDate(false); } break; case Choice.large: if (submenu) { // Back submenu = false; writeDate(false); } else { // Save submenu = false; SelectedTime = int.Parse(DateTime.Now.ToString("HHmmss")); if (saveDateTime()) { posScreen[p] = MenuScreen.SELMENU; posPointer[p] = 1; Pointer(Choice.large, p); } else { Buttons.Write(p, Cmd.Refresh); Buttons.Write(p, Cmd.Print, 28, 17, 1, 1, "Wrong date"); Thread.Sleep(2000); Pointer(Choice.none, p); } } break; default: SelectedDate = int.Parse(DateTime.Now.ToString("ddMMyyyy")); datePointer = -1; writeDate(true); break; } } break; case MenuScreen.TIME: // time if (p == settings.positions) { switch (choice) { case Choice.small: if (submenu) { // Plus SelectedTime = SelectedTime.AddTo(posPointer[pos], 6, 1, 235959); writeTime(false); } else { // List AddToPointer(settings.positions, 6); writeTime(true); } break; case Choice.medium: if (submenu) { // Minus SelectedTime = SelectedTime.AddTo(posPointer[pos], 6, -1, 235959); writeTime(false); } else { // To submenu submenu = true; writeTime(false); } break; case Choice.large: // ok if (submenu) { submenu = false; writeTime(false); } else { submenu = false; SelectedDate = int.Parse(DateTime.Now.ToString("ddMMyyyy")); saveDateTime(); posScreen[p] = MenuScreen.SELMENU; posPointer[p] = 1; Pointer(Choice.large, p); } break; default: SelectedTime = int.Parse(DateTime.Now.ToString("HHmmss")); timePointer = -1; writeTime(true); break; } } break; case MenuScreen.INFO1: // info 1 if (p == settings.positions) { switch (choice) { case Choice.small: posPointer[p] = 0; posScreen[p] = MenuScreen.INFO2; Pointer(Choice.none, p); break; case Choice.large: posScreen[p] = 0; posPointer[p] = 1; Pointer(Choice.large, p); break; default: Buttons.Write(p, Cmd.Refresh); Buttons.Write(p, Cmd.Print, 0, 1, 0, 1, "Serial: " + settings.sn.ToString()); Thread.Sleep(10); Buttons.Write(p, Cmd.Print, 0, 17, 0, 1, "Company: " + settings.company.ToString()); Thread.Sleep(10); Buttons.Write(p, Cmd.Print, 0, 33, 0, 1, "Firmware: " + ver); Thread.Sleep(10); Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " next ok"); break; } } break; case MenuScreen.INFO2: // info 2 if (p == settings.positions) { switch (choice) { case Choice.small: posScreen[p] = MenuScreen.SYSTEM; posPointer[p] = 2; Pointer(Choice.large, p); break; case Choice.large: posScreen[p] = MenuScreen.SELMENU; posPointer[p] = 1; Pointer(Choice.large, p); break; default: Buttons.Write(p, Cmd.Refresh); Buttons.Write(p, Cmd.Print, 0, 1, 0, 1, "Reader: " + ReaderFw); Thread.Sleep(10); Buttons.Write(p, Cmd.Print, 0, 49, 0, 1, " back ok"); break; } } break; } } }
public static void On() { // Disable all other buttons BUTTON = false; // Select position and read bottle data int pos = position.Position; Bottle btl = new Bottle(); btl.Read(pos); // Exception handle ExceptionCode exception = ExceptionCode.None; // select choice int dosevolume = bottleData.GetVolume(position.Volume); int price = bottleData.GetPrice(position.Volume); // read calibration and disable flag for DISPENSING new Calibration().Read(pos); // calculate dispensing time int onTime = dosevolume * calibData.timeToMl; if ((bottleData.residue - dosevolume) >= bottleData.minRes) { if (TagDetect.IsPresent()) { if (onTime > 0 && onTime < 2000) { if ((card.Credit - price) >= 0) { Buttons.Write(pos, Screen.blank); Buttons.Write(pos, Cmd.Print, 10, 17, 0, 1, " Dispensing"); if (card.Discount != 0) Buttons.Write(pos, Cmd.Print, 10, 33, 0, 1, "Discount " + card.Discount.ToString() + " %"); // starts ventil Buttons.VentilsOnTime(pos, onTime, false); // calculate pricing card.Credit -= price; dispensing.Purchase += price; Reader.WriteCredit(card.Credit); // calculate wait od program and tarst sleep onTime = ((onTime * 10) + 100); Thread.Sleep(onTime); // show wait please ... because of waiting UniqueId method done Buttons.Write(pos, Cmd.Refresh); Buttons.Write(pos, Cmd.Print, 10, 17, 0, 1, " Wait please"); // save new data to bottle btl.Read(pos); bottleData.residue -= dosevolume; btl.Save(pos); bottleData.Clear(); // write new credit and purchase to alll buttons Buttons.CrePurch(ALL, (int)card.Credit, dispensing.Purchase); //Buttons.Write(ALL, Cmd.Refresh); // zapsat do Logu new Log().WriteLogg("t=" + DateTime.Now.ToString("HH:mm:ss") + "&c=" + card.Id + "&ev=101" + "&b=" + pos + "&r=" + bottleData.Residue + "&ch=" + ((position.Volume != Choice.large) ? (int)position.Volume : 3).ToString() + "&p=" + price); if (TagDetect.IsPresent()) { PosStates(Screen.credit, true); } else { PosStates(Screen.prices); } }else { exception = ExceptionCode.CreditInsufficient; } } else { exception = ExceptionCode.WrongCalibration; } }else { exception = ExceptionCode.CardMissing; } }else { exception = ExceptionCode.ResidueLow; } if (exception > ExceptionCode.None) { int[] displayed = PosStates(Screen.credit, true, true); if (displayed[pos] == 1) { Buttons.Write(pos, Screen.blank); } else { Buttons.Write(pos, Cmd.Refresh); } ExceptionToDisp(exception, pos); PosStates(Screen.credit, true); } BUTTON = true; }
public static bool HW_Init() { // LEDS OutPorts = new OutputPort[6]; OutPorts[(int)PINS.led_A] = new OutputPort(Pins.GPIO_PIN_A0, false); // Buttons RS485 OutPorts[(int)PINS.led_B] = new OutputPort(Pins.GPIO_PIN_A1, false); // WatchDog OutPorts[(int)PINS.led_C] = new OutputPort(Pins.GPIO_PIN_A2, false); // Ethernet OutPorts[(int)PINS.led_D] = new OutputPort(Pins.GPIO_PIN_A3, false); // Reader OutPorts[(int)PINS.Out_D9] = new OutputPort(Pins.GPIO_PIN_D9, true); // OutPorts[(int)PINS.RxTx] = new OutputPort(Pins.GPIO_PIN_D4, false); // DebugPrint("PINS SETTINGS ...... inicialized"); // RTC try { rtc = new DS1307(); rtc.Synchronize(); Program.start = DateTime.Now; DebugPrint("RTC ................ inicialized, date and time: " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")); } catch { DebugPrint("RTC ................ failed"); } // WatchDog wdt = new WatchDog(); // Reader Reader.Init(); ReaderFw = Reader.GetFirmware(); DebugPrint("RFID ............... " + ReaderFw); // SD card SecureDigital.TreeCheck(); DebugPrint("SECURE DIGITAL ..... inicialized"); // RS485 if (Buttons.Init()) { Buttons.Write(ALL, Screen.main); DebugPrint("RS485 .............. inicialized"); } else { DebugPrint("RS485 .............. failed"); } DebugPrint("LOADING SETTINGS ... waiting"); // Read data from SD card new Settings().Read(); DebugPrint("LOADING SETTINGS ... loaded"); // Check for files for (int i = 1; i <= settings.positions; i++) { SecureDigital.FileExists(@"SD\bottles\", "btl_" + i.ToString()); SecureDigital.FileExists(@"SD\calibration\", "cal_" + i.ToString()); } // Check buttons present for (int i = 1; i <= settings.positions; i++) { string result = String.Empty; bool res = (Buttons.Write(i)); allbuttons = (!allbuttons) ? false : res; result = (res) ? " respond" : " not respond"; DebugPrint("Position " + i.ToString() + result); } DebugPrint("LOADING BOTTLES .... waiting"); // Posílám dotaz nanastavení 5x for (int i = 1; i <= settings.positions; i++) { bottleData.Clear(); Bottle btl = new Bottle(); btl.Read(i); bottleData.position = i; Buttons.SendSettings(); bottleData.Clear(); } DebugPrint("LOADING BOTTLES .... loaded"); return true; }