iConvert 3.6

Post Reply
User avatar
rbytes
Posts: 1936
Joined: Sun May 31, 2015 12:11 am
My devices: iPhone X
iPad 4
MacBook
Dell Inspiron laptop
CHUWI Plus 10 convertible Windows/Android tablet
Location: Calgary, Canada
Flag: Canada
Contact:

iConvert 3.6

Post by rbytes » Mon Nov 05, 2018 6:21 pm

Adds Fuel Economy category.
iConvert 3.6 requires the program Update Currencies 2.2.sb to obtain the latest currency exchange rates. You can find this program at https://kibernetik.pro/forum/viewtopic.php?f=20&t=2272

iConvert 3.6 has a Settings button (gear symbol) left of the other buttons. This opens a popup
Settings window with a switch to select the desired view for Update Currencies 2.2
When the switch is off, the currency exchange file is updated without interactivity.
When the switch is on, the file is updated interactively with the user.

iConvert 3.6 saves a file named "viewstate" as a string, with the first character indicating the user's view preference for Update Currencies 2.2.
"0" is no interaction, "1" is interactive view. The characters that follow will be "calling" if iConvert 3.6 is running, and "idle" if it is not.

It saves its name "iConvert 3.6.sb" in a file named "convertname".

Code: Select all

/*
iConvert V3.6
by rbytes and Dutchman, October 2018
Converts measurements in many categories.
A collaborative international project.

********************** NOTE *************************
The file "Update Currencies 2.2.sb" located at
https://kibernetik.pro/forum/viewtopic.php?f=20&t=2272
is required to activate the Currency category and
update currency exchange rates.
******************************************************

V3.6
- now has a Settings button (gear symbol), left of the other buttons. This opens a
  popup Settings window with a switch to set the view for Update Currencies 2.2
  when the switch is off, the currency exchange file is updated without 
  interactivity.
  when the switch is on, the file is updated interactively with the user.
- file "viewstate" stores the view setting.
- file "convertname" stores the program name of the current version of iConvert.
V3.5
- Fuel Economy category added by rbytes, November 2018
V3.4a
- Henceforth iConvert does a data read of "currencies.data" rather than 
  making it an include file. Therefore it no longer crashes if 
  "currencies.data" does not exist. Instead, when the Currency category
  is selected with no data, a message pops up explaining
  how to activate it by downloading and running Update Currencies.sb
  Then the previously-selected category is re-selected
V3.4
- Acceleration category added by rbytes
- Update button added to launch Update Currencies program
  for updating currency exchange rates
V3.3
- Flow Rate category added by rbytes
V3.2
- Angle category added by rbytes
- Energy transition category added by Dutchman
- error trap added for Currency
V3.1
- Temperature category added by Dutchman
V3
- Currency category added by Dutchman
  data file generated with "Update currencies.sb"
V2
- animation added to title
  (plays only once, at launch)
- measures added in most categories
- scientific notation is now used for
  results larger than 100,000,000 or
  smaller than .00000001
V1.1
- added Horsepower (Metric) to
  Power category
- eliminated >>> button;
  calculation is now automatic
  when list selections or
  input values are changed.
- code efficiency improved
*/
OPTION BASE 1
SET ORIENTATION LANDSCAPE
SET BUTTONS CUSTOM
SET TOOLBAR OFF
laun$=LAUNCHER$()
IF FILE_EXISTS("convertname") THEN FILE "convertname" DELETE
FILE "convertname" WRITELINE "iConvert 3.6.sb"
  
GET SCREEN SIZE sw,sh

' set to 1 to test iPhone layout on iPad
iostest=0
IF iostest THEN
  sw=568
  sh=320
  dev$=""
ENDIF
rw=sw/1024!rh=sh/740

'b'========= Constants ===================
'' *** Note - IP address may change if router is rebooted ***
'  run ipconfig on your PC to find its IP address.

URL$="192.170.61.43"   ' example of IP address
DIM h$(2)


' each line of a file sent to a PC print server must end with these characters:

cr$=CHR$(13)       ' carriage return character
lf$=CHR$(10)       ' line feed character


' interface object names

x$="guide"
y$="guide2"
n$="title"
o$="category"
p$="from"
q$="to"
pi$="from_in"
qi$="to_in"
qi2$="cover"


lf$=CHR$(10)
q$=CHR$(34)
cat=1          ' default category (angle)
invalue=1
upshift=7

'r'  conversion constants  
KwhPerYear=1000/(365.25*24)
MJperYear=1E6/(365.25*24*60*60)
''
' correction for iPad display only
IF rw=1 then shift=10

' correction for non-iPad display only
IF rw<1 THEN shift2=75 ELSE shift2=-6

fm$="##,###,###,###,###,###,###.#######"    ' formats the result with commas
fm2$="####################.#######"         ' formats the result without commas


' number of measures in each category

cats=18
DIM cat$(cats)
accel=7
angle=9
area=9
cook=9
dat=8
energ=12
EnergyTrans=28
flow=17
fuel=12
leng=13
prefix=21
pow=14
press=13
spd=11
Tscales=8 ! Tscale$="Temperature"
timing=10
vol=12
wgt=10

'g'
' User choice of interface when updating currency exchange rates. Silent: view=0 ' ' Interactive: view=1

IF file_exists("viewstate") then
  FILE "viewstate" READLINE view$
  view$=LEFT$(view$,1)
  view=VAL(view$)
ELSE
  view=0
  view$=STR$(view)
