' ebacCalculator.bas Version 2.0 10/14/2021 '----------------------------------------------------------------------------------- ' PROGRAM: ebacCalculator.bas ' AUTHOR: George McGinn ' ' DATE WRITTEN: 04/01/2021 ' VERSION: 2.0 ' PROJECT: Estimated Blood-Alcohol Content Calculator ' ' DESCRIPTION: Program shows many of the functions of using InForm while using ' most of the original code from the Zenity project. This can now ' run on all systems (Linux, MAC and Windows). ' ' Written by George McGinn ' Copyright (C)2021 by George McGinn - All Rights Reserved ' Version 1.0 - Created 04/01/2021 ' Version 2.0 - Created 10/14/2021 ' ' CHANGE LOG '----------------------------------------------------------------------------------- ' 04/01/2021 v1.0 GJM - New Program (TechBASIC and C++ Versions). ' 06/19/2021 v1.5 GJM - Updated to use Zenity and SHELL commands to run on Linux with ' a simple GUI. ' 10/14/2021 v2.0 GJM - Updated to use InForm GUI in place of Zenity an SHELL commands. ' Can now run on any OS '----------------------------------------------------------------------------------- ' Copyright (C)2021 by George McGinn. All Rights Reserved. ' ' untitled.bas by George McGinn is licensed under a Creative Commons ' Attribution-NonCommercial 4.0 International. (CC BY-NC 4.0) ' ' Full License Link: https://creativecommons.org/licenses/by-nc/4.0/legalcode ' '----------------------------------------------------------------------------------- ' PROGRAM NOTES ' ': This program uses ': InForm - GUI library for QB64 - v1.3 ': Fellippe Heitor, 2016-2021 - fellippe@qb64.org - @fellippeheitor ': https://github.com/FellippeHeitor/InForm '----------------------------------------------------------------------------------- ': Controls' IDs: ------------------------------------------------------------------ DIM SHARED maleRB AS LONG DIM SHARED femaleRB AS LONG DIM SHARED AgreeCB AS LONG DIM SHARED AGREEBT AS LONG DIM SHARED ebacFRM AS LONG DIM SHARED SexLB AS LONG DIM SHARED weightLB AS LONG DIM SHARED nbrdrinksLB AS LONG DIM SHARED timeLB AS LONG DIM SHARED EnterInformationLB AS LONG DIM SHARED WeightTB AS LONG DIM SHARED nbrDrinksTB AS LONG DIM SHARED TimeTB AS LONG DIM SHARED CancelBT AS LONG DIM SHARED OKBT AS LONG DIM SHARED HELPBT AS LONG DIM SHARED QUITBT AS LONG DIM SHARED displayResults AS LONG DIM SHARED informationLB AS LONG ': User-defined Variables: --------------------------------------------------------- DIM SHARED AS STRING HELPFile DIM SHARED AS INTEGER SOBER, legalToDrive DIM SHARED AS STRING Sex DIM SHARED AS DOUBLE A, T DIM SHARED AS SINGLE B, OZ, Wt, EBAC DIM SHARED AS STRING helpcontents, prt_text ': External modules: --------------------------------------------------------------- '$INCLUDE:'../../InForm/InForm.bi' '$INCLUDE:'ebacCalculator.frm' '$INCLUDE:'../../InForm/InForm.ui' ': Event procedures: --------------------------------------------------------------- SUB __UI_BeforeInit END SUB SUB __UI_OnLoad ' *** Initialize Variables A = 0 Wt = 0 B = .0 T = 0: St = 0 I = 0 Bdl = 1.055 OZ = .5 SOBER = FALSE: legalToDrive = FALSE HELPFile = "EBACHelp.txt" displayDisclaimer END SUB SUB __UI_BeforeUpdateDisplay 'This event occurs at approximately 60 frames per second. 'You can change the update frequency by calling SetFrameRate DesiredRate% END SUB SUB __UI_BeforeUnload 'If you set __UI_UnloadSignal = False here you can 'cancel the user's request to close. END SUB SUB __UI_Click (id AS LONG) SELECT CASE id CASE ebacFRM CASE SexLB CASE weightLB CASE nbrdrinksLB CASE timeLB CASE EnterInformationLB CASE WeightTB CASE nbrDrinksTB CASE TimeTB CASE informationLB CASE displayResults CASE AgreeCB CASE maleRB Sex = "M" CASE femaleRB Sex = "F" CASE AGREEBT Answer = MessageBox("Do you want to perform another calculation? ", "", MsgBox_YesNo + MsgBox_Question) IF Answer = MsgBox_Yes THEN Control(AgreeCB).Value = FALSE Control(AGREEBT).Disabled = TRUE ELSE Answer = MessageBox("Thank You for using EBAC Calculator. Please Don't Drink and Drive.", "", MsgBox_Ok + MsgBox_Information) SYSTEM END IF CASE CancelBT ResetForm CASE OKBT IF Control(maleRB).Value = FALSE AND Control(femaleRB).Value = FALSE THEN Answer = MessageBox("Invalid: You must select either M (male) or F (female). Please Correct.", "", MsgBox_Ok + MsgBox_Information) EXIT SUB END IF A = Control(nbrDrinksTB).Value Wt = Control(WeightTB).Value T = Control(TimeTB).Value calcEBAC Control(QUITBT).Disabled = TRUE ResetList displayResults Text(displayResults) = prt_text CASE HELPBT ResetList displayResults IF _FILEEXISTS(HELPFile) THEN DIM fh AS LONG fh = FREEFILE OPEN HELPFile FOR INPUT AS #fh DO UNTIL EOF(fh) LINE INPUT #fh, helpcontents AddItem displayResults, helpcontents LOOP CLOSE #fh Control(displayResults).LastVisibleItem = 0 ELSE Answer = MessageBox("HELP File " + HELPFile$ + " Not Found ", "", MsgBox_Ok + MsgBox_Question) SYSTEM 1 END IF CASE QUITBT Answer = MessageBox("Are you sure you want to QUIT? ", "", MsgBox_YesNo + MsgBox_Question) IF Answer = MsgBox_Yes THEN Answer = MessageBox("Thank You for using EBAC Calculator. Please Don't Drink and Drive.", "", MsgBox_Ok + MsgBox_Information) SYSTEM END IF END SELECT END SUB SUB __UI_MouseEnter (id AS LONG) END SUB SUB __UI_MouseLeave (id AS LONG) END SUB SUB __UI_FocusIn (id AS LONG) END SUB SUB __UI_FocusOut (id AS LONG) 'This event occurs right before a control loses focus. 'To prevent a control from losing focus, set __UI_KeepFocus = True below. END SUB SUB __UI_MouseDown (id AS LONG) END SUB SUB __UI_MouseUp (id AS LONG) END SUB SUB __UI_KeyPress (id AS LONG) 'When this event is fired, __UI_KeyHit will contain the code of the key hit. 'You can change it and even cancel it by making it = 0 END SUB SUB __UI_TextChanged (id AS LONG) SELECT CASE id CASE WeightTB Control(AgreeCB).Value = FALSE Control(AGREEBT).Disabled = TRUE CASE nbrDrinksTB Control(AgreeCB).Value = FALSE Control(AGREEBT).Disabled = TRUE CASE TimeTB Control(AgreeCB).Value = FALSE Control(AGREEBT).Disabled = TRUE END SELECT END SUB SUB __UI_ValueChanged (id AS LONG) SELECT CASE id CASE displayResults CASE maleRB Control(AgreeCB).Value = FALSE Control(AGREEBT).Disabled = TRUE CASE femaleRB Control(AgreeCB).Value = FALSE Control(AGREEBT).Disabled = TRUE CASE AgreeCB IF Control(AgreeCB).Value = TRUE THEN Control(AGREEBT).Disabled = FALSE Control(QUITBT).Disabled = FALSE ELSE Control(AGREEBT).Disabled = TRUE Control(QUITBT).Disabled = TRUE END IF END SELECT END SUB SUB __UI_FormResized END SUB ': User FUNCTIONS/SUBROUTINES: --------------------------------------------------------------- SUB displayDisclaimer ' prt_text = "*** DISCLAIMER ***" + CHR$(10) prt_text = "Unless otherwise separately undertaken by the Licensor, to the extent" + CHR$(10) prt_text = prt_text + "possible, the Licensor offers the Licensed Material as-is and" + CHR$(10) prt_text = prt_text + "as-available, and makes no representations or warranties of any kind" + CHR$(10) prt_text = prt_text + "concerning the Licensed Material, whether express, implied, statutory," + CHR$(10) prt_text = prt_text + "or other. This includes, without limitation, warranties of title," + CHR$(10) prt_text = prt_text + "merchantability, fitness for a particular purpose, non-infringement," + CHR$(10) prt_text = prt_text + "absence of latent or other defects, accuracy, or the presence or absence" + CHR$(10) prt_text = prt_text + "of errors, whether or not known or discoverable. Where disclaimers of" + CHR$(10) prt_text = prt_text + "warranties are not allowed in full or in part, this disclaimer may not" + CHR$(10) prt_text = prt_text + "apply to You." + CHR$(10) + CHR$(10) prt_text = prt_text + "To the extent possible, in no event will the Licensor be liable to You" + CHR$(10) prt_text = prt_text + "on any legal theory (including, without limitation, negligence) or" + CHR$(10) prt_text = prt_text + "otherwise for any direct, special, indirect, incidental, consequential," + CHR$(10) prt_text = prt_text + "punitive, exemplary, or other losses, costs, expenses, or damages" + CHR$(10) prt_text = prt_text + "arising out of this Public License or use of the Licensed Material, even" + CHR$(10) prt_text = prt_text + "if the Licensor has been advised of the possibility of such losses," + CHR$(10) prt_text = prt_text + "costs, expenses, or damages. Where a limitation of liability is not" + CHR$(10) prt_text = prt_text + "allowed in full or in part, this limitation may not apply to You." + CHR$(10) + CHR$(10) prt_text = prt_text + "The disclaimer of warranties and limitation of liability provided above" + CHR$(10) prt_text = prt_text + "shall be interpreted in a manner that, to the extent possible, most" + CHR$(10) prt_text = prt_text + "closely approximates an absolute disclaimer and waiver of all liability." + CHR$(10) Answer = MessageBox(prt_text, "*** DISCLAIMER ***", MsgBox_YesNo + MsgBox_Question) IF Answer = MsgBox_No THEN Answer = MessageBox("Sorry you don't agree. Please Don't Drink and Drive.", "", MsgBox_Ok + MsgBox_Information) SYSTEM END IF END SUB SUB ResetForm Control(nbrDrinksTB).Value = 0 Control(WeightTB).Value = 0 Control(TimeTB).Value = 0 Control(AgreeCB).Value = FALSE Control(AGREEBT).Disabled = TRUE Control(maleRB).Value = FALSE Control(femaleRB).Value = FALSE ResetList displayResults Sex = "" END SUB SUB calcEBAC '------------------------------------------------------------- ' *** Convert Drinks into Fluid Ounces of EtOH (Pure Alcohol). ' *** A is number of drinks. 1 drink is about .6 FLoz of alcohol FLoz = A * OZ legalToDrive = FALSE '----------------------------------------------------- ' *** Set/calculate EBAC values based on Sex SELECT CASE Sex CASE "M" B = .017 EBAC = 7.97 * FLoz / Wt - B * T CASE "F" B = .019 EBAC = 9.86 * FLoz / Wt - B * T END SELECT IF EBAC < 0 THEN EBAC = 0 '---------------------------------------------------------------------------------------------- ' *** Populate the EBAC string with the EBAC value formatted to 3 decimal places for FORM output prt_text = "ESTIMATED BLOOD ALCOHOL CONTENT (EBAC) in g/dL = " + strFormat$(STR$(EBAC), "###.###") + CHR$(10) + CHR$(10) '----------------------------------------------------------------------------------------- ' *** Based on EBAC range values, populate the FORM output string with the approriate text SELECT CASE EBAC CASE .500 TO 100.9999 prt_text = prt_text + "*** ALERT: CALL AN AMBULANCE, DEATH LIKELY" + CHR$(10) prt_text = prt_text + "Unconsious/coma, unresponsive, high likelihood of death. It is illegal" + CHR$(10) + _ "to operate a motor vehicle at this level of intoxication in all states." + CHR$(10) CASE .400 TO .4999 prt_text = prt_text + "*** ALERT: CALL AN AMBULANCE, DEATH POSSIBLE" + CHR$(10) prt_text = prt_text + "Onset of coma, and possible death due to respiratory arrest. It is illegal" + CHR$(10) + _ "to operate a motor vehicle at this level of intoxication in all states." + CHR$(10) CASE .350 TO .3999 prt_text = prt_text + "*** ALERT: CALL AN AMBULANCE, SEVERE ALCOHOL POISONING" + CHR$(10) prt_text = prt_text + " Coma is possible. This is the level of surgical anesthesia. It is illegal" + CHR$(10) + _ "to operate a motor vehicle at this level of intoxication in all states." + CHR$(10) CASE .300 TO .3499 prt_text = prt_text + "*** ALERT: YOU ARE IN A DRUNKEN STUP0R, AT RISK TO PASSING OUT" + CHR$(10) prt_text = prt_text + "STUPOR. You have little comprehension of where you are. You may pass out" + CHR$(10) + _ "suddenly and be difficult to awaken. It is illegal to operate a motor" + CHR$(10) + _ "vehicle at this level of intoxication in all states." + CHR$(10) CASE .250 TO .2999 prt_text = prt_text + "*** ALERT: SEVERLY IMPAIRED - DRUNK ENOUGH TO CAUSE SEVERE INJURY/DEATH TO SELF" + CHR$(10) prt_text = prt_text + "All mental, physical and sensory functions are severely impaired." + CHR$(10) + _ "Increased risk of asphyxiation from choking on vomit and of seriously injuring" + CHR$(10) + _ "yourself by falls or other accidents. It is illegal to operate a motor" + CHR$(10) + _ "vehicle at this level of intoxication in all states." + CHR$(10) CASE .200 TO .2499 prt_text = prt_text + "YOU ARE EXTREMELY DRUNK" + CHR$(10) prt_text = prt_text + "Feeling dazed/confused or otherwise disoriented. May need help to" + CHR$(10) + _ "stand/walk. If you injure yourself you may not feel the pain. Some" + CHR$(10) + _ "people have nausea and vomiting at this level. The gag reflex" + CHR$(10) + _ "is impaired and you can choke if you do vomit. Blackouts are likely" + CHR$(10) + _ "at this level so you may not remember what has happened. It is illegal" + CHR$(10) + _ "to operate a motor vehicle at this level of intoxication in all states." + CHR$(10) CASE .160 TO .1999 prt_text = prt_text + "YOUR ARE SEVERLY DRUNK - ENOUGH TO BECOME VERY SICK" + CHR$(10) prt_text = prt_text + "Dysphoria* predominates, nausea may appear. The drinker has the appearance" + CHR$(10) + _ "of a 'sloppy drunk.' It is illegal to operate a motor vehicle at this level" + CHR$(10) + _ "of intoxication in all states." + CHR$(10) + CHR$(10) + _ "* Dysphoria: An emotional state of anxiety, depression, or unease." + CHR$(10) CASE .130 TO .1599 prt_text = prt_text + "YOU ARE VERY DRUNK - ENOUGH TO LOSE PHYSICAL & MENTAL CONTROL" + CHR$(10) prt_text = prt_text + "Gross motor impairment and lack of physical control. Blurred vision and major" + CHR$(10) + _ "loss of balance. Euphoria is reduced and dysphoria* is beginning to appear." + CHR$(10) + _ "Judgment and perception are severely impaired. It is illegal to operate a " + CHR$(10) + _ "motor vehicle at this level of intoxication in all states." + CHR$(10) + CHR$(10) prt_text = prt_text + "* Dysphoria: An emotional state of anxiety, depression, or unease." + CHR$(10) CASE .100 TO .1299 prt_text = prt_text + "YOU ARE LEGALLY DRUNK" + CHR$(10) prt_text = prt_text + "Significant impairment of motor coordination and loss of good judgment." + CHR$(10) + _ "Speech may be slurred; balance, vision, reaction time and hearing will be" + CHR$(10) + _ "impaired. Euphoria. It is illegal to operate a motor vehicle at this level" + CHR$(10) + _ "of intoxication in all states." + CHR$(10) CASE .070 TO .0999 prt_text = prt_text + "YOU MAY BE LEGALLY DRUNK" + CHR$(10) prt_text = prt_text + "Slight impairment of balance, speech, vision, reaction time, and hearing." + CHR$(10) + _ "Euphoria. Judgment and self-control are reduced, and caution, reason and" + CHR$(10) + _ "memory are impaired (in some* states .08 is legally impaired and it is illegal" + CHR$(10) + _ "to drive at this level). You will probably believe that you are functioning" + CHR$(10) + _ "better than you really are." + CHR$(10) + CHR$(10) prt_text = prt_text + "(*** As of July, 2004 ALL states had passed .08 BAC Per Se Laws. The final" + CHR$(10) + _ "one took effect in August of 2005.)" + CHR$(10) CASE .040 TO .0699 prt_text = prt_text + "YOU MAY BE LEGALLY BUZZED" + CHR$(10) prt_text = prt_text + "Feeling of well-being, relaxation, lower inhibitions, sensation of warmth." + CHR$(10) + _ "Euphoria. Some minor impairment of reasoning and memory, lowering of caution." + CHR$(10) + _ "Your behavior may become exaggerated and emotions intensified (Good emotions" + CHR$(10) + _ "are better, bad emotions are worse)" + CHR$(10) CASE .020 TO .0399 prt_text = prt_text + "YOU MAY BE OK TO DRIVE, BUT IMPAIRMENT BEGINS" + CHR$(10) prt_text = prt_text + "No loss of coordination, slight euphoria and loss of shyness. Depressant effects" + CHR$(10) + _ "are not apparent. Mildly relaxed and maybe a little lightheaded." + CHR$(10) CASE .000 TO .0199 prt_text = prt_text + "YOU ARE OK TO DRIVE" + CHR$(10) END SELECT '----------------------------------------------------------- '*** Determine if Drunk (>.08 EBAC) and calculate: '*** - When user will be less than .08 '*** - How long it will take to become completely sober IF EBAC > .08 THEN SOBER = FALSE CEBAC = EBAC st = T DO UNTIL SOBER = TRUE T = T + 1 IF CEBAC > .0799 THEN I = I + 1 SELECT CASE Sex CASE "M" B = .017 CEBAC = 7.97 * FLoz / Wt - B * T CASE "F" B = .019 CEBAC = 9.86 * FLoz / Wt - B * T END SELECT IF legalToDrive = FALSE THEN IF CEBAC < .08 THEN prt_text = prt_text + CHR$(10) + CHR$(10) + "It will take about " + strFormat$(STR$(I), "##") + " hours from your last drink to be able to drive." + CHR$(10) legalToDrive = TRUE END IF END IF IF CEBAC <= 0 THEN prt_text = prt_text + "It will take about " + strFormat$(STR$(T - st), "##") + " hours from your last drink to be completely sober." SOBER = TRUE END IF LOOP END IF END SUB FUNCTION strFormat$ (text AS STRING, template AS STRING) '----------------------------------------------------------------------------- ' *** Return a formatted string to a variable ' d = _DEST: s = _SOURCE n = _NEWIMAGE(80, 80, 0) _DEST n: _SOURCE n PRINT USING template; VAL(text) FOR i = 1 TO 79 t$ = t$ + CHR$(SCREEN(1, i)) NEXT IF LEFT$(t$, 1) = "%" THEN t$ = MID$(t$, 2) strFormat$ = _TRIM$(t$) _DEST d: _SOURCE s _FREEIMAGE n END FUNCTION