END IF
FILE "viewstate" DELETE
FILE "viewstate" WRITELINE view$&"calling"
''

'b'============ Initialisation============
''
GRAPHICS
GRAPHICS CLEAR .9,1,1


 ' animate title if gif animation file exists

PAGE "title" FRAME 0,0,sw,80
PAGE "title" SET
PAGE "title" SHOW
A$="iconvert3.GIF"
IF FILE_EXISTS(A$) THEN
  SPRITE N$ LOAD A$
  SPRITE N$ AT sw/3-shift2,sh/60+3*shift scale 1*rh
  SPRITE N$ SHOW
ELSE
  DRAW IMAGE "iconvert.PNG" AT sw/2.8,sh/20 SCALE .8*rw
ENDIF
PAGE "" SET


' read categories

RESTORE TO Categories

GOSUB money
FOR t=1 TO cats
  READ cat$(t)
NEXT t

RESTORE TO acceleration     ' default category
items=accel
DIM measure$(items)
GOSUB setcategory


' create three lists

SET LISTS FONT SIZE 18*rw
LIST o$ TEXT cat$ AT sw*.1,260*rh SIZE 240*rw,310*rh
LIST o$ SELECT cat
LIST p$ TEXT measure$ AT sw*.385,260*rh SIZE 240*rw,310*rh
LIST p$ SELECT 1
LIST q$ TEXT measure$ AT sw*.672,260*rh SIZE 240*rw,310*rh
LIST q$ SELECT 1


' create fields and buttons

DRAW COLOR 0,0,0
guide$="Pick from each list"&lf$&"Enter quantity here"
DRAW LINE sw*.26,168*rh TO sw*.392,168*rh
FILL COLOR 0,0,0
FILL CIRCLE sw*.39,168*rh SIZE 3*rw
FILL COLOR 1,1,1
FIELD x$ TEXT guide$ AT sw*.1,132*rh-upshift SIZE 250,60 RO ML
FIELD x$ FONT SIZE 18*rw
FIELD x$ BACK ALPHA 0
guide2$="All lists can be scrolled"
DRAW LINE sw*.096,618*rh TO sw*.38,618*rh
DRAW LINE sw*.63,618*rh TO sw*.91,618*rh
FIELD y$ TEXT guide2$ AT sw*.41,600*rh-upshift*.8 SIZE 250,60 RO ML
FIELD y$ FONT SIZE 18*rw
FIELD y$ BACK ALPHA 0
FIELD o$ TEXT "CATEGORY" AT sw*.115,210*rh SIZE 130,30 RO
FIELD o$ FONT SIZE 20*rw
FIELD o$ BACK ALPHA 0
FIELD p$ TEXT "FROM" AT sw*.405,210*rh SIZE 100,30 RO
FIELD p$ FONT SIZE 20*rw
FIELD p$ BACK ALPHA 0
FIELD q$ TEXT "TO" AT sw*.69,210*rh SIZE 70,30 RO
FIELD q$ FONT SIZE 20*rw
FIELD q$ BACK ALPHA 0
FILL ALPHA 0
SET BUTTONS FONT SIZE 24*rw
BUTTON "settings" TEXT CHR$(9881) AT 90*rw,648*rh SIZE 50*rw,50*rh
SET BUTTONS FONT SIZE 20*rw
BUTTON "update" TEXT "UPDATE" AT 190*rw,650*rh SIZE 100*rw,50*rh
BUTTON "copy" TEXT "COPY" AT 330*rw,650*rh SIZE 100*rw,50*rh
BUTTON "print" TEXT "PRINT" AT 470*rw,650*rh SIZE 100*rw,50*rh
BUTTON "save" TEXT "SAVE" AT 610*rw,650*rh SIZE 100*rw,50*rh
BUTTON "stop" TEXT "STOP" AT 750*rw,650*rh SIZE 100*rw,50*rh
FILL ALPHA 1
FIELD pi$ TEXT "1" AT sw*.400,150*rh SIZE 200*rw,30*rh
FIELD pi$ FONT SIZE 18*rw
FIELD qi$ TEXT "1" AT sw*.640,145*rh SIZE 280*rw,40*rh
FIELD qi$ FONT SIZE 22*rw
FIELD qi2$ TEXT "" AT sw*.640,145*rh SIZE 280*rw,40*rh RO
FIELD qi2$ BACK ALPHA 0
FILL COLOR .6,.8,.8
FILL RECT sw*.395,145*rh TO sw*.6,185*rh
FILL COLOR .8,.8,.8
FILL RECT sw*.635,140*rh TO sw*.92,190*rh
DRAW RECT sw*.1-1,258*rh TO sw*.1+240*rw+1,258*rh+312*rh
DRAW RECT sw*.386-2,258*rh TO sw*.386+240*rw,258*rh+312*rh
DRAW RECT sw*.673-2,258*rh TO sw*.673+240*rw,258*rh+312*rh

timer=time ()    ' set timer to stop title anim after one cycle


'b'========== main program loop ===================
''
DO

' play once, then stop animation

IF time()-timer>1 AND time()-timer <2 and not noplay THEN
  IF FILE_EXISTS(A$) THEN SPRITE N$ PLAY
  noplay=1
ENDIF
IF time()-timer>6 AND time()-timer <7 THEN
  IF FILE_EXISTS(A$) THEN SPRITE N$ STOP
ENDIF


' check which category is selected

type=LIST_SELECTED(o$)


' choose and prepare a new category if necessary

IF type<>cat THEN
  oldcat=cat
  cat=type
  changed=1

  ON cat GOTO 5,10,15,20,25,30,40,45,50,55,60,65,70,80,90,95,100,110,120
  5 RESTORE TO acceleration
     items=accel
     GOTO skip
  10 RESTORE TO angle
     items=angle
     GOTO skip
  15 RESTORE TO area
     items=area
     GOTO skip
  20 RESTORE TO cooking
     items=cook
     GOTO skip
  25 'currencies - alternate method used for thia category
     if curr=0 then
       list o$ select oldcat
       type=oldcat
       gosub notice
       goto skip2
     else
       items=curr
     endif
     GOTO skip
  30 RESTORE TO data
     items=dat
     GOTO skip
  40 RESTORE TO energy
     items=energ
     GOTO skip
  45 RESTORE TO EnergyTransition
     items=EnergyTrans
     GOTO skip
  50 RESTORE TO FlowRate
     items=flow
     GOTO skip
  55 RESTORE TO FuelEconomy
     items=fuel
     GOTO skip
  60 RESTORE TO length
     items=leng
     GOTO skip
  65 RESTORE TO prefixes
     items=prefix
     GOTO skip
  70 RESTORE TO power
     items=pow
     GOTO skip
  80 RESTORE TO pressure
     items=press
     GOTO skip
  90 RESTORE TO speed
     items=SPD
     GOTO skip
  95 RESTORE TO Temperatures
     items=Tscales
     GOTO Skip
  100 RESTORE TO timing
     items=timing
     GOTO skip
  110 RESTORE TO volume
     items=vol
     GOTO skip
  120 RESTORE TO weight
     items=wgt
     GOTO skip

  skip:
  if cat=5 then
    GOSUB currcalc
  else
    GOSUB setcategory
  endif
  LIST p$ TEXT measure$
  LIST p$ SELECT 1
  LIST q$ TEXT measure$
  LIST q$ SELECT 1
  FIELD pi$ TEXT "1"
  skip2:
ENDIF

IF LIST_SELECTED(p$)<>selp or LIST_SELECTED(q$)<>selq then changed=1


' calculate the conversion

if VAL(FIELD_TEXT$(pi$))<>invalue or changed then
  invalue=VAL(FIELD_TEXT$(pi$))
  selp=LIST_SELECTED(p$)
  selq=LIST_SELECTED(q$)
  GOSUB Convert ' calculate OutValue
  if outvalue<100000000 and outvalue>.000000001 then 
    out$=STR$(outvalue,fm$)
    out2$=STR$(outvalue,fm2$)
    format(out$)!out$=format.form$
    format(out2$)!out2$=format.form$
  else
    out$=STR$(outvalue)
  endif
  fsize=22*rw
  FIELD qi$ FONT SIZE fsize
  FIELD qi$ TEXT out$
  FIELD qi2$ TEXT ""
ENDIF

IF bp("settings") THEN
  showswitch=1
  gosub settings
ENDIF

IF bp("update") THEN
  'FILE "currencies.data" DELETE
  DIR "" LIST FILES FILES$,n2
  FOR t=1 to n2
    temp=INSTR(FILES$(t),"currencies.html")
    IF temp<>-1 THEN FILE FILES$(t) DELETE
  NEXT t
  RUN "Update Currencies 2.2.sb"      ' modify to read "updatename"?
ENDIF


' copy the conversion info to clipboard

IF bp("copy") THEN
  GOSUB compile
  IF cp=0 THEN!CLIPBOARD CLEAR!cp=1!ENDIF
  CLIPBOARD WRITE convert$
  BEEP
ENDIF


' print the conversion info

IF bp("print") THEN
GOSUB compile
h$(1) = "content-type:text/html"   ' make header info
h$(2) = "content-length:" & LEN(convert$)

' print convert$ using Henko print technique
HTTP URL$ HEADER H$ POST convert$   ' send doc to the print server
BEEP
ENDIF


' save the conversion info to a file

IF bp("save") THEN
  GOSUB compile
  fname$="converted.txt"
  IF FILE_EXISTS(fname$) THEN FILE fname$ DELETE
  FILE fname$ WRITELINE convert$
  BEEP
ENDIF


' end the program

IF bp("stop") THEN
  view$=STR$(view)
  FILE "viewstate" DELETE
  FILE "viewstate" WRITELINE view$&"idle"
  IF laun$="desktop" THEN
    IF FILE_EXISTS("/launch") THEN
      RUN "/-Launch.sb"
    ELSE
      EXIT
    ENDIF
  ENDIF
  END
ENDIF
SLOWDOWN
UNTIL 0
END

'g'========== Subroutines and Functions =============

Convert:
'--- Convert via formula
'  temperature
IF Cat$(cat)=Tscale$ THEN
  Outvalue=FromCelsius(Celsius(Invalue,measureval(selp)),measureval(selq))
  RETURN
ENDIF
'--- Convert via ratio
  outvalue=invalue/(measureval(selq)/measureval(selp))

  ' correction for Fuel Economy category
  if cat=10 and selq=>1 and selq=<6 and selp=>7 and selp=<12 then
    outvalue=1/outvalue
  endif
RETURN

' temperature conversion

DEF FromCelsius(Value,UnitPointer)
'Converts Value on 'Unit'-scale to Celsius-scale
'  to newvalue in scale of Unitpointer
ON UnitPointer GOTO 1,2,3,4,5,6,7,8
  1 RETURN Value 'Celsius
  2 RETURN Value+273.15 'Kelvin
  3 RETURN Value*9/5+32 'Fahrenheit
  4 RETURN (Value+273.15)*9/5 'Rankine
  5 RETURN (100-Value)*3/2 'Delisle
  6 RETURN Value*33/100 'Newton
  7 RETURN Value*4/5 'Réamur
  8 RETURN Value*21/40+7.5 'Rømer
END DEF
'
DEF Celsius(Value,UnitPointer)
'Converts Value in 'Unit' to new value in Celsius
ON UnitPointer GOTO 1,2,3,4,5,6,7,8
  1 RETURN Value 'Celsius
  2 RETURN Value-273.15 'Kelvin
  3 RETURN (Value-32)*5/9 'Fahrenheit
  4 RETURN (Value-491.67)*5/9 'Rankine
  5 RETURN 100-Value*2/3 'Delisle
  6 RETURN Value*100/33 'Newton
  7 RETURN Value*5/4 'Réamur
  8 RETURN (Value-7.5)*40/21 'Rømer
END DEF


' read the data for a category

setcategory:
DIM measure$(items)
FOR t=1 TO items
  READ measure$(t)
NEXT t
DIM measureval(items)
FOR t=1 TO items
  READ measureval(t)
NEXT t
RETURN

currcalc:
DIM measure$(items)
FOR t=1 TO items
  measure$(t)=mname$(t)
NEXT t
DIM measureval(items)
FOR t=1 TO items
  measureval(t)=val(mvalue$(t))
NEXT t
RETURN

' prepare a string showing the conversion, for copying or saving to a file

compile:
  selp=LIST_SELECTED(p$)
  selq=LIST_SELECTED(q$)
  temp1$=measure$(selp)
  temp2$=measure$(selq)


  ' if a value is 1 or a fraction, change the name from plural to singular
  convin=val(FIELD_TEXT$(p$))
  temp1len=LEN(temp1$)
  IF convin=<1 AND RIGHT$(temp1$,1)="s" THEN temp1$=LEFT$(temp1$,temp1len-1)
  IF VAL(out2$)=<1 AND RIGHT$(temp2$,1)="s" THEN temp2$=LEFT$(temp2$,LEN(temp2$)-1)
  convert$&=FIELD_TEXT$(pi$)&" "&temp1$&" = "&FIELD_TEXT$(qi$)&" "&temp2$
  convert$&=cr$&lf$&FIELD_TEXT$(pi$)&" "&temp1$&" = "&out2$&" "&temp2$&cr$&lf$&cr$&lf$
RETURN


' settings window

settings:
a$="When updating currency data, choose if you want interactive mode. When the switch is off, the currency exchange file is updated without interactivity. When the switch is on, the file is updated interactively with the user."
pw("notice","Settings",a$,sw/2-200*rw,sh/4,400*rw,400*rw,1,1,1,1)
goto message


' notice if user has not downloaded and run Update Currencies 2.2.sb

notice:
a$="To use this category, please download Update Currencies 2.2.sb from the Forum at this link:"&lf$&lf$&"https://kibernetik.pro/forum/viewtopic.php?f=20&t=2280"&lf$&lf$&"Then run it. The next time you run iConvert, the Currency category will be functional."
pw("notice","Notice!",a$,sw/2-200*rw,sh/4,400*rw,400*rw,1,1,1,1)

message:
wait: SLOWDOWN
IF SWITCH_CHANGED("inter") THEN
  .view=SWITCH_STATE("inter")
  IF file_exists("viewstate") then FILE "viewstate" DELETE
  view$=STR$(.view)
  FILE "viewstate" DELETE
  FILE "viewstate" WRITELINE view$&"calling"
ENDIF
IF BUTTON_PRESSED("close") THEN
  PAGE pw.NAME$ HIDE ! PAGE "" SET ! PAGE "" SHOW
  FILL COLOR .6,.8,.8
  FILL RECT sw*.395,145*rh TO sw*.6,185*rh
  FILL COLOR .8,.8,.8
  FILL RECT sw*.635,140*rh TO sw*.92,190*rh
  DRAW COLOR 0,0,0
  DRAW RECT sw*.1-1,258*rh TO sw*.1+240*rw+1,258*rh+312*rh
  DRAW RECT sw*.386-2,258*rh TO sw*.386+240*rw,258*rh+312*rh
  DRAW RECT sw*.673-2,258*rh TO sw*.673+240*rw,258*rh+312*rh
  DRAW LINE sw*.26,168*rh TO sw*.392,168*rh
  DRAW LINE sw*.096,618*rh TO sw*.38,618*rh
  DRAW LINE sw*.63,618*rh TO sw*.91,618*rh
  FILL COLOR 0,0,0
  FILL CIRCLE sw*.39,168*rh SIZE 3*rw
  FILL COLOR .8,.8,.8
ELSE 
  GOTO wait
ENDIF
RETURN


' import currencies.data if exists

money:
fname$="currencies.data"
q$=chr$(34)
mark=1

if file_exists(fname$) then
  void=0
  file fname$ setpos 0

  for t=1 to 5
  FILE fname$ READLINE hold$(t)
  next t

  ' read curr value
  temp$=hold$(1)
  fnd=INSTR(temp$,"=",mark)
  IF fnd<>-1 THEN
    stpt=INSTR(temp$,"=",fnd)                   ' start of condition string
    enpt=INSTR(temp$,"'",fnd)                   ' end of condition string
    curr$=MID$(temp$,stpt+1,enpt-stpt-2)
    curr=VAL(curr$)
  ENDIF

  ' read CurrDate$
  temp$=hold$(2)
  fnd=INSTR(temp$,"=",mark)
  IF fnd<>-1 THEN
    stpt=INSTR(temp$,"=",fnd)                   ' start of condition string
    enpt=INSTR(temp$,"'",fnd)                   ' end of condition string
    CurrDate$=MID$(temp$,stpt+2,enpt-stpt-4)
  ENDIF

  ' read measures array
  temp$=hold$(4)
  temp$=MID$(temp$,5,1000)

  SPLIT temp$ TO mname$,tot WITH ","
  for t=1 to curr
    temp$=mname$(t)
    ' trim quotation marks
    temp$=right$(temp$,len(temp$)-2)
    mname$(t)=temp$
    temp2$=left$(mname$(t),len(temp$)-1)
    mname$(t)=temp2$
  next t

  ' read measures values
  temp$=hold$(5)
  temp$=MID$(temp$,5,1000)

  SPLIT temp$ TO mvalue$,tot WITH ","
ELSE
  void=1
ENDIF
return


' shortcut for button press

DEF bp(a$) = BUTTON_PRESSED(a$)


' remove scientific notation before displaying result

DEF format(form$)
  WHILE LEFT$(form$,1)=" " OR LEFT$(form$,1)=","
    form$=RIGHT$(form$,LEN(form$)-1)
    ' trim leading spaces and separators
  ENDWHILE
  IF INSTR (form$, ".") THEN        ' if form$ has a decimal point
    IF NOT numpad.curr THEN
    ' trim trailing zeros
    WHILE RIGHT$(form$,1)="0"
      form$=LEFT$(form$,LEN(form$)-1)
    ENDWHILE
    IF RIGHT$(form$,1)="." THEN
      form$=LEFT$(form$,LEN(form$)-1)
    ENDIF
    ENDIF
  ENDIF
END DEF

DEF pw(NAME$,title$,a$,xs,ys,ww,hh,R,G,B,ALPHA)
GRAPHICS CLEAR .9,1,1
PAGE NAME$ SET
PAGE NAME$ SHOW
PAGE NAME$ FRAME xs,ys,ww,hh
PAGE NAME$ COLOR R,G,B,ALPHA
PAGE "" HIDE
FIELD NAME$ TEXT a$ at 20*.rw,50*.rh size 360*.rw,360*.rh ML RO
IF title$="Settings" THEN
  FIELD "labels" TEXT "OFF               ON" at 136,207 RO
  SWITCH "inter" STATE .view AT 175*.rw,200*.rh
ENDIF
BUTTON "close" title "❎" AT ww-30,5 SIZE 24*.rw,24*.rh
BUTTON "bottom" title "" AT -6,hh-3 SIZE ww+12,3
BUTTON "left" title "" AT 0,-6 SIZE 3,hh+12*.rh
BUTTON "right" title "" AT ww-3,-6 SIZE 3,hh+12*.rh
BUTTON "upper1" title "" AT -6,0 SIZE ww+12,3
BUTTON "upper2" title "" AT -6,30 SIZE ww+12,3
BUTTON "title" title title$ AT ww/2-50,3 SIZE 100*.rw,28*.rh
'
' other UI objects
'
'
END DEF
''

/*
Conversion Data

The technique I use to calculate conversions is to choose a reference measure in the middle of the range and set its value to 1. All other measures are then assigned numbers representing the ratio of their value to the reference measure's value.
*/

Categories:

DATA "Acceleration", "Angle", "Area", "Cooking", "Currency "&CurrDate$ ,"Data", "Energy", "Energy Transition", "Flow Rate", "Fuel Economy", "Length", "Prefixes", "Power", "Pressure", "Speed"
DATA Tscale$, "Time", "Volume", "Weight"

Acceleration:
DATA "Centimeters Per Sec²", "Inches per Second²", "Feet per Second²", "Meters Per Second²", "Galileos", "Leos", "Gravity"
DATA .01, 0.0254, 0.304800000001219,1,.01,10,9.80664999978774

Angle:
DATA "Degrees", "Radians", "Gradians", "Minutes", "Seconds", "Circles", "Quadrants", "Points", "Mils"
DATA 1, 57.2957795128962, .9, .0166666666666667, .000277777777777778, 360, 90, 11.25, .05625

Area:
DATA "Acres", "Square Kilometers", "Hectares", "Square Meters", "Square Centimeters", "Square Miles", "Square Yards", "Square Feet", "Square Inches"
DATA 4046.85642, 1000000, 10000, 1, .0001, 2589988.110266, .8361273, .0929030, .000645159722

Cooking:
DATA "Centiliters", "Cups (CD)", "Fluid Ounces (CD)", "Liters", "Milliliters", "Pints (CD)", "Quarts (CD)", "Tablespoons", "Teaspoons"
DATA .35195,8,1,35.195079,.035195,20,40,.520421,.1734737

Data:
DATA "Bits", "Bytes", "Words", "Kilobytes", "Megabytes", "Gigabytes", "Terabytes", "Petabytes"
DATA .000125, .001, .008, 1, 1000, 1000000, 1000000000, 1000000000000

Energy:
DATA "BTU", "Calories", "Cubic Mile of Oil", "Foot Pounds", "Horsepower Per Hr", "Joules", "KiloJoules", "KiloCalories", "Kilowatt Hours", "Kilotons", "MegaJoules", "Therms (US)"
DATA 251.99576, 1, 38334721315564331336, .32404825, 641615.559278, .23900573, 239.00573, 1000, 860420.6501033, 999999974320, 239005.7299999, 25210420.65043

EnergyTransition:
DATA "Watt", "Kilowatt", "Kwh/y", "Kg/y Coal", "Kg/y Brown coal", "Kg/y Peat dry", "Kg/y Wood", "Kg/y Fat", "Kg Battery Li-Po, Li-Hv", "m² Solar panel", "Liter/y petrol", "Liter/y diesel oil", "Liter/y heating oil", "Liter/y Hydrogen 700bar", "Liter/y Alcohol", "Liter/y LNG", "Liter/y LPG", "Liter/day heating oil", "Liter/day LNG", "Liter/day LPG", "m³/y natural gas", "m³/y natural gas NL", "m³/y Hydrogen", "m³/day natural gas", "m³/day natural gas NL", "m³/day Hydrogen", "m³/day water to ice", "g/y Thorium"
DATA 1, 1000, 0.114077, 0.7465713, 0.4753213, 0.4753213, 0.4753213, 1.1724592, 0.0570386, 31.6564, 1.0837326, 1.2231602, 1.1819657, 0.2905798, 0.7415013, 0.7034755, 0.8143839, 431.713, 256.944, 297.454, 1.234251, 1.0583821, 0.5357, 450.81, 386.574, 195.664, 3865.74, 2516.6679

FlowRate:
DATA "Cubic Meters per Sec", "Cubic Meters per Min", "Cubic Meters per Hour", "Liters per Second", "Liters per Minute", "Liters per Hour", "Cubic Feet per Sec", "Cubic Feet per Minute", "Cubic Feet per Hour", "Gallons (US) per Sec", "Gallons (US) per Min", "Gallons (US) per Hour", "Gallons (US) per Day", "Gallons (UK) per Sec", "Gallons (UK) per Min", "Gallons (UK) per Hour", "Gallons (UK) per Day"
DATA 951019.38852, 15850.323142, 264.172052366667, 951.01938852, 15.850323142, 0.264172052366667, 26929.870147125, 448.83116911875, 7.48051948531251, 3600, 60, 1, .0416666666675429, 4323.41973193896, 72.0569955323167, 1.20094992556893, .0500395802310909

FuelEconomy:
DATA "Gallons/100 Km", "Gallons/100 Km (UK)", "Gallons/100 Miles", "Gallons/100 Miles (UK)", "Liters/100 Km", "Liters/100 Miles", "Kilometers/Gallon", "Kilometers/Gallon (UK)", "Kilometers/Liter", "Miles/Gallon", "Miles/Gallon (UK)", "Miles/Liter"
DATA 62.13713042098589, 51.7399637168344, 100, 83.2674208186165, 235.2145833, 378.541178346355, .621371299149277, 1.9327415571855, 2.3521458329476, 1, .83267418460479, 3.7854117849094

Length:
DATA "Ångströms","Centimeters", "Fathoms", "Feet", "Furlongs (US)", "Inches", "Kilometers", "Meters","Mils", "Miles", "Millimeters", "Nanometers", "Yards"
DATA .00000001, 1, 182.88, 30.48, 20116.8, 2.54, 100000, 100, .00254, 160934.39999, .1, .0000001, 91.44

Power:
DATA "Watts","Kilowatts", "Megawatts", "Gigawatts", "Terawatts", "KWh/year", "MegaJoule/year (MJ/y)","Horsepower (IT)", "Horsepower (Metric)", "Moosepower", "Calories per Hour", "BTU per Hour", "Foot Pounds per Hr", "Tons Refrigeration"
DATA 1,1000, 1E6, 1E9, 1E12, KwhPerYear,MJperYear,745.69987, 756.042476, 2438.4385749, 0.0011629, 2930710000, 3766160000, 3516.8

Prefixes:
DATA "yotta", "zetta", "exa", "peta", "tera", "giga", "mega", "kilo", "hecto", "deca", "none", "deci", "centi", "milli", "micro", "nano", "pico", "femto", "atto", "zepto", "yocto"
DATA 1000000000000000000000000, 1000000000000000000000, 1000000000000000000, 1000000000000000, 1000000000000, 1000000000, 1000000, 1000, 100, 10, 1, .1, .01, .001, .000001, .000000001, .000000000001, .000000000000001, .000000000000000001, .000000000000000000001, .000000000000000000000001

Pressure:
DATA "Bars", "Millibars", "Pascals", "HectoPascals", "KiloPascals", "MegaPascals", "Atmospheres", "Pounds per Sq. Foot", "Pounds per Sq. Inch", "Inches of Water", "Inches of Mercury", "Centimeters of Water", "Centimeters of Mercury"
DATA 1000, 1, .01, 1, 10, 10000, 1013.250099, .47880258, 68.947572, 2.490889, 33.864, .98066496, 13.332283459

Speed:
DATA "Feet per Second", "Feet per Minute", "Furlongs per Fortnight", "Inches per Second", "Kilometers per Hour", "Kilometers per Sec.", "Knots", "Miles per Hour", "Miles per Second", "Speed of Light", "Speed of Sound"
DATA 1.09728, .018288, .000598715, .09144, 1, 3600, 1.8519999, 1.609349, 5793.638399, 1079252848.794, 1225.0439999

Temperatures:
DATA "Celsius [°C]", "Delisle [°D]", "Fahrenheit [°F]", "Kelvin [K]", "Newton [°N]", "Rankine [°Ra]", "Réamur [°Re]", "Rømer [°Rø]"
DATA 1,5,3,2,6,4,7,8 ' unit-pointers

Timing:
DATA "Milliseconds", "Seconds", "Minutes", "Hours", "Days", "Weeks", "Fortnights", "Months", "Years", "Leap Years"
DATA .00001666666, .01666666, 1, 60, 1440, 10080, 20160, 43800, 525600, 527040

Volume:
DATA "Cubic Centimeters", "Cubic Feet", "Cubic Inches", "Cubic Yards", "Cups (CD)", "Fluid Ounces (CD)", "Gallons (CD)", "Gallons (US)", "Liters", "Milliliters", "Pints (CD)", "Quarts (CD)"
DATA 1,28316.84659,16.3871,764554,284.130625,28.4131,4546.08999,3785.411784,1000,1,568.26125,1136.5225

Weight:
DATA "Grams", "Kilograms", "Ounces", "Ounces (troy)", "Pounds", "Grains", "Tonnes (metric)", "Tons (US short)", "Long Tons (UK)", "Stones"
DATA .0022046226, 2.2046226, .0625, .0685714, 1, 10, 2204.62262184, 2000, 2240, 14

' this routine is used when adding a new category, until its data is entered.

TBA:
DATA "To Be Added","","","","","","","","",""
DATA 1,1,1,1,1,1,1,1,1,1
Attachments
F222EF19-4E62-46F5-A337-DE8C3C37A049.png
F222EF19-4E62-46F5-A337-DE8C3C37A049.png (219 KiB) Viewed 615 times
46FDE90F-280C-4196-A5D7-D3622DE7A078.png
46FDE90F-280C-4196-A5D7-D3622DE7A078.png (256.34 KiB) Viewed 629 times
Last edited by rbytes on Wed Nov 07, 2018 11:23 pm, edited 16 times in total.
####### Living the colorful life #######

User avatar
Dutchman
Posts: 891
Joined: Mon May 06, 2013 9:21 am
My devices: iMac, iPad Air, iPhone
Location: Netherlands
Flag: Netherlands

Re: iConvert 3.5

Post by Dutchman » Tue Nov 06, 2018 9:02 am

Simple solution for the inverted values :!:

For updating currencies, in this version, as before, the file "currencies.data" is also deleted.
As a result, "Update Currencies.sb" will start in "interactive mode" during which the user can decide not to continue.
A new data file is then not generated and the program ends without return to the converter.
If only the html-file is deleted, "Update Currencies" will start in "direct mode", without interactivity.
If then an error occurs because the currencies website has changed or is not available, it will return to the converter and conversion can be done with the old data file. ;)
If desired, the user can then save that data file as a backup and switch to the interactive mode to see what the problem is.
Perhaps you can define a global switch that can turn on or off 'interactive' mode. :?:

In my modified version of "iConvert 3.5.sb" I therefore have inactivated the following line by comment mark:
FILE "currencies.data" DELETE
We consider it a refreshing mental exercise to figure out ways to circumvent foolishness (Quote from Richard)

User avatar
rbytes
Posts: 1936
Joined: Sun May 31, 2015 12:11 am
My devices: iPhone X
iPad 4
MacBook
Dell Inspiron laptop
CHUWI Plus 10 convertible Windows/Android tablet
Location: Calgary, Canada
Flag: Canada
Contact:

Re: iConvert 3.6

Post by rbytes » Tue Nov 06, 2018 2:43 pm

In my modified version of "iConvert 3.5.sb" I therefore have inactivated the following line by comment mark:
Thanks, Ton. I have commented out that line of code in this new posting of iConvert 3.6, which replaces version 3.5

The file iConvert 3.6.sb also has the following changes:

I have now added a Settings button (gear symbol) to the left of the existing buttons. It calls a popup Settings window, which explains the non-interactive or interactive view choices in Update Currencies. There is a switch to set their preference. I had first suggested using the clipboard to pass that setting to UC, but on further thought I decided to save a file called "viewstate", so that the user's choice can be reloaded every time iConvert is run. The data in viewstate is either a 0 or a 1.

Now you can add a routine in Update Currencies to check for the file "viewstate" and READLINE the file to a string. The VAL of the string will be the user's view preference: 0 for non-interactive, 1 for interactive. If the file doesn't exist yet, then the default choice can stay 0, as you have it now.
####### Living the colorful life #######

User avatar
Dutchman
Posts: 891
Joined: Mon May 06, 2013 9:21 am
My devices: iMac, iPad Air, iPhone
Location: Netherlands
Flag: Netherlands

Re: iConvert 3.6

Post by Dutchman » Wed Nov 07, 2018 9:54 am

In order to be able to use "viewstate" useful, the update program has to know whether the converter is active, otherwise the view is overruled at all times by viewstate, also in modes 1 and 4 that are needed during development.
I therefore propose that "viewstate" be extended with a second value that indicates whether "iConvert" is active. That variable should be set for the update request and resets after completion. Preferably on a single line in succession and the second variable as a string.
E.g set to "calling" and reset to "idle".
We consider it a refreshing mental exercise to figure out ways to circumvent foolishness (Quote from Richard)

User avatar
rbytes
Posts: 1936
Joined: Sun May 31, 2015 12:11 am
My devices: iPhone X
iPad 4
MacBook
Dell Inspiron laptop
CHUWI Plus 10 convertible Windows/Android tablet
Location: Calgary, Canada
Flag: Canada
Contact:

Re: iConvert 3.6

Post by rbytes » Wed Nov 07, 2018 2:45 pm

This change has been made. 8-)
####### Living the colorful life #######

User avatar
Dutchman
Posts: 891
Joined: Mon May 06, 2013 9:21 am
My devices: iMac, iPad Air, iPhone
Location: Netherlands
Flag: Netherlands

Re: iConvert 3.6

Post by Dutchman » Wed Nov 07, 2018 9:33 pm

I extended the program with processing the 'viewstate'.
"iConvert" however does not work properly with this:
• I renamed the program to "Update Cirrencies 2.2.sb" but iConvert uses version 2.1
Therefore version number temporarily changed to 2.1, but still:
• the 'gear' symbol disappears so that view-option can no longer be changed
• After update, "calling" is not reset to "idle". When I look at the contents of viewstate after 'stop', I see "calling"
We consider it a refreshing mental exercise to figure out ways to circumvent foolishness (Quote from Richard)

User avatar
rbytes
Posts: 1936
Joined: Sun May 31, 2015 12:11 am
My devices: iPhone X
iPad 4
MacBook
Dell Inspiron laptop
CHUWI Plus 10 convertible Windows/Android tablet
Location: Calgary, Canada
Flag: Canada
Contact:

Re: iConvert 3.6

Post by rbytes » Wed Nov 07, 2018 10:49 pm

I wasn't aware you had changed the version number of Update Currencies. I will fix that reference in my code.
I also discovered that iConvert 3.6 was not saving its correct name in the "convertname" file. Henceforth it will, so you can read that file to be sure that Update Currencies 2.2 loads the most recent version of iConvert. Since you didn't see the gear button after updating, that tells me that UC was launching the 3.5 version of iConvert. That also explains why viewstate was not set to "idle" when iC was stopped. viewstate was written correctly by version 3.6, but 3.5 did not have code yet to do anything with viewstate, such as updating it to "idle". :lol:

It would be useful for Update Currencies to also save its name to a file - maybe "updatename"? Then iC could read that, and we would always be sure of iConvert calling the most recent version of UC (or at least the most recent that a user has). We can try to keep both programs backward-compatible with each other.

I have corrected the code for iConvert 3.6, and hope all will be well now. :)

There is perhaps a more certain way to keep everything compatible. Have you considered us merging the programs? I have actually created such an animal for my own use, although I would not post it without your approval. I can send it to you by private message if you want to take a look.
####### Living the colorful life #######

User avatar
Dutchman
Posts: 891
Joined: Mon May 06, 2013 9:21 am
My devices: iMac, iPad Air, iPhone
Location: Netherlands
Flag: Netherlands

Re: iConvert 3.6

Post by Dutchman » Thu Nov 08, 2018 8:25 am

rbytes wrote:
Wed Nov 07, 2018 10:49 pm
…snip
There is perhaps a more certain way to keep everything compatible. Have you considered us merging the programs? I have actually created such an animal for my own use, although I would not post it without your approval. I can send it to you by private message if you want to take a look.
Good proposal, of course I have no objection. I am happy to wait for the result, because this back-and-forth trial is not convenient. ;)
We consider it a refreshing mental exercise to figure out ways to circumvent foolishness (Quote from Richard)

User avatar
Dutchman
Posts: 891
Joined: Mon May 06, 2013 9:21 am
My devices: iMac, iPad Air, iPhone
Location: Netherlands
Flag: Netherlands

Re: iConvert 3.6

Post by Dutchman » Thu Nov 08, 2018 12:30 pm

rbytes wrote:
Wed Nov 07, 2018 10:49 pm
I wasn't aware you had changed the version number of Update Currencies. I will fix that reference in my code.
I also discovered that iConvert 3.6 was not saving its correct name in the "convertname" file. Henceforth it will, so you can read that file to be sure that Update Currencies 2.2 loads the most recent version of iConvert. Since you didn't see the gear button after updating, that tells me that UC was launching the 3.5 version of iConvert. That also explains why viewstate was not set to "idle" when iC was stopped. viewstate was written correctly by version 3.6, but 3.5 did not have code yet to do anything with viewstate, such as updating it to "idle". :lol:
…snip
Yes it was my fault. I did not update my version "Convert.sb".
Now it is probably the last version which uses an 'external' update. See previous post. 8-)
We consider it a refreshing mental exercise to figure out ways to circumvent foolishness (Quote from Richard)

User avatar
rbytes
Posts: 1936
Joined: Sun May 31, 2015 12:11 am
My devices: iPhone X
iPad 4
MacBook
Dell Inspiron laptop
CHUWI Plus 10 convertible Windows/Android tablet
Location: Calgary, Canada
Flag: Canada
Contact:

Re: iConvert 3.6

Post by rbytes » Thu Nov 08, 2018 2:27 pm

I think we have done well so far! With all their teams and resources, Apple still manages to mess iOS up regularly. :lol:

Keeping the programs separate for a time was useful to give us both freedom to work out issues. But integrating them will make things easier for users to download and install it.

I have a few changes to make to the combined program. I will color the entire section of Update Currencies code in yellow. Then I will send the code to you by private message. You can examine it and make any changes you want.

UPDATE: The code has been sent to you in a private message, with comments
####### Living the colorful life #######

Post Reply