ZIPP: G1CMZ's Immensely Practical Package
10-21-2015, 09:07 AM
Post: #1
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
ZIPP: G1CMZ's Immensely Practical Package
A collection of programs intended to be immediately practical -

The intention is
1 Results should be quick...
A thunderstorm calculation might ask for an estimate of air temperature: the user knows if its cold or warm. It won't ask for air density or composition. And don't expect meaningful results if you say the air temperature is absolute zero.
2 Results should be easily assimilated...
Expect results to be presented in km, not mm.
Though you can ask for more if you need it.
3 If you need software that can handle such extremes, ask about my technical version. Thunderstorm times for the arctic, or for Mars, anyone? I may need to tweak a few formula...

4 I've seen plenty of thunderstorm distance calculators, but this one helps you do the timing too. No, it doesn't need a datastream.

It does unit conversion too.

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
10-21-2015, 09:08 AM
Post: #2
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
Version 0.1
Code:

#pragma mode( separator(.,;) integer(h32) )

LOCAL ZIPPST:="ZIPP V 0.1 ";
LOCAL SG:=" StephenG1CMZ";
LOCAL NL:=CHAR(10);

LOCAL CD2,CD1;
EXPORT ZIPPRND;//USER ROUNDING

LOCAL THSPD_M;
LOCAL MEAS_INTERVAL_S;

LOCAL TOMI:=1.60344;//MILES UK
LOCAL TONM:=1.852;//NAUTI

MSNK()
BEGIN
LOCAL SNK:=MOUSE();
END;

CONVERT_UNIT_GRP(unit,tname)
BEGIN
LOCAL HLP:=tname+":Enter value(s) using:";

IF CD2 THEN
INPUT({{ x,[2],{45,20,3} }},"","Convert ",HLP+unit[CD2]);
//DETECT ESC
IF string(x,1) == "0" THEN RETURN; END;

a2 := unit[CD2];
a1 := unit[CD1];
t := x + "*" + CONVERT(a2,a1);
RETURN expr(t);
END;
END;

EXPORT CONVERT_UNITS()
BEGIN
LOCAL CHSTYP;
LOCAL TTL:="Unit types";
LOCAL UTYP:={"Length","Area","Volume",
"Time","Speed","Acceleration","Mass","Force",
"Energy","Power","Pressure","Temperature:NO!",

LOCAL UL:={};

CHOOSE(CHSTYP,TTL,UTYP);
CASE
IF CHSTYP==1 THEN //LENGTH
//CONVERT_Length();
UL:={1_m,1_cm,1_mm,1_km,1_in,1_ft,1_yd,1_mile,1_nmi,1_au,1_lyr,1_pc,1_Å};
END;
IF CHSTYP==2 THEN //AREA
UL:={1_(cm²),1_(m²),1_(km²),1_(in²),1_(ft²),1_(yd²),1_(mile²),1_(miUS²),1_a​cre,1_ha,1_a,1_b};//A:Are B:Barn
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==3 THEN //VOLUME
UL:={1_(cm^3),1_(m^3),1_ml,1_l,1_(in^3),1_(ft^3),1_(yd^3),1_ptUK,1_galUK,1_​galUS};
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==4 THEN //TIME
UL:={1_s,1_min,1_h,1_d,1_yr,1_Hz};
END;
IF CHSTYP==5 THEN //SPEED
END;
IF CHSTYP==6 THEN //ACCEL
END;
IF CHSTYP==7 THEN //MASS
UL:={1_g,1_kg,1_oz,1_lb,1_tonUK,1_tonUS,1_mol,1_u,1_t};
END;
IF CHSTYP==8 THEN //FORCE
UL:={1_(kg*m/s²),1_N,1_dyn,1_lbf,1_kip,1_gf,1_pdl};
END;
IF CHSTYP==9 THEN //ENERGY
UL:={1_(kg*m²/s²),1_J,1_Wh,1_kWh,1_(ft*lbf),1_kcal,1_cal,1_eV,1_MeV,1_Btu,1_erg,1_thermUK,1_th​ermEC,1_thermUS};
END;
IF CHSTYP==10 THEN //POWER
UL:={1_(kg*m²/s^3),1_W,1_MW,1_hp,1_(ft*lbf/s)};
END;
IF CHSTYP==11 THEN //PRESSURE
UL:={1_(kg/(m*s²)),1_Pa,1_bar,1_atm,1_psi,1_torr,1_mmHg,1_inHg,1_inH2O};
END;
IF CHSTYP==13 THEN //ELEC
UL:={1_A,1_V,1_C,1_Ohm,1_F,1_Fdy,1_Wb,1_H,1_mho,1_T,1_(A*h),1_S};
END;
IF CHSTYP==14 THEN //LIGHT:HP MISSING MOST UNITS
UL:={1_cd,1_flam};
END;
IF CHSTYP==15 THEN //ANGL
END;
IF CHSTYP==16 THEN //VISCOSITY
UL:={1_(m²/s),1_P,1_St};
END;
UL:={1_Bq,1_Ci,1_Gy,1_rd,1_rem,1_Sv,1_R};
END;
DEFAULT
//DO NOT CONVERT_UNIT_GRP(UL);
END;
IF SIZE(UL)>0 THEN //AND CHSTYP>0
MSGBOX(CONVERT_UNIT_GRP(UL,UTYP(CHSTYP)),1);
END;
END;

INPUT_INTERVAL_H(TTL)
BEGIN
LOCAL HH,MM,SS;
LOCAL LBL:={"HH","MM","SS"};
LOCAL HLP:="HH MM SS:ETC";
INPUT({HH,MM,SS},TTL,LBL,HLP,0,0);
RETURN HH+(MM/60)+(SS/3600);
END;

EXPORT MEASURE_INTERVAL_S()
BEGIN
LOCAL TICKB,TICKE,TICKL;
LOCAL TS,KK;
LOCAL MI:=0;
LOCAL MST:="MEASURE SHORT INTERVAL"+NL;
LOCAL MST1:="OK or Enter: Start"+NL;
LOCAL MST2:="Enter:Enter HMS numerically"+NL;
LOCAL MST3:="ANY KEY: End"+NL;
//LOCAL CNW:="CONNECTIVITY:NO HP DATA";
LOCAL ENINST:="Enter INTERVAL";

TICKB:=MSGBOX(MST+MST1+MST2+MST3,1);
IF TICKB THEN
RECT();
TICKB:=Ticks; TS:=Time;
TICKL:=TICKB;
REPEAT
MSNK;
IF Ticks-TICKL≥1000 THEN
TICKL:=Ticks;
RECT();
TEXTOUT_P(→HMS(ROUND((Ticks-TICKB)/1000,0)/3600),0,20);
MSNK;
TEXTOUT_P(TS+MST,0,180);
TEXTOUT_P(MST2,0,200);
TEXTOUT_P(MST3,0,220);

END;
WAIT(0.001);
MSNK;
KK:=GETKEY;
UNTIL KK≥0;
TICKE:=Ticks;
MI:=(TICKE-TICKB)/1000;
IF KK==30 THEN //ENTER
MI:=3600*INPUT_INTERVAL_H(ENINST);
END;
END;
RETURN MEAS_INTERVAL_S:=ROUND(MI,ZIPPRND);
END;

THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C)
//INTERVAL
BEGIN
LOCAL DISTM;

THSPD_M:=331.4+0.6*TEMP_C;//M/S
DISTM:=INTERVAL_S*THSPD_M;
RETURN ROUND(DISTM,ZIPPRND);
END;

EXPORT THUNDER_DISTANCE()
BEGIN
LOCAL OK;
LOCAL THDST:={};
LOCAL THDM,THDKM,THDMI,THDNM;
LOCAL INTERVAL_S,TEMP_C;
LOCAL TTL:="THUNDER DISTANCE"+SG;
LOCAL LBL:={"Interval s","Temp C"};
LOCAL HLP:={"Interval sound-light. (0:use measured value)","temp C eg 0..20:Ground −57: Aircraft"};
OK:=INPUT({INTERVAL_S,TEMP_C},TTL,LBL,HLP,MEAS_INTERVAL_S,0);
IF OK THEN
IF INTERVAL_S≤0 THEN //IMPORT VALUE
INTERVAL_S:=MEAS_INTERVAL_S;
END;
THDM:=THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C);
THDKM:=THDM/1000;
THDMI:=THDKM/TOMI;
THDNM:=THDKM/TONM;

THDST(1):=ROUND(INTERVAL_S,0)+" s"+" @ "+ROUND(THSPD_M,ZIPPRND)+" m/s"+NL;
THDST(2):=THDM+" m "+ROUND(THDKM,ZIPPRND)+" km"+NL;
THDST(3):=ROUND(THDMI,ZIPPRND)+" milesUK"+NL;
THDST(4):=ROUND(THDNM,ZIPPRND)+" Nautical Miles";
MSGBOX(THDST(1)+THDST(2)+THDST(3)+THDST(4));
RETURN THDST(2);
END;
END;

BEGIN
LOCAL ST:="StephenG1CMZ is a programmer and can work to your requirements."+NL;
LOCAL SZ:="ZIPP provides useful practical results.
Ask, if you need technical results."+NL;
LOCAL THANX:="Thanks Han for the CONVERT syntax."+NL;
LOCAL LGL:="No liability is accepted.";
PRINT(); PRINT(CRID);
PRINT(ST+NL+SZ);
PRINT(THANX);
PRINT(LGL);
WAIT;
END;

HELP ()
BEGIN
LOCAL ST:="To change the number of digits displayed:
ZIPPRND:=n where n=−12..12"+NL;

LOCAL CVT:="CONVERT
Note that not all units within a group can be converted.
Conversion between groups (eg length*length to area) is not implemented here."+NL;
PRINT(); PRINT(CRID);
PRINT(CVT+ST);
WAIT;
END;

EXPORT G1CMZ_IMMENSELY_PRACTICAL_PACKAGE ()
BEGIN
LOCAL CHS;

REPEAT
CASE
IF CHS==2 THEN HELP() END;
IF CHS==3 THEN CONVERT_UNITS() END;
IF CHS==4 THEN MSGBOX(MEASURE_INTERVAL_S()+" s",1) END;
IF CHS==5 THEN THUNDER_DISTANCE() END;
IF CHS==6 THEN CHS:=0 END;
DEFAULT
END;
//WAIT;
UNTIL CHS==0;

END;

EXPORT ZIPP()
BEGIN
G1CMZ_IMMENSELY_PRACTICAL_PACKAGE();
END;

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
10-22-2015, 11:00 PM
Post: #3
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
Version 0.2:
Now supports SI prefixes in unit conversions. User interface tweaked.
Code:

#pragma mode( separator(.,;) integer(h32) )

LOCAL ZIPPST:="ZIPP V 0.2 ";
LOCAL SG:=" StephenG1CMZ";
LOCAL NL:=CHAR(10);

LOCAL CDFROM,CDTO;
EXPORT ZIPPROUND;//USER ROUNDING

LOCAL THSPD_M;
LOCAL MEAS_INTERVAL_S;

LOCAL TOMI:=1.60344;//MILES UK
LOCAL TONM:=1.852;//NAUTI

//SI PREFIXES
LOCAL YOTTA:=1ᴇ24;
LOCAL ZETTA:=1ᴇ21;
LOCAL EXA  :=1ᴇ18;
LOCAL PETA :=1ᴇ15;
LOCAL TERA :=1ᴇ12;
LOCAL GIGA :=1ᴇ9;
LOCAL MEGA :=1ᴇ6;
LOCAL KILO :=1ᴇ3;
LOCAL HECTO:=1ᴇ2;
LOCAL DECA :=1ᴇ1;
LOCAL DECI :=1ᴇ−1;
LOCAL CENTI:=1ᴇ−2;
LOCAL MILLI:=1ᴇ−3;
LOCAL MICRO:=1ᴇ−6;
LOCAL NANO :=1ᴇ−9;
LOCAL PICO :=1ᴇ−12;
LOCAL FEMTO:=1ᴇ−15;
LOCAL ATTO :=1ᴇ−18;
LOCAL ZEPTO:=1ᴇ−21;
LOCAL YOCTO:=1ᴇ−24;

MSNK()
BEGIN
LOCAL SNK:=MOUSE();
END;

CONVERT_UNIT_GRP(unit,tname)
BEGIN
LOCAL UF;
LOCAL TTL:="TO USE SI PREFIXES: TYPE PREFIXNAME";
LOCAL HLP:=tname+": Enter value(s) using: ";

IF CDFROM THEN
UF:=MID(STRING(unit[CDFROM]),3);//REMOVE 1_
INPUT({{ x,[2],{45,20,3} }},TTL,"Convert ",HLP+UF);
//DETECT ESC
IF string(x,1) == "0" THEN RETURN; END;

a2 := unit[CDFROM];
a1 := unit[CDTO];
t := x + "*" + CONVERT(a2,a1);
RETURN expr(t);
END;
END;

EXPORT CONVERT_UNITS()
BEGIN
LOCAL CHSTYP;
LOCAL TTL:="Unit types";
LOCAL UTYP:={"Length","Area","Volume",
"Time","Speed","Acceleration","Mass","Force",
"Energy","Power","Pressure","Temperature:NO!",

LOCAL UL:={};

CHOOSE(CHSTYP,TTL,UTYP);
CASE
IF CHSTYP==1 THEN //LENGTH
//CONVERT_Length();
UL:={1_m,1_cm,1_mm,1_km,1_in,1_ft,1_yd,1_mile,1_nmi,1_au,1_lyr,1_pc,1_Å};
END;
IF CHSTYP==2 THEN //AREA
UL:={1_(cm²),1_(m²),1_(km²),1_(in²),1_(ft²),1_(yd²),1_(mile²),1_(miUS²),1_a​cre,1_ha,1_a,1_b};//A:Are B:Barn
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==3 THEN //VOLUME
UL:={1_(cm^3),1_(m^3),1_ml,1_l,1_(in^3),1_(ft^3),1_(yd^3),1_ptUK,1_galUK,1_​galUS};
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==4 THEN //TIME
UL:={1_s,1_min,1_h,1_d,1_yr,1_Hz};
END;
IF CHSTYP==5 THEN //SPEED
END;
IF CHSTYP==6 THEN //ACCEL
END;
IF CHSTYP==7 THEN //MASS
UL:={1_g,1_kg,1_oz,1_lb,1_tonUK,1_tonUS,1_mol,1_u,1_t};
END;
IF CHSTYP==8 THEN //FORCE
UL:={1_(kg*m/s²),1_N,1_dyn,1_lbf,1_kip,1_gf,1_pdl};
END;
IF CHSTYP==9 THEN //ENERGY
UL:={1_(kg*m²/s²),1_J,1_Wh,1_kWh,1_(ft*lbf),1_kcal,1_cal,1_eV,1_MeV,1_Btu,1_erg,1_thermUK,1_th​ermEC,1_thermUS};
END;
IF CHSTYP==10 THEN //POWER
UL:={1_(kg*m²/s^3),1_W,1_MW,1_hp,1_(ft*lbf/s)};
END;
IF CHSTYP==11 THEN //PRESSURE
UL:={1_(kg/(m*s²)),1_Pa,1_bar,1_atm,1_psi,1_torr,1_mmHg,1_inHg,1_inH2O};
END;
IF CHSTYP==13 THEN //ELEC
UL:={1_A,1_V,1_C,1_Ohm,1_F,1_Fdy,1_Wb,1_H,1_mho,1_T,1_(A*h),1_S};
END;
IF CHSTYP==14 THEN //LIGHT:HP MISSING MOST UNITS
UL:={1_cd,1_flam};
END;
IF CHSTYP==15 THEN //ANGL
END;
IF CHSTYP==16 THEN //VISCOSITY
UL:={1_(m²/s),1_P,1_St};
END;
UL:={1_Bq,1_Ci,1_Gy,1_rd,1_rem,1_Sv,1_R};
END;
DEFAULT
//DO NOT CONVERT_UNIT_GRP(UL);
END;
IF SIZE(UL)>0 THEN //AND CHSTYP>0
MSGBOX(CONVERT_UNIT_GRP(UL,UTYP(CHSTYP)),1);
END;
END;

INPUT_INTERVAL_H(TTL)
BEGIN
LOCAL HH,MM,SS;
LOCAL IV:="INTERVAL ";
LOCAL LBL:={IV+"HH",IV+"MM",IV+"SS"};
LOCAL HLP1:="Decimals & Fractions allowed";
LOCAL HLP:={HLP1,HLP1,HLP1};

INPUT({HH,MM,SS},TTL,LBL,HLP,0,0);
RETURN HH+(MM/60)+(SS/3600);
END;

EXPORT MEASURE_INTERVAL_S()
BEGIN
LOCAL TICKB,TICKE,TICKL;
LOCAL TS,KK;
LOCAL MI:=0;

LOCAL MST:="MEASURE SHORT INTERVAL"+NL;
LOCAL MST1:="OK or Enter: Start"+NL;
LOCAL MST2:="Enter:Enter HMS numerically"+NL;
LOCAL MST3:="ANY KEY: End"+NL;
//LOCAL CNW:="CONNECTIVITY:NO HP DATA";
LOCAL ENINST:="Enter INTERVAL";

TICKB:=MSGBOX(MST+MST1+MST2+MST3,1);
IF TICKB THEN
RECT();
TICKB:=Ticks; TS:=Time;
TICKL:=TICKB;
REPEAT
MSNK;
IF Ticks-TICKL≥1000 THEN
TICKL:=Ticks;
RECT();
TEXTOUT_P(→HMS(ROUND((Ticks-TICKB)/1000,0)/3600),0,20);
MSNK;
TEXTOUT_P(TS+MST,0,180);
TEXTOUT_P(MST2,0,200);
TEXTOUT_P(MST3,0,220);

END;
WAIT(0.001);
MSNK;
KK:=GETKEY;
UNTIL KK≥0;
TICKE:=Ticks;
MI:=(TICKE-TICKB)/1000;
IF KK==30 THEN //ENTER
MI:=3600*INPUT_INTERVAL_H(ENINST);
END;
END;
RETURN MEAS_INTERVAL_S:=ROUND(MI,ZIPPROUND);
END;

THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C)
//INTERVAL
BEGIN
LOCAL DISTM;

THSPD_M:=331.4+0.6*TEMP_C;//M/S
DISTM:=INTERVAL_S*THSPD_M;
RETURN ROUND(DISTM,ZIPPROUND);
END;

EXPORT THUNDER_DISTANCE()
BEGIN
LOCAL OK;
LOCAL THDST:={};
LOCAL THDM,THDKM,THDMI,THDNM;
LOCAL INTERVAL_S,TEMP_C;
LOCAL TTL:="THUNDER DISTANCE"+SG;
LOCAL LBL:={"Interval s","Temp C"};
LOCAL HLP:={"Interval sound-light. (0:use measured value)","temp C eg 0..20:Ground −57: Aircraft"};
OK:=INPUT({INTERVAL_S,TEMP_C},TTL,LBL,HLP,MEAS_INTERVAL_S,0);
IF OK THEN
IF INTERVAL_S≤0 THEN //IMPORT VALUE
INTERVAL_S:=MEAS_INTERVAL_S;
END;
THDM:=THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C);
THDKM:=THDM/1000;
THDMI:=THDKM/TOMI;
THDNM:=THDKM/TONM;

THDST(1):=ROUND(INTERVAL_S,0)+" s"+" @ "+ROUND(THSPD_M,ZIPPROUND)+" m/s"+NL;
THDST(2):=THDM+" m "+ROUND(THDKM,ZIPPROUND)+" km"+NL;
THDST(3):=ROUND(THDMI,ZIPPROUND)+" milesUK"+NL;
THDST(4):=ROUND(THDNM,ZIPPROUND)+" Nautical Miles";
MSGBOX(THDST(1)+THDST(2)+THDST(3)+THDST(4));
RETURN THDST(2);
END;
END;

BEGIN
LOCAL ST:="StephenG1CMZ is a programmer and can work to your requirements."+NL;
LOCAL SZ:="ZIPP provides useful practical results.
Ask, if you need technical results."+NL;
LOCAL THANX:="Thanks Han for the CONVERT syntax."+NL;
LOCAL LGL:="No liability is accepted.";
PRINT(); PRINT(CRID);
PRINT(ST+NL+SZ);
PRINT(THANX);
PRINT(LGL);
WAIT;
END;

HELP ()
BEGIN
LOCAL ST:="To change the number of digits displayed:
ZIPPROUND:=n where n=−12..12"+NL;

LOCAL CVT:="CONVERT
Note that not all units within a group can be converted. Conversion between groups (eg length*length to area) is not implemented here.
SI prefixes allowed, e.g. INPUT 1*NANO (Type it, Do not select from Prefix menu)"+NL ;

PRINT(); PRINT(CRID);
PRINT(CVT+ST);
WAIT;
END;

EXPORT G1CMZ_IMMENSELY_PRACTICAL_PACKAGE ()
BEGIN
LOCAL CHS;

REPEAT
CASE
IF CHS==2 THEN HELP() END;
IF CHS==3 THEN CONVERT_UNITS() END;
IF CHS==4 THEN MSGBOX(MEASURE_INTERVAL_S()+" s",1) END;
IF CHS==5 THEN THUNDER_DISTANCE() END;
IF CHS==6 THEN CHS:=0 END;
DEFAULT
END;
//WAIT;
UNTIL CHS==0;

END;

EXPORT ZIPP()
BEGIN
G1CMZ_IMMENSELY_PRACTICAL_PACKAGE();
END;

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
10-24-2015, 06:01 PM
Post: #4
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
Version 0.3:
User interface improved. Multilingual support added.
In English, et maintenant en francais aussi (translated with the help of Google).
Code:

#pragma mode( separator(.,;) integer(h32) )

LOCAL ZIPPST:="ZIPP V 0.3 ";
LOCAL SG:=" StephenG1CMZ";
LOCAL NL:=CHAR(10);
LOCAL SL:=1;

LOCAL CDFROM,CDTO;
EXPORT ZIPPROUND;//USER ROUNDING

LOCAL THSPD_M;
LOCAL MEAS_INTERVAL_S;

LOCAL TOMI:=1.60344;//MILES UK
LOCAL TONM:=1.852;//NAUTI

//SI PREFIXES
LOCAL YOTTA:=1ᴇ24;
LOCAL ZETTA:=1ᴇ21;
LOCAL EXA  :=1ᴇ18;
LOCAL PETA :=1ᴇ15;
LOCAL TERA :=1ᴇ12;
LOCAL GIGA :=1ᴇ9;
LOCAL MEGA :=1ᴇ6;
LOCAL KILO :=1ᴇ3;
LOCAL HECTO:=1ᴇ2;
LOCAL DECA :=1ᴇ1;
LOCAL DECI :=1ᴇ−1;
LOCAL CENTI:=1ᴇ−2;
LOCAL MILLI:=1ᴇ−3;
LOCAL MICRO:=1ᴇ−6;
LOCAL NANO :=1ᴇ−9;
LOCAL PICO :=1ᴇ−12;
LOCAL FEMTO:=1ᴇ−15;
LOCAL ATTO :=1ᴇ−18;
LOCAL ZEPTO:=1ᴇ−21;
LOCAL YOCTO:=1ᴇ−24;

LOCAL NMST:={" Nautical Miles"," Miles Nautique"};
LOCAL LANGS:={"English","Français"};
//e233

LOCAL CHOICES:={{"ABOUT","HELP","CONVERT UNITS","MEASURE INTERVAL s","THUNDER DISTANCE","EXIT",LANGS},
{"SUR","AIDEZ","CONVERTIR DES UNITÉS","INTERVALLE DE MESURE s","DISTANCEdeTONNERRE","AU REVOIR",LANGS}};

BEGIN
LOCAL ST:="StephenG1CMZ is a programmer and can work to your requirements."+NL;
LOCAL SZ:="ZIPP provides useful practical results.
Ask, if you need technical results."+NL;
LOCAL THANX:="Thanks Han for the CONVERT syntax."+NL;
LOCAL LGL:="No liability is accepted.";
PRINT(); PRINT(CRID);
PRINT(ST+NL+SZ);
PRINT(THANX);
PRINT(LGL);
WAIT;
END;

MSNK()
BEGIN
LOCAL SNK:=MOUSE();
END;

BEGIN
LOCAL II;
LOCAL OUTL:={};

FOR II FROM 1 TO SIZE(INL)  DO
OUTL(II):=REPLACE(STRING(INL(II)),"1_","");
END;
RETURN OUTL;
END;

CONVERT_UNIT_GRP(unit,tname)
BEGIN
LOCAL UF;
LOCAL TTL:={"To use SI prefixes: INPUT PREFIXNAME",
"SI préfixe: Saisissez le nom du préfixe"};

LOCAL EVUST:={
": Enter value(s) using: ",
": Entrez le(s) valeur(s) à l aide: "};
LOCAL HLP:=tname+EVUST(SL);
LOCAL UST:={"Units:","Unités:"};
LOCAL TOST:={"To ","À "};
LOCAL CNVRT:={"Convert","Convertir"};

IF CDFROM THEN
UF:=REPLACE(STRING(unit[CDFROM]),"1_",""); //TRIM 1_
INPUT({{ x,[2],{45,20,3} }},TTL(SL),CNVRT(SL),HLP+UF);
//DETECT ESC
IF string(x,1) == "0" THEN RETURN; END;

a2 := unit[CDFROM];
a1 := unit[CDTO];
t := x + "*" + CONVERT(a2,a1);
RETURN expr(t);
END;
END;

EXPORT CONVERT_UNITS()
BEGIN
LOCAL CHSTYP;
LOCAL TTL:={"Unit types","Types d unités"};
LOCAL UTYP:={"Length","Area","Volume",
"Time","Speed","Acceleration","Mass","Force",
"Energy","Power","Pressure","Temperature:NO!",

LOCAL UL:={};

CHOOSE(CHSTYP,TTL(SL),UTYP);
CASE
IF CHSTYP==1 THEN //LENGTH
//CONVERT_Length();
UL:={1_m,1_cm,1_mm,1_km,1_in,1_ft,1_yd,1_mile,1_nmi,1_au,1_lyr,1_pc,1_Å};
END;
IF CHSTYP==2 THEN //AREA
UL:={1_(cm²),1_(m²),1_(km²),1_(in²),1_(ft²),1_(yd²),1_(mile²),1_(miUS²),1_a​cre,1_ha,1_a,1_b};//A:Are B:Barn
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==3 THEN //VOLUME
UL:={1_(cm^3),1_(m^3),1_ml,1_l,1_(in^3),1_(ft^3),1_(yd^3),1_ptUK,1_galUK,1_​galUS};
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==4 THEN //TIME
UL:={1_s,1_min,1_h,1_d,1_yr,1_Hz};
END;
IF CHSTYP==5 THEN //SPEED
END;
IF CHSTYP==6 THEN //ACCEL
END;
IF CHSTYP==7 THEN //MASS
UL:={1_g,1_kg,1_oz,1_lb,1_tonUK,1_tonUS,1_mol,1_u,1_t};
END;
IF CHSTYP==8 THEN //FORCE
UL:={1_(kg*m/s²),1_N,1_dyn,1_lbf,1_kip,1_gf,1_pdl};
END;
IF CHSTYP==9 THEN //ENERGY
UL:={1_(kg*m²/s²),1_J,1_Wh,1_kWh,1_(ft*lbf),1_kcal,1_cal,1_eV,1_MeV,1_Btu,1_erg,1_thermUK,1_th​ermEC,1_thermUS};
END;
IF CHSTYP==10 THEN //POWER
UL:={1_(kg*m²/s^3),1_W,1_MW,1_hp,1_(ft*lbf/s)};
END;
IF CHSTYP==11 THEN //PRESSURE
UL:={1_(kg/(m*s²)),1_Pa,1_bar,1_atm,1_psi,1_torr,1_mmHg,1_inHg,1_inH2O};
END;
IF CHSTYP==13 THEN //ELEC
UL:={1_A,1_V,1_C,1_Ohm,1_F,1_Fdy,1_Wb,1_H,1_mho,1_T,1_(A*h),1_S};
END;
IF CHSTYP==14 THEN //LIGHT:HP MISSING MOST UNITS
UL:={1_cd,1_flam};
END;
IF CHSTYP==15 THEN //ANGL
END;
IF CHSTYP==16 THEN //VISCOSITY
UL:={1_(m²/s),1_P,1_St};
END;
UL:={1_Bq,1_Ci,1_Gy,1_rd,1_rem,1_Sv,1_R};
END;
DEFAULT
END;
IF SIZE(UL)>0 THEN //AND CHSTYP>0
MSGBOX(CONVERT_UNIT_GRP(UL,UTYP(CHSTYP)),1);
END;
END;

INPUT_INTERVAL_H(TTL)
BEGIN
LOCAL HH,MM,SS;
LOCAL IV:={"Interval ","Intervalle "};
LOCAL LBL:={IV(SL)+"HH",IV(SL)+"MM",IV(SL)+"SS"};
LOCAL HLP1:={"Decimals & Fractions allowed",
"Décimaux et les fractions permis"};
LOCAL HLP:={HLP1(SL),HLP1(SL),HLP1(SL)};

INPUT({HH,MM,SS},TTL,LBL,HLP,0,0);
RETURN HH+(MM/60)+(SS/3600);
END;

EXPORT MEASURE_INTERVAL_S()
BEGIN
LOCAL TICKB,TICKE,TICKL;
LOCAL TS,KK;
LOCAL MI:=0;

LOCAL MST:={"MEASURE SHORT INTERVAL"+NL,
"MESURE COURT INTERVALLE"+NL};
LOCAL MST1:={"OK or Enter: Start"+NL,
"OK ou Entrer: Commencez"+NL};
LOCAL MST2:={"Enter:Enter HMS numerically"+NL,
"Entrer: Entrez HMS numeriquement"+NL};
LOCAL MST3:={"ANY KEY: End"+NL,
"N importe quelle clé: Terminer"+NL};
//LOCAL CNW:="CONNECTIVITY:NO HP DATA";
LOCAL ENINST:={"Enter INTERVAL","Entrez INTERVALLE"};

TICKB:=MSGBOX(MST(SL)+MST1(SL)+MST2(SL)+MST3(SL),1);
IF TICKB THEN
RECT();
TICKB:=Ticks; TS:=Time;
TICKL:=TICKB;
REPEAT
MSNK;
IF Ticks-TICKL≥1000 THEN
TICKL:=Ticks;
RECT();
TEXTOUT_P(→HMS(ROUND((Ticks-TICKB)/1000,0)/3600),0,20);
MSNK;
TEXTOUT_P(TS+MST(SL),0,180);
TEXTOUT_P(MST2(SL),0,200);
TEXTOUT_P(MST3(SL),0,220);

END;
WAIT(0.001);
MSNK;
KK:=GETKEY;
UNTIL KK≥0;
TICKE:=Ticks;
MI:=(TICKE-TICKB)/1000;
IF KK==30 THEN //ENTER
MI:=3600*INPUT_INTERVAL_H(ENINST(SL));
END;
END;
RETURN MEAS_INTERVAL_S:=ROUND(MI,ZIPPROUND);
END;

THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C)
//INTERVAL
BEGIN
LOCAL DISTM;

THSPD_M:=331.4+0.6*TEMP_C;//M/S
DISTM:=INTERVAL_S*THSPD_M;
RETURN ROUND(DISTM,ZIPPROUND);
END;

EXPORT THUNDER_DISTANCE()
BEGIN
LOCAL OK;
LOCAL THDST:={};
LOCAL THDM,THDKM,THDMI,THDNM;
LOCAL INTERVAL_S,TEMP_C;

LOCAL TTL:=CHOICES(SL,5)+SG;
LOCAL LBL:={{"Interval s","Temp C"},
{"Intervalle s","Temp C"}};
LOCAL HLP:={{"Interval sound-light. (0:use measured value)","Temp C eg 0..20:Ground −57: Aircraft"},
{"Intervalle sonner-lumière. 0:La valeur de mesure","Temp C eg 0..20:Terre −57:Avion"}};
OK:=INPUT({INTERVAL_S,TEMP_C},TTL,LBL(SL),HLP(SL),MEAS_INTERVAL_S,0);
IF OK THEN
IF INTERVAL_S≤0 THEN //IMPORT VALUE
INTERVAL_S:=MEAS_INTERVAL_S;
END;
THDM:=THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C);
THDKM:=THDM/1000;
THDMI:=THDKM/TOMI;
THDNM:=THDKM/TONM;

THDST(1):=ROUND(INTERVAL_S,0)+" s"+" @ "+ROUND(THSPD_M,ZIPPROUND)+" m/s"+NL;
THDST(2):=THDM+" m "+ROUND(THDKM,ZIPPROUND)+" km"+NL;
THDST(3):=ROUND(THDMI,ZIPPROUND)+" milesUK"+NL;
THDST(4):=ROUND(THDNM,ZIPPROUND)+NMST(SL);
MSGBOX(THDST(1)+THDST(2)+THDST(3)+THDST(4));
RETURN THDST(2);
END;
END;

ZIPP_HELP ()
BEGIN
LOCAL CHS;
LOCAL HLPST:={"HELP","AIDEZ"};
LOCAL PFXS:={"PREFIXES","PRÉFIXES"};
LOCAL HLPCHO:={"SI "+PFXS(SL),"VARIABLES"};
LOCAL HC:=CONCAT(HLPCHO,CHOICES(SL));

LOCAL SIPRFX:={"
ENTER IN UPPERCASE
YOU GET WHAT YOU SAY
Selecting Units/Prefix (Shift C) will not work."+NL,
"Entrez en majuscule
VOUS OBTENEZ QUEL CE VOUS DEMANDEZ
Selection Unites/Prefixe (Decalage C) ne marchant pas."+NL};
LOCAL SIPRFXEG:="
3MILLI _m
3MILLI _cm
3MILLI _inch";
LOCAL ST:={"
To change the number of digits displayed:","
Pour changez l arondissement:"};
LOCAL STEG:="
@Home:
ZIPPROUND:=n  [n=−12..12]"+NL;

LOCAL CVT:={"
Note that not all units within a group can be converted. Conversion between groups (eg length*length to area) is not implemented here.
SI prefixes OK.
Lists and variables OK."+NL, "
Notez que toutes les unités d un groupe ne_peuvent pas etre convertis.
SI préfixes OK.
Listes et variables OK"+NL};

PRINT(); PRINT(CRID);
CHOOSE(CHS,HLPST(SL),HC);
IF CHS THEN
PRINT(HC(CHS));
CASE
IF CHS==5 THEN PRINT(CVT(SL))  END;
IF CHS==1 THEN PRINT(SIPRFX(SL)+SIPRFXEG) END;
IF CHS==2 THEN PRINT(ST(SL)+STEG) END;
DEFAULT
END;
WAIT;
END;
END;

SELECT_LANGUAGE()
BEGIN
LOCAL CHS;
CHOOSE(CHS,LANGS(SL),LANGS);//CURRENT
IF CHS THEN
SL:=CHS;
END;
END;

EXPORT G1CMZ_IMMENSELY_PRACTICAL_PACKAGE ()
BEGIN
LOCAL CHS;

REPEAT
CHOOSE(CHS,CRID,CHOICES(SL));
CASE
IF CHS==2 THEN ZIPP_HELP() END;
IF CHS==3 THEN CONVERT_UNITS() END;
IF CHS==4 THEN MSGBOX(MEASURE_INTERVAL_S()+" s",1) END;
IF CHS==5 THEN THUNDER_DISTANCE() END;
IF CHS==6 THEN CHS:=0 END;
IF CHS==7 THEN SELECT_LANGUAGE() END;
DEFAULT
END;
//WAIT;
UNTIL CHS==0;

END;

EXPORT ZIPP()
BEGIN
G1CMZ_IMMENSELY_PRACTICAL_PACKAGE();
END;

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
10-28-2015, 10:53 PM (This post was last modified: 10-29-2015 10:46 PM by StephenG1CMZ.)
Post: #5
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
Version 0.4:
All functions improved, new functionality added and translations improved.
You will need to create an empty procedure (or comment out the call). - this procedure will be uploaded as a separate program in the next few days.
(Update: Z LIGHTS is now available, so you can install this instead of creating an empty procedure)
Code:

#pragma mode( separator(.,;) integer(h32) )

LOCAL ZIPPST:="ZIPP V 0.4 ";
LOCAL SG:=" StephenG1CMZ";
LOCAL NL:=CHAR(10);
LOCAL SL:=1;

//IMPORT Z_LIGHTS();

LOCAL CDFROM,CDTO;
EXPORT ZIPPROUND;//USER ROUNDING

LOCAL THSPD_M;
LOCAL MEAS_INTERVAL_S;

LOCAL TOMI:=1.60344;//MILES UK
LOCAL TONM:=1.852;//NAUTI

//SI PREFIXES
LOCAL YOTTA:=1ᴇ24;
LOCAL ZETTA:=1ᴇ21;
LOCAL EXA  :=1ᴇ18;
LOCAL PETA :=1ᴇ15;
LOCAL TERA :=1ᴇ12;
LOCAL GIGA :=1ᴇ9;
LOCAL MEGA :=1ᴇ6;
LOCAL KILO :=1ᴇ3;
LOCAL HECTO:=1ᴇ2;
LOCAL DECA :=1ᴇ1;
LOCAL DECI :=1ᴇ−1;
LOCAL CENTI:=1ᴇ−2;
LOCAL MILLI:=1ᴇ−3;
LOCAL MICRO:=1ᴇ−6;
LOCAL NANO :=1ᴇ−9;
LOCAL PICO :=1ᴇ−12;
LOCAL FEMTO:=1ᴇ−15;
LOCAL ATTO :=1ᴇ−18;
LOCAL ZEPTO:=1ᴇ−21;
LOCAL YOCTO:=1ᴇ−24;

//UNITS
LOCAL NMST:={" Nautical Miles"," Miles Nautique"};
LOCAL LANGS:={"English","Français"};
LOCAL EN:=1; LOCAL FR:=2;
//e233

//WORDS
LOCAL WENTERZ:={"Enter","Entrez"};
LOCAL WHELP:={"Help","Aide"};
LOCAL WINTERVAL:={"Interval","Intervalle"};
LOCAL WLIGHTS:={"Lights","Lumières"};
LOCAL WUNITS:={"Units","Unités"};
LOCAL WTEMPE:={"Temperature","Température"};
LOCAL WCNVTT:={"Convert "+WTEMPE(EN),"Convertir la "+WTEMPE(FR)};
LOCAL WCNVTU:={"Convert Units","Convertir des Unités"};

{"A PROPOS/"+WHELP(FR),WCNVTU(FR),WLIGHTS(FR),"Intervalle de Mesure s","Distance de Tonnere",LANGS,"QUITTER"}};//FR:P

BEGIN
LOCAL ST:="StephenG1CMZ is a programmer and can work to your requirements."+NL;
LOCAL SZ:="ZIPP provides useful practical results.
Ask, if you need technical results."+NL;
LOCAL THANX:="Thanks Han for the CONVERT syntax.
Thanks Primer."+NL;
LOCAL LGL:="No liability is accepted.";
PRINT(); PRINT(CRID);
PRINT(ST+NL+SZ);
PRINT(THANX);
PRINT(LGL);
WAIT;
END;

TEMP_F2C (FF)
BEGIN
RETURN (FF-32)*5/9;
END;
TEMP_C2F(CC)
BEGIN
RETURN (9/5)*CC+32;
END;

TEMP_K2C(KK)
BEGIN
RETURN KK-273.15;
END;
TEMP_C2K(CC)
BEGIN
RETURN CC+273.15;
END;

CONVERT_TEMP ()
BEGIN
LOCAL OK,TKIND;
LOCAL TEMP,TEMP_C,TEMP_F,TEMP_K;
LOCAL TTL:=WCNVTT(SL);
LOCAL LBL:={WUNITS(SL),WTEMPE(SL)};
LOCAL HLP:="";

OK:=INPUT({{TKIND,TKINDL},TEMP},TTL,LBL,HLP,1,1);
IF OK THEN
CASE
IF TKIND==1 THEN //C
TEMP_C:=TEMP;
TEMP_F:=TEMP_C2F(TEMP_C);
TEMP_K:=TEMP_C2K(TEMP_C);
END;
IF TKIND==2 THEN //F
TEMP_F:=TEMP;
TEMP_C:=TEMP_F2C(TEMP_F);
TEMP_K:=TEMP_C2K(TEMP_C);
END;
IF TKIND==3 THEN //K
TEMP_K:=TEMP;
TEMP_C:=TEMP_K2C(TEMP_K);
TEMP_F:=TEMP_C2F(TEMP_C);
END;
DEFAULT
END;

END;

RETURN {TEMP_C+TKINDL(1),TEMP_F+TKINDL(2),TEMP_K+TKINDL(3)};
END;

MSNK()
BEGIN
LOCAL SNK:=MOUSE();
END;

BEGIN
LOCAL II;
LOCAL OUTL:={};

FOR II FROM 1 TO SIZE(INL)  DO
OUTL(II):=REPLACE(STRING(INL(II)),"1_","");
END;
RETURN OUTL;
END;

CONVERT_UNIT_GRP(unit,tname)
BEGIN
LOCAL UF;
LOCAL TTL:={"To use SI prefixes: INPUT PREFIXNAME",
"SI préfixe: Saisissez le nom du préfixe"};

LOCAL EVUST:={
": Enter value(s) in: ",
":Entrez la/les valeur(s) avec: "};//FR:P
LOCAL HLP:=tname+EVUST(SL);
LOCAL TOST:={"To ","À "};
LOCAL CNVRT:={"Convert","Convertir"};

IF CDFROM THEN
UF:=REPLACE(STRING(unit[CDFROM]),"1_",""); //TRIM 1_
INPUT({{ x,[2],{45,20,3} }},TTL(SL),CNVRT(SL),HLP+UF);
//DETECT ESC
IF string(x,1) == "0" THEN RETURN; END;

a2 := unit[CDFROM];
a1 := unit[CDTO];
t := x + "*" + CONVERT(a2,a1);

RETURN expr(t);
END;
END;

CONVERT_UNITS_HP()
BEGIN
LOCAL CHSTYP;
LOCAL TTL:={"Unit types","Types d'unités"};
LOCAL UTYP:={{"Length","Area","Volume",
"Time","Speed","Acceleration","Mass","Force",
"Energy","Power","Pressure","Temperature:NO!",

{"Longueur","Surface","Volume",
"Heure","Vitesse","Accélération","Masse","Force",
"Energie","Puissance","Pression","Température:NON!",
//TESTING:PUISSANCE(POWER) IS LONGEST INPUT STRING

LOCAL UL:={};

CHOOSE(CHSTYP,TTL(SL),UTYP(SL));
CASE
IF CHSTYP==1 THEN //LENGTH
//CONVERT_Length();
UL:={1_m,1_cm,1_mm,1_km,1_in,1_ft,1_yd,1_mile,1_nmi,1_au,1_lyr,1_pc,1_Å};
END;
IF CHSTYP==2 THEN //AREA
UL:={1_(cm²),1_(m²),1_(km²),1_(in²),1_(ft²),1_(yd²),1_(mile²),1_(miUS²),1_a​cre,1_ha,1_a,1_b};//A:Are B:Barn
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==3 THEN //VOLUME
UL:={1_(cm^3),1_(m^3),1_ml,1_l,1_(in^3),1_(ft^3),1_(yd^3),1_ptUK,1_galUK,1_​galUS};
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==4 THEN //TIME
UL:={1_s,1_min,1_h,1_d,1_yr,1_Hz};
END;
IF CHSTYP==5 THEN //SPEED
END;
IF CHSTYP==6 THEN //ACCEL
END;
IF CHSTYP==7 THEN //MASS
UL:={1_g,1_kg,1_oz,1_lb,1_tonUK,1_tonUS,1_mol,1_u,1_t};
END;
IF CHSTYP==8 THEN //FORCE
UL:={1_(kg*m/s²),1_N,1_dyn,1_lbf,1_kip,1_gf,1_pdl};
END;
IF CHSTYP==9 THEN //ENERGY
UL:={1_(kg*m²/s²),1_J,1_Wh,1_kWh,1_(ft*lbf),1_kcal,1_cal,1_eV,1_MeV,1_Btu,1_erg,1_thermUK,1_th​ermEC,1_thermUS};
END;
IF CHSTYP==10 THEN //POWER
UL:={1_(kg*m²/s^3),1_W,1_MW,1_hp,1_(ft*lbf/s)};
END;
IF CHSTYP==11 THEN //PRESSURE
UL:={1_(kg/(m*s²)),1_Pa,1_bar,1_atm,1_psi,1_torr,1_mmHg,1_inHg,1_inH2O};
END;
IF CHSTYP==12 THEN //TEMP
//UL:={1_K,1_°C,1_°F};
END;
IF CHSTYP==13 THEN //ELEC
UL:={1_A,1_V,1_C,1_Ohm,1_F,1_Fdy,1_Wb,1_H,1_mho,1_T,1_(A*h),1_S};
END;
IF CHSTYP==14 THEN //LIGHT:HP MISSING MOST UNITS
UL:={1_cd,1_flam};
END;
IF CHSTYP==15 THEN //ANGL
END;
IF CHSTYP==16 THEN //VISCOSITY
UL:={1_(m²/s),1_P,1_St};
END;
UL:={1_Bq,1_Ci,1_Gy,1_rd,1_rem,1_Sv,1_R};
END;
DEFAULT
END;
IF SIZE(UL)>0 THEN //AND CHSTYP>0
MSGBOX(CONVERT_UNIT_GRP(UL,UTYP(SL,CHSTYP)),1);
END;
END;

EXPORT CONVERT_UNITS ()
BEGIN
LOCAL CHS;
LOCAL TTL:=WCNVTU(SL)+SG;
CHOOSE(CHS,TTL,{WCNVTT(SL),WCNVTU(SL)});
IF CHS THEN
CASE
IF CHS==1 THEN MSGBOX(CONVERT_TEMP(),1); END;
IF CHS==2 THEN CONVERT_UNITS_HP() END;
DEFAULT
END;
END;
END;

INPUT_INTERVAL_H(TTL)
BEGIN
LOCAL HH,MM,SS,OK;

LOCAL LBL:={WINTERVAL(SL)+" HH",WINTERVAL(SL)+" MM",WINTERVAL(SL)+" SS"};
LOCAL HLP1:={"Decimals & Fractions allowed",
"Décimaux et fractions autorisés"};//FR:P
LOCAL HLP:={HLP1(SL),HLP1(SL),HLP1(SL)};

OK:=INPUT({HH,MM,SS},TTL,LBL,HLP,0,0);
IF OK THEN
RETURN HH+(MM/60)+(SS/3600);
ELSE
RETURN 0; //CANCEL
//HOW TO SIGNAL CANCEL?
END;
END;

EXPORT MEASURE_INTERVAL_S()
BEGIN
LOCAL TICKB,TICKE,TICKL;
LOCAL TS,KK;
LOCAL MI:=0;

LOCAL MST:={"MEASURE SHORT INTERVAL"+NL,
"MESURE COURT INTERVALLE"+NL};
LOCAL MST1:={"OK or Enter: Start"+NL,
"OK ou Entrer: Commencez"+NL};
LOCAL MST2:={"Enter:Enter HMS numerically"+NL,
"Entrer: Entrez HMS numeriquement"+NL};
LOCAL MST3:={"ANY KEY: End"+NL,
"N importe quelle clé: Terminer"+NL};
//LOCAL CNW:="CONNECTIVITY:NO HP DATA";

TICKB:=MSGBOX(MST(SL)+MST1(SL)+MST2(SL)+MST3(SL),1);
IF TICKB THEN
RECT();
TICKB:=Ticks; TS:=Time;
TICKL:=TICKB;
REPEAT
MSNK;
IF Ticks-TICKL≥1000 THEN
TICKL:=Ticks;
RECT();
TEXTOUT_P(→HMS(ROUND((Ticks-TICKB)/1000,0)/3600),0,20);
MSNK;
TEXTOUT_P(TS+MST(SL),0,180);
TEXTOUT_P(MST2(SL),0,200);
TEXTOUT_P(MST3(SL),0,220);

END;
WAIT(0.001);
MSNK;
KK:=GETKEY;
UNTIL KK≥0;
TICKE:=Ticks;
MI:=(TICKE-TICKB)/1000;
IF KK==30 THEN //ENTER
MI:=3600*INPUT_INTERVAL_H(WENTERZ(SL)+" "+WINTERVAL(SL));
//IDEALLY IF A CANCEL IS DETECTED
//OUGHT TO RESUME MEASURED TIMING
END;
END;
RETURN MEAS_INTERVAL_S:=ROUND(MI,ZIPPROUND);
END;

THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C)
//INTERVAL
//CELCIUS (NORMAL RANGE)
BEGIN
LOCAL DISTM;

THSPD_M:=331.4+0.6*TEMP_C;//M/S
DISTM:=INTERVAL_S*THSPD_M;
RETURN ROUND(DISTM,ZIPPROUND);
END;

EXPORT THUNDER_DISTANCE()
BEGIN
LOCAL OK;
LOCAL THDST:={};
LOCAL THDM,THDKM,THDMI,THDNM;
LOCAL INTERVAL_S,TEMP_C,TEMP;
LOCAL TKIND;

LOCAL TTL:=CHOICES(SL,5)+SG;
LOCAL LBL:={WINTERVAL(SL)+" s",WUNITS(SL),WTEMPE(SL)};
LOCAL HLP:={{"Interval sound-light. (0:use measured value)","","EG Temp C 0..20:Ground −57: Aircraft"},
{"Intervalle son-lumière. 0:La valeur mesurée","","ex Temp C 0..20:Terre −57:Avion"}};//FR:P

OK:=INPUT({INTERVAL_S,{TKIND,TKINDL},TEMP},TTL,LBL,HLP(SL),MEAS_INTERVAL_S,​0);

IF OK THEN
CASE
IF TKIND==1 THEN TEMP_C:=TEMP END;
IF TKIND==2 THEN TEMP_C:=TEMP_F2C(TEMP) END;
IF TKIND==3 THEN TEMP_C:=TEMP_K2C(TEMP) END;
DEFAULT
END;
IF INTERVAL_S≤0 THEN //IMPORT VALUE
INTERVAL_S:=MEAS_INTERVAL_S;
END;
THDM:=THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C);
THDKM:=THDM/1000;
THDMI:=THDKM/TOMI;
THDNM:=THDKM/TONM;

THDST(1):=ROUND(INTERVAL_S,0)+" s"+" @ "+ROUND(THSPD_M,ZIPPROUND)+" m/s"+NL;
THDST(2):=THDM+" m "+ROUND(THDKM,ZIPPROUND)+" km"+NL;
THDST(3):=ROUND(THDMI,ZIPPROUND)+" milesUK"+NL;
THDST(4):=ROUND(THDNM,ZIPPROUND)+NMST(SL);
MSGBOX(THDST(1)+THDST(2)+THDST(3)+THDST(4));
RETURN THDST(2);
END;
END;

ZIPP_HELP ()
BEGIN
LOCAL CHS,OK;
LOCAL HLPCHO:={"VARIABLES"};
LOCAL HC:=CONCAT(CHOICES(SL),HLPCHO);

LOCAL SIPRFX:={"
Values may include SI prefixes.
ENTER IN UPPERCASE: Selecting Units/Prefix (Shift C) will not work."+NL,
"Les valeurs peuvent inclure des SI préfixes. Entrez en majuscule: Selection Unites/Préfixe (Decalage C) ne marchant pas."+NL};
LOCAL SIPRFXEG:="
3NANO _m
3MILLI _inch";

LOCAL ST:={"
To change the number of digits displayed:","
Pour changez la précision affichée:"};//FR:P
LOCAL STEG:="
@Home:
ZIPPROUND:=n  [n=−12..12]"+NL;

LOCAL CVT:={"
Note that not all units within a group can be converted. Conversion between groups (eg length*length to area) is not implemented here.
SI prefixes OK.
Lists and variables OK."+NL, "
Notez que toutes les unités d un groupe ne_peuvent pas etre convertis.
SI préfixes OK.
Listes et variables OK."+NL};
LOCAL LIGHTSPROG:={"LIGHTS may be installed separately",
"Lumières peut être installé séparément"};
LOCAL TRBY:="Traduit par "+SG+" et ......";

PRINT(); PRINT(CRID);

OK:=CHOOSE(CHS,WHELP(SL),HC);
IF CHS THEN
PRINT(HC(CHS));
CASE
IF CHS==2 THEN
PRINT(CVT(SL));WAIT;
OK:=MSGBOX(SIPRFX(SL),1);
OK:=MSGBOX(SIPRFXEG,1);
END;
IF CHS==3 THEN PRINT(LIGHTSPROG(SL)) END;
IF CHS==6 THEN PRINT(TRBY) END;
IF CHS==8 THEN PRINT(ST(SL)+STEG) END;
DEFAULT
END;
WAIT;
END;
END;

SELECT_LANGUAGE()
BEGIN
LOCAL CHS;
CHOOSE(CHS,LANGS(SL),LANGS);//CURRENT
IF CHS THEN
SL:=CHS;
END;
END;

EXPORT G1CMZ_IMMENSELY_PRACTICAL_PACKAGE ()
BEGIN
LOCAL CHS;

REPEAT
CHOOSE(CHS,CRID,CHOICES(SL));
CASE
IF CHS==1 THEN ZIPP_HELP() END;
IF CHS==2 THEN CONVERT_UNITS() END;
IF CHS==3 THEN Z_LIGHTS() END;
IF CHS==4 THEN MSGBOX(MEASURE_INTERVAL_S()+" s",1) END;
IF CHS==5 THEN THUNDER_DISTANCE() END;
IF CHS==7 THEN CHS:=0 END;
IF CHS==6 THEN SELECT_LANGUAGE() END;
DEFAULT
END;

UNTIL CHS==0;

END;

EXPORT ZIPP()
BEGIN
G1CMZ_IMMENSELY_PRACTICAL_PACKAGE();
END;

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
10-29-2015, 10:07 AM
Post: #6
 ggauny@live.fr Senior Member Posts: 580 Joined: Nov 2014
RE: ZIPP: G1CMZ's Immensely Practical Package
Dzien dobry Panu,

Super, naprawde fajnie ! To swietnie.
Bardzo dzienkuje.

Do zobaczenia !

Gérard.

Gérard.
11-18-2015, 11:12 AM (This post was last modified: 11-30-2015 09:51 PM by StephenG1CMZ.)
Post: #7
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
If anyone would like to see a different approach to unit conversion, have a look at epp's CNV procedure.

Here is ZIPP Version 0.5. Now with data unit conversions and improvements to language setup.

Code:

#pragma mode( separator(.,;) integer(h32) )

LOCAL ZIPPST:="ZIPP V 0.5 ";
LOCAL SG:=" StephenG1CMZ";
LOCAL NL:=CHAR(10);

LOCAL DEFLT_LANG();
LOCAL SL:=DEFLT_LANG();

//IMPORT Z_LIGHTS();

LOCAL CDFROM,CDTO;
EXPORT ZIPPROUND;//USER ROUNDING

LOCAL THSPD_M;
LOCAL MEAS_INTERVAL_S;
LOCAL VBITS,VBPS,VS;
LOCAL TOMI:=1.60344;//MILES UK
LOCAL TONM:=1.852;//NAUTI

//SI PREFIXES
LOCAL YOTTA:=1ᴇ24;
LOCAL ZETTA:=1ᴇ21;
LOCAL EXA  :=1ᴇ18;
LOCAL PETA :=1ᴇ15;
LOCAL TERA :=1ᴇ12;
LOCAL GIGA :=1ᴇ9;
LOCAL MEGA :=1ᴇ6;
LOCAL KILO :=1ᴇ3;
LOCAL HECTO:=1ᴇ2;
LOCAL DECA :=1ᴇ1;
LOCAL DECI :=1ᴇ−1;
LOCAL CENTI:=1ᴇ−2;
LOCAL MILLI:=1ᴇ−3;
LOCAL MICRO:=1ᴇ−6;
LOCAL NANO :=1ᴇ−9;
LOCAL PICO :=1ᴇ−12;
LOCAL FEMTO:=1ᴇ−15;
LOCAL ATTO :=1ᴇ−18;
LOCAL ZEPTO:=1ᴇ−21;
LOCAL YOCTO:=1ᴇ−24;

//DATA UNITS:CAPACITY
LOCAL UBITS:="bits";
LOCAL UBY:="Bytes";
LOCAL UCH:="Characters";//Characters
LOCAL UWD:="Words(−.)";
LOCAL DATAS:={1,8,16}; //−1};
//DATA UNITS:THROUGHPUT
LOCAL UBPS:="bps";
LOCAL UBYPS:="Byte/s";
LOCAL UCPS:="CPS";
LOCAL UWPM:="WPM(Morse)";
LOCAL TML:={"s","s","s"};//SIZE MATCH

//UNITS
LOCAL NMST:={" Nautical Miles",""," Miles Nautique"};

LOCAL WSYS:={"System"};
LOCAL LANGS:={"English","","Français"};
LOCAL EN:=1; LOCAL FR:=3;
//e233

//WORDS
LOCAL WCAPACITY:={"Capacity","","La Capacité"};
LOCAL WRATE:={"Throughput","","Taux/Débit"};

LOCAL WENTERZ:={"Enter","","Entrez"};
LOCAL WHELP:={"Help","","Aide"};
LOCAL WINTERVAL:={"Interval","","Intervalle"};
LOCAL WLIGHTS:={"Lights","","Lumières","Światła"};
LOCAL WTIME:={"Time","","Temps"};
LOCAL WUNITS:={"Units","","Unités"};
LOCAL WTEMPE:={"Temperature","","Température"};
LOCAL WCNVTT:={"Convert "+WTEMPE(EN),"","Convertir la "+WTEMPE(FR)};
LOCAL WCNVTU:={"Convert Units","","Convertir des Unités","Konwersja Jednowstek"};
LOCAL WDATAU:={"Data Units","","Les unités de données"};
LOCAL WSOLVE:={"Solve for","","Résoudre pour"};
LOCAL WVALU:={"Value","","La valeur"};

{},
{"A PROPOS/"+WHELP(FR),WCNVTU(FR),WLIGHTS(FR),"Intervalle de Mesure s","Distance de Tonnere",LANGS,"QUITTER"}};//FR:P

LOCAL DATATYPES:={{WCAPACITY(EN),WRATE(EN),WTIME(EN)},{"","",""},
{WCAPACITY(FR),WRATE(FR),WTIME(FR)}};

BEGIN
LOCAL ST:="StephenG1CMZ is a programmer and can work to your requirements."+NL;
LOCAL SZ:="ZIPP provides useful practical results.
Ask, if you need technical results."+NL;
LOCAL THANX:="Thanks Han for the CONVERT syntax.
Thanks Primer."+NL;
LOCAL LGL:="No liability is accepted.";
PRINT(); PRINT(CRID);
PRINT(ST+NL+SZ);
PRINT(THANX);
PRINT(LGL);
WAIT;
END;

TEMP_F2C (FF)
BEGIN
RETURN (FF-32)*5/9;
END;
TEMP_C2F(CC)
BEGIN
RETURN (9/5)*CC+32;
END;

TEMP_K2C(KK)
BEGIN
RETURN KK-273.15;
END;
TEMP_C2K(CC)
BEGIN
RETURN CC+273.15;
END;

CONVERT_TEMP ()
BEGIN
LOCAL OK,TKIND;
LOCAL TEMP,TEMP_C,TEMP_F,TEMP_K;
LOCAL TTL:=WCNVTT(SL);
LOCAL LBL:={WUNITS(SL),WTEMPE(SL)};
LOCAL HLP:="";

OK:=INPUT({{TKIND,TKINDL},TEMP},TTL,LBL,HLP,1,1);
IF OK THEN
CASE
IF TKIND==1 THEN //C
TEMP_C:=TEMP;
TEMP_F:=TEMP_C2F(TEMP_C);
TEMP_K:=TEMP_C2K(TEMP_C);
END;
IF TKIND==2 THEN //F
TEMP_F:=TEMP;
TEMP_C:=TEMP_F2C(TEMP_F);
TEMP_K:=TEMP_C2K(TEMP_C);
END;
IF TKIND==3 THEN //K
TEMP_K:=TEMP;
TEMP_C:=TEMP_K2C(TEMP_K);
TEMP_F:=TEMP_C2F(TEMP_C);
END;
DEFAULT
END;
//KNOWN BUG:
//IF U ESCAPE 0C=0F=0K RETURNED
END;

RETURN {TEMP_C+TKINDL(1),TEMP_F+TKINDL(2),TEMP_K+TKINDL(3)};
END;

MSNK()
BEGIN
LOCAL SNK:=MOUSE();
END;

DATA_UNITS()
BEGIN
LOCAL VH;
LOCAL OK,CHS,TM,TMU,QTYU,THRU,VALU,SLV;
LOCAL QTYTP:={UBITS,UBY,UCH}; //,UWD};//BUG:SIZES MUST MATCH
LOCAL THRUTP:={UBPS,UBYPS,UCPS}; //,UWPM};
LOCAL TTL:={"","",""};
LOCAL LBL:=DATATYPES(1);//{WCAPACITY(1),WRATE(1),"TIME"};
LOCAL HLP:={"","","Select to solve for this unit type BITS BPS S ONLY!"};
LOCAL VALUES:={};

REPEAT

OK:=CHOOSE(CHS,WDATAU(SL)+SG,DATATYPES(SL));
IF OK THEN
LBL:={DATATYPES(SL,CHS),WVALU(SL),WSOLVE(SL)};
CASE
IF CHS==1  THEN //CAPACITY
OK:=INPUT({{QTYU,QTYTP},VALU,{SLV,1}},TTL,LBL,HLP,1,1);
IF OK THEN
IF SLV THEN //B=BPS*S
VBITS:=VS*VBPS;
ELSE
VBITS:=VALU*DATAS(QTYU);
END;
VALUES:=VBITS/{DATAS};
MSGBOX(VALUES);
END;
END;
IF CHS==2  THEN //THROUGHPUT
OK:=INPUT({{THRU,THRUTP},VALU,{SLV,1}},TTL,LBL,HLP,1,1);
IF OK THEN
IF SLV THEN //BPS=B/S
VBPS:=VBITS/VS;
ELSE
VBPS:=VALU*DATAS(THRU);
END;
VALUES:=VBPS/{DATAS};
MSGBOX(VALUES);
END;
END;
IF CHS==3 THEN //TIME
OK:=INPUT({{TMU,TML},VALU,{SLV,1}},TTL,LBL,HLP,1,1);
IF OK THEN
IF SLV THEN //S=B/BPS
//MSGBOX(VBITS);
VS:=VBITS/VBPS;
ELSE
VS:=VALU;
END;
VH:=VS/60/60;
MSGBOX({VS,→HMS(VH)});
END;
END;
DEFAULT
END;

END;
UNTIL CHS==0;
END;

BEGIN
LOCAL II;
LOCAL OUTL:={};

FOR II FROM 1 TO SIZE(INL)  DO
OUTL(II):=REPLACE(STRING(INL(II)),"1_","");
END;
RETURN OUTL;
END;

CONVERT_UNIT_GRP(unit,tname)
BEGIN
LOCAL UF;
LOCAL TTL:={"To use SI prefixes: INPUT PREFIXNAME","",
"SI préfixe: Saisissez le nom du préfixe"};

LOCAL EVUST:={
": Enter value(s) in: ","",
":Entrez la/les valeur(s) avec: "};//FR:P
LOCAL HLP:=tname+EVUST(SL);
LOCAL TOST:={"To ","","À "};
LOCAL CNVRT:={"Convert","","Convertir"};

IF CDFROM THEN
UF:=REPLACE(STRING(unit[CDFROM]),"1_",""); //TRIM 1_
INPUT({{ x,[2],{45,20,3} }},TTL(SL),CNVRT(SL),HLP+UF);
//DETECT ESC
IF string(x,1) == "0" THEN RETURN; END;

a2 := unit[CDFROM];
a1 := unit[CDTO];
t := x + "*" + CONVERT(a2,a1);

RETURN expr(t);
END;
END;

CONVERT_UNITS_HP()
BEGIN
LOCAL CHSTYP;
LOCAL TTL:={"Unit types","","Types d'unités"};
LOCAL UTYP:={{"Length","Area","Volume",
"Time","Speed","Acceleration","Mass","Force",
"Energy","Power","Pressure","Temperature:NO!",
"","Data Throughput"},
{},
{"Longueur","Surface","Volume",
"Heure","Vitesse","Accélération","Masse","Force",
"Energie","Puissance","Pression","Température:NON!",
//TESTING:PUISSANCE(POWER) IS LONGEST INPUT STRING

LOCAL UL:={};

CHOOSE(CHSTYP,TTL(SL),UTYP(SL));
CASE
IF CHSTYP==1 THEN //LENGTH
//CONVERT_Length();
UL:={1_m,1_cm,1_mm,1_km,1_in,1_ft,1_yd,1_mile,1_nmi,1_au,1_lyr,1_pc,1_Å};
END;
IF CHSTYP==2 THEN //AREA
UL:={1_(cm²),1_(m²),1_(km²),1_(in²),1_(ft²),1_(yd²),1_(mile²),1_(miUS²),1_a​cre,1_ha,1_a,1_b};//A:Are B:Barn
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==3 THEN //VOLUME
UL:={1_(cm^3),1_(m^3),1_ml,1_l,1_(in^3),1_(ft^3),1_(yd^3),1_ptUK,1_galUK,1_​galUS};
//CONVERT_UNIT_GRP(UL);
END;
IF CHSTYP==4 THEN //TIME
UL:={1_s,1_min,1_h,1_d,1_yr,1_Hz};
END;
IF CHSTYP==5 THEN //SPEED
END;
IF CHSTYP==6 THEN //ACCEL
END;
IF CHSTYP==7 THEN //MASS
UL:={1_g,1_kg,1_oz,1_lb,1_tonUK,1_tonUS,1_mol,1_u,1_t};
END;
IF CHSTYP==8 THEN //FORCE
UL:={1_(kg*m/s²),1_N,1_dyn,1_lbf,1_kip,1_gf,1_pdl};
END;
IF CHSTYP==9 THEN //ENERGY
UL:={1_(kg*m²/s²),1_J,1_Wh,1_kWh,1_(ft*lbf),1_kcal,1_cal,1_eV,1_MeV,1_Btu,1_erg,1_thermUK,1_th​ermEC,1_thermUS};
END;
IF CHSTYP==10 THEN //POWER
UL:={1_(kg*m²/s^3),1_W,1_MW,1_hp,1_(ft*lbf/s)};
END;
IF CHSTYP==11 THEN //PRESSURE
UL:={1_(kg/(m*s²)),1_Pa,1_bar,1_atm,1_psi,1_torr,1_mmHg,1_inHg,1_inH2O};
END;
IF CHSTYP==12 THEN //TEMP
//UL:={1_K,1_°C,1_°F};
END;
IF CHSTYP==13 THEN //ELEC
UL:={1_A,1_V,1_C,1_Ohm,1_F,1_Fdy,1_Wb,1_H,1_mho,1_T,1_(A*h),1_S};
END;
IF CHSTYP==14 THEN //LIGHT:HP MISSING MOST UNITS
UL:={1_cd,1_flam};
END;
IF CHSTYP==15 THEN //ANGL
END;
IF CHSTYP==16 THEN //VISCOSITY
UL:={1_(m²/s),1_P,1_St};
END;
UL:={1_Bq,1_Ci,1_Gy,1_rd,1_rem,1_Sv,1_R};
END;

IF CHSTYP==19 THEN //DATA THROUGHPUT
UL:={"BPS","bps"};
END;
DEFAULT
END;
IF SIZE(UL)>0 THEN //AND CHSTYP>0
IF CHSTYP≤17 THEN //HP
MSGBOX(CONVERT_UNIT_GRP(UL,UTYP(SL,CHSTYP)),1);
//ELSE //SL
// CONVERT_GRP_SL(UL,UTYP(SL,CHSTYP));
END;
END;
END;

EXPORT CONVERT_UNITS ()
BEGIN
LOCAL CHS;
LOCAL TTL:=WCNVTU(SL)+SG;
CHOOSE(CHS,TTL,{WCNVTT(SL),WCNVTU(SL),WDATAU(SL)});
IF CHS THEN
CASE
IF CHS==1 THEN MSGBOX(CONVERT_TEMP(),1); END;
IF CHS==2 THEN CONVERT_UNITS_HP() END;
IF CHS==3 THEN DATA_UNITS() END;
DEFAULT
END;
END;
END;

INPUT_INTERVAL_H(TTL)
BEGIN
LOCAL HH,MM,SS,OK;

LOCAL LBL:={WINTERVAL(SL)+" HH",WINTERVAL(SL)+" MM",WINTERVAL(SL)+" SS"};
LOCAL HLP1:={"Decimals & Fractions allowed","",
"Décimaux et fractions autorisés"};//FR:P
LOCAL HLP:={HLP1(SL),HLP1(SL),HLP1(SL)};

OK:=INPUT({HH,MM,SS},TTL,LBL,HLP,0,0);
IF OK THEN
RETURN HH+(MM/60)+(SS/3600);
ELSE
RETURN 0; //CANCEL
//HOW TO SIGNAL CANCEL?
END;
END;

EXPORT MEASURE_INTERVAL_S()
BEGIN
LOCAL TICKB,TICKE,TICKL;
LOCAL TS,KK;
LOCAL MI:=0;

LOCAL MST:={"MEASURE SHORT INTERVAL"+NL,"",
"MESURE COURT INTERVALLE"+NL};
LOCAL MST1:={"OK or Enter: Start"+NL,"",
"OK ou Entrer: Commencez"+NL};
LOCAL MST2:={"Enter:Enter HMS numerically"+NL,"",
"Entrer: Entrez HMS numeriquement"+NL};
LOCAL MST3:={"ANY KEY: End"+NL,"",
"N importe quelle clé: Terminer"+NL};
//LOCAL CNW:="CONNECTIVITY:NO HP DATA";

TICKB:=MSGBOX(MST(SL)+MST1(SL)+MST2(SL)+MST3(SL),1);
IF TICKB THEN
RECT();
TICKB:=Ticks; TS:=Time;
TICKL:=TICKB;
REPEAT
MSNK;
IF Ticks-TICKL≥1000 THEN
TICKL:=Ticks;
RECT();
TEXTOUT_P(→HMS(ROUND((Ticks-TICKB)/1000,0)/3600),0,20);
MSNK;
TEXTOUT_P(TS+MST(SL),0,180);
TEXTOUT_P(MST2(SL),0,200);
TEXTOUT_P(MST3(SL),0,220);

END;
WAIT(0.001);
MSNK;
KK:=GETKEY;
UNTIL KK≥0;
TICKE:=Ticks;
MI:=(TICKE-TICKB)/1000;
IF KK==30 THEN //ENTER
MI:=3600*INPUT_INTERVAL_H(WENTERZ(SL)+" "+WINTERVAL(SL));
//IDEALLY IF A CANCEL IS DETECTED
//OUGHT TO RESUME MEASURED TIMING
END;
END;
RETURN MEAS_INTERVAL_S:=ROUND(MI,ZIPPROUND);
END;

THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C)
//INTERVAL
//CELCIUS (NORMAL RANGE)
BEGIN
LOCAL DISTM;

THSPD_M:=331.4+0.6*TEMP_C;//M/S
DISTM:=INTERVAL_S*THSPD_M;
RETURN ROUND(DISTM,ZIPPROUND);
END;

EXPORT THUNDER_DISTANCE()
BEGIN
LOCAL OK;
LOCAL THDST:={};
LOCAL THDM,THDKM,THDMI,THDNM;
LOCAL INTERVAL_S,TEMP_C,TEMP;
LOCAL TKIND;

LOCAL TTL:=CHOICES(SL,5)+SG;
LOCAL LBL:={WINTERVAL(SL)+" s",WUNITS(SL),WTEMPE(SL)};
LOCAL HLP:={{"Interval sound-light. (0:use measured value)","","EG Temp C 0..20:Ground −57: Aircraft"},{},
{"Intervalle son-lumière. 0:La valeur mesurée","","ex Temp C 0..20:Terre −57:Avion"}};//FR:P

OK:=INPUT({INTERVAL_S,{TKIND,TKINDL},TEMP},TTL,LBL,HLP(SL),MEAS_INTERVAL_S,​0);

IF OK THEN
CASE
IF TKIND==1 THEN TEMP_C:=TEMP END;
IF TKIND==2 THEN TEMP_C:=TEMP_F2C(TEMP) END;
IF TKIND==3 THEN TEMP_C:=TEMP_K2C(TEMP) END;
DEFAULT
END;
IF INTERVAL_S≤0 THEN //IMPORT VALUE
INTERVAL_S:=MEAS_INTERVAL_S;
END;
THDM:=THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C);
THDKM:=THDM/1000;
THDMI:=THDKM/TOMI;
THDNM:=THDKM/TONM;

THDST(1):=ROUND(INTERVAL_S,0)+" s"+" @ "+ROUND(THSPD_M,ZIPPROUND)+" m/s"+NL;
THDST(2):=THDM+" m "+ROUND(THDKM,ZIPPROUND)+" km"+NL;
THDST(3):=ROUND(THDMI,ZIPPROUND)+" milesUK"+NL;
THDST(4):=ROUND(THDNM,ZIPPROUND)+NMST(SL);
MSGBOX(THDST(1)+THDST(2)+THDST(3)+THDST(4));
RETURN THDST(2);
END;
END;

ZIPP_HELP ()
BEGIN
LOCAL CHS,OK;
LOCAL HLPCHO:={"VARIABLES"};
LOCAL HC:=CONCAT(CHOICES(SL),HLPCHO);

LOCAL SIPRFX:={"
Values may include SI prefixes.
ENTER IN UPPERCASE: Selecting Units/Prefix (Shift C) will not work."+NL,"",
"Les valeurs peuvent inclure des SI préfixes. Entrez en majuscule: Selection Unites/Préfixe (Decalage C) ne marchant pas."+NL};
LOCAL SIPRFXEG:="
3NANO _m
3MILLI _inch";

LOCAL ST:={"
To change the number of digits displayed:","","
Pour changez la précision affichée:"};//FR:P
LOCAL STEG:="
@Home:
ZIPPROUND:=n  [n=−12..12]"+NL;

LOCAL CVT:={"
Note that not all units within a group can be converted. Conversion between groups (eg length*length to area) is not implemented here.
SI prefixes OK.
Lists and variables OK."+NL,"", "
Notez que toutes les unités d un groupe ne_peuvent pas etre convertis.
SI préfixes OK.
Listes et variables OK."+NL};
LOCAL LIGHTSPROG:={"LIGHTS may be installed separately","",
"Lumières peut être installé séparément"};
LOCAL TRBY:="Traduit par "+SG+" et ......";

PRINT(); PRINT(CRID);

OK:=CHOOSE(CHS,WHELP(SL),HC);
IF CHS THEN
PRINT(HC(CHS));
CASE
IF CHS==2 THEN
PRINT(CVT(SL));WAIT;
OK:=MSGBOX(SIPRFX(SL),1);
OK:=MSGBOX(SIPRFXEG,1);
END;
IF CHS==3 THEN PRINT(LIGHTSPROG(SL)) END;
IF CHS==6 THEN PRINT(TRBY) END;
IF CHS==8 THEN PRINT(ST(SL)+STEG) END;
DEFAULT
END;
WAIT;
END;
END;

DEFLT_LANG()
BEGIN
LOCAL DEF:=1;//PROG DEFAULT
IF Language==1  OR Language==3 THEN
DEF:=Language;
END;
RETURN DEF;
END;

SELECT_LANGUAGE()
BEGIN
LOCAL CHS;
//LOCAL DEF:=1;//PROG DEFAULT IF LANG UNKNOWN

CHOOSE(CHS,LANGS(SL),CONCAT(LANGS,{WSYS(1)}));//CURRENT
IF CHS AND CHS≠2 THEN
SL:=CHS;
IF CHS==4 THEN SL:=DEFLT_LANG(); END;
END;
END;

EXPORT G1CMZ_IMMENSELY_PRACTICAL_PACKAGE ()
BEGIN
LOCAL CHS;

SL:=DEFLT_LANG();
REPEAT
CHOOSE(CHS,CRID,CHOICES(SL));
CASE
IF CHS==1 THEN ZIPP_HELP() END;
IF CHS==2 THEN CONVERT_UNITS() END;
IF CHS==3 THEN Z_LIGHTS() END;
IF CHS==4 THEN MSGBOX(MEASURE_INTERVAL_S()+" s",1) END;
IF CHS==5 THEN THUNDER_DISTANCE() END;
IF CHS==7 THEN CHS:=0 END;
IF CHS==6 THEN SELECT_LANGUAGE() END;
DEFAULT
END;

UNTIL CHS==0;

END;

EXPORT ZIPP()
BEGIN
G1CMZ_IMMENSELY_PRACTICAL_PACKAGE();
END;

Ignore the reference in input help to "solve for" only working in bit and bps - it should actually work in bytes etc. too.

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
11-30-2015, 09:57 PM
Post: #8
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
In ZIPP 0.6, the unit conversions are moved to a standalone program (Z UNITS), callable from ZIPP. Compiled using Android emulator 1.0.9.
Code:

#pragma mode( separator(.,;) integer(h32) )

LOCAL ZIPPST:="ZIPP V 0.6 ";
LOCAL SG:=" StephenG1CMZ";
LOCAL NL:=CHAR(10);

LOCAL DEFLT_LANG();
LOCAL SL:=DEFLT_LANG();

//IMPORT Z_LIGHTS();
//IMPORT Z_UNITS();

EXPORT ZIPPROUND;//USER ROUNDING

LOCAL THSPD_M;
LOCAL MEAS_INTERVAL_S;

LOCAL TOMI:=1.60344;//MILES UK
LOCAL TONM:=1.852;//NAUTI

//SI PREFIXES:UNUSED
LOCAL YOTTA:=1ᴇ24;
LOCAL ZETTA:=1ᴇ21;
LOCAL EXA  :=1ᴇ18;
LOCAL PETA :=1ᴇ15;
LOCAL TERA :=1ᴇ12;
LOCAL GIGA :=1ᴇ9;
LOCAL MEGA :=1ᴇ6;
LOCAL KILO :=1ᴇ3;
LOCAL HECTO:=1ᴇ2;
LOCAL DECA :=1ᴇ1;
LOCAL DECI :=1ᴇ−1;
LOCAL CENTI:=1ᴇ−2;
LOCAL MILLI:=1ᴇ−3;
LOCAL MICRO:=1ᴇ−6;
LOCAL NANO :=1ᴇ−9;
LOCAL PICO :=1ᴇ−12;
LOCAL FEMTO:=1ᴇ−15;
LOCAL ATTO :=1ᴇ−18;
LOCAL ZEPTO:=1ᴇ−21;
LOCAL YOCTO:=1ᴇ−24;

//UNITS
LOCAL NMST:={" Nautical Miles",""," Miles Nautique"};

LOCAL WSYS:={"System","","Système"};
LOCAL LANGS:={"English","","Français"};
LOCAL EN:=1; LOCAL FR:=3;
//e233

//WORDS

LOCAL WENTERZ:={"Enter","","Entrez"};
LOCAL WHELP:={"Help","","Aide"};
LOCAL WINTERVAL:={"Interval","","Intervalle"};
LOCAL WLIGHTS:={"Lights","","Lumières","Światła"};
LOCAL WTIME:={"Time","","Temps"};
LOCAL WUNITS:={"Units","","Unités"};
LOCAL WTEMPE:={"Temperature","","Température"};

LOCAL WVALU:={"Value","","La valeur"};

{},
{"A PROPOS/"+WHELP(FR),WLIGHTS(FR),"Intervalle de Mesure s","Distance de Tonnere",WUNITS(FR),LANGS,"QUITTER"}};//FR:P

BEGIN
LOCAL ST:="StephenG1CMZ is a programmer and can work to your requirements."+NL;
LOCAL SZ:="ZIPP provides useful practical results.
Ask, if you need technical results."+NL;
LOCAL THANX:="Thanks Primer."+NL;
LOCAL LGL:="No liability is accepted.";
PRINT(); PRINT(CRID);
PRINT(ST+NL+SZ);
PRINT(THANX);
PRINT(LGL);
WAIT;
END;

TEMP_F2C (FF)
BEGIN
RETURN (FF-32)*5/9;
END;
TEMP_K2C(KK)
BEGIN
RETURN KK-273.15;
END;

MSNK()
BEGIN
LOCAL SNK:=MOUSE();
END;

INPUT_INTERVAL_H(TTL)
BEGIN
LOCAL HH,MM,SS,OK;

LOCAL LBL:={WINTERVAL(SL)+" HH",WINTERVAL(SL)+" MM",WINTERVAL(SL)+" SS"};
LOCAL HLP1:={"Decimals & Fractions allowed","",
"Décimaux et fractions autorisés"};//FR:P
LOCAL HLP:={HLP1(SL),HLP1(SL),HLP1(SL)};

OK:=INPUT({HH,MM,SS},TTL,LBL,HLP,0,0);
IF OK THEN
RETURN HH+(MM/60)+(SS/3600);
ELSE
RETURN 0; //CANCEL
//HOW TO SIGNAL CANCEL?
END;
END;

EXPORT MEASURE_INTERVAL_S()
BEGIN
LOCAL TICKB,TICKE,TICKL;
LOCAL TS,KK;
LOCAL MI:=0;

LOCAL MST:={"MEASURE SHORT INTERVAL"+NL,"",
"MESURE COURT INTERVALLE"+NL};
LOCAL MST1:={"OK or Enter: Start"+NL,"",
"OK ou Entrer: Commencez"+NL};
LOCAL MST2:={"Enter:Enter HMS numerically"+NL,"",
"Entrer: Entrez HMS numeriquement"+NL};
LOCAL MST3:={"ANY KEY: End"+NL,"",
"N importe quelle clé: Terminer"+NL};
//LOCAL CNW:="CONNECTIVITY:NO HP DATA";

TICKB:=MSGBOX(MST(SL)+MST1(SL)+MST2(SL)+MST3(SL),1);
IF TICKB THEN
RECT();
TICKB:=Ticks; TS:=Time;
TICKL:=TICKB;
REPEAT
MSNK;
IF Ticks-TICKL≥1000 THEN
TICKL:=Ticks;
RECT();
TEXTOUT_P(→HMS(ROUND((Ticks-TICKB)/1000,0)/3600),0,20);
MSNK;
TEXTOUT_P(TS+MST(SL),0,180);
TEXTOUT_P(MST2(SL),0,200);
TEXTOUT_P(MST3(SL),0,220);

END;
WAIT(0.001);
MSNK;
KK:=GETKEY;
UNTIL KK≥0;
TICKE:=Ticks;
MI:=(TICKE-TICKB)/1000;
IF KK==30 THEN //ENTER
MI:=3600*INPUT_INTERVAL_H(WENTERZ(SL)+" "+WINTERVAL(SL));
//IDEALLY IF A CANCEL IS DETECTED
//OUGHT TO RESUME MEASURED TIMING
END;
END;
MEAS_INTERVAL_S:=MI;
RETURN ROUND(MI,ZIPPROUND);
END;

THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C)
//INTERVAL
//CELCIUS (NORMAL RANGE)
BEGIN
LOCAL DISTM;

THSPD_M:=331.4+0.6*TEMP_C;//M/S
DISTM:=INTERVAL_S*THSPD_M;
RETURN ROUND(DISTM,ZIPPROUND);
END;

EXPORT THUNDER_DISTANCE()
BEGIN
LOCAL OK;
LOCAL THDST:={};
LOCAL THDM,THDKM,THDMI,THDNM;
LOCAL INTERVAL_S,TEMP_C,TEMP;
LOCAL TKIND;

LOCAL TTL:=CHOICES(SL,4)+SG;
LOCAL LBL:={WINTERVAL(SL)+" s",WUNITS(SL),WTEMPE(SL)};
LOCAL HLP:={{"Interval sound-light. (0:use measured value)","","EG Temp C 0..20:Ground −57: Aircraft"},{},
{"Intervalle son-lumière. 0:La valeur mesurée","","ex Temp C 0..20:Terre −57:Avion"}};//FR:P

OK:=INPUT({INTERVAL_S,{TKIND,TKINDL},TEMP},TTL,LBL,HLP(SL),MEAS_INTERVAL_S,​0);

IF OK THEN
CASE
IF TKIND==1 THEN TEMP_C:=TEMP END;
IF TKIND==2 THEN TEMP_C:=TEMP_F2C(TEMP) END;
IF TKIND==3 THEN TEMP_C:=TEMP_K2C(TEMP) END;
DEFAULT
END;
IF INTERVAL_S≤0 THEN //IMPORT VALUE
INTERVAL_S:=MEAS_INTERVAL_S;
END;
THDM:=THUNDER_DISTANCE_CALC_M(INTERVAL_S,TEMP_C);
THDKM:=THDM/1000;
THDMI:=THDKM/TOMI;
THDNM:=THDKM/TONM;

THDST(1):=ROUND(INTERVAL_S,0)+" s"+" @ "+ROUND(THSPD_M,ZIPPROUND)+" m/s"+NL;
THDST(2):=THDM+" m "+ROUND(THDKM,ZIPPROUND)+" km"+NL;
THDST(3):=ROUND(THDMI,ZIPPROUND)+" milesUK"+NL;
THDST(4):=ROUND(THDNM,ZIPPROUND)+NMST(SL);
MSGBOX(THDST(1)+THDST(2)+THDST(3)+THDST(4));
RETURN THDST(2);
END;
END;

ZIPP_HELP ()
BEGIN
LOCAL CHS,OK;
LOCAL HLPCHO:={"VARIABLES"};
LOCAL HC:=CONCAT(CHOICES(SL),HLPCHO);

LOCAL ST:={"
To change the number of digits displayed:","","
Pour changez la précision affichée:"};//FR:P
LOCAL STEG:="
@Home:
ZIPPROUND:=n  [n=−12..12]"+NL;

LOCAL MAYBIS:={" may be installed separately","",
" peut être installé séparément"};
LOCAL TRBY:="Traduit par "+SG+" et ......";
REPEAT
PRINT(); PRINT(CRID);

OK:=CHOOSE(CHS,WHELP(SL),HC);
IF CHS THEN
PRINT(HC(CHS));
CASE
IF CHS==2  OR CHS==5 THEN PRINT(MAYBIS(SL)) END;
IF CHS==6 THEN PRINT(TRBY) END;
IF CHS==8 THEN PRINT(ST(SL)+STEG) END;
DEFAULT
END;
WAIT;
END;
UNTIL CHS==0;
END;

DEFLT_LANG()
BEGIN
LOCAL DEF:=1;//PROG DEFAULT
IF Language==1  OR Language==3 THEN
DEF:=Language;
END;
RETURN DEF;
END;

SELECT_LANGUAGE()
BEGIN
LOCAL CHS;
//LOCAL DEF:=1;//PROG DEFAULT IF LANG UNKNOWN

CHOOSE(CHS,LANGS(SL),CONCAT(LANGS,{WSYS(SL)}));//CURRENT
IF CHS AND CHS≠2 THEN
SL:=CHS;
IF CHS==4 THEN SL:=DEFLT_LANG(); END;
END;
END;

EXPORT G1CMZ_IMMENSELY_PRACTICAL_PACKAGE ()
BEGIN
LOCAL CHS;

SL:=DEFLT_LANG();
REPEAT
CHOOSE(CHS,CRID,CHOICES(SL));
CASE
IF CHS==1 THEN ZIPP_HELP() END;
IF CHS==2 THEN Z_LIGHTS() END;
IF CHS==3 THEN MSGBOX(MEASURE_INTERVAL_S()+" s",1) END;
IF CHS==4 THEN THUNDER_DISTANCE() END;
IF CHS==5 THEN Z_UNITS() END;
IF CHS==7 THEN CHS:=0 END;
IF CHS==6 THEN SELECT_LANGUAGE() END;
DEFAULT
END;

UNTIL CHS==0;

END;

EXPORT ZIPP()
BEGIN
G1CMZ_IMMENSELY_PRACTICAL_PACKAGE();
END;

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
03-04-2016, 03:27 AM
Post: #9
 meseguer24 Junior Member Posts: 1 Joined: Mar 2016
RE: ZIPP: G1CMZ's Immensely Practical Package
Dear friend,

I downloaded your app, but i cannot or maybe I dont know hot to install it. Sorry because I´m very new in this, but really before writting you I´ve tried a lot of things to do it but still haven´t found the way.

I got a HP Prime.

03-20-2016, 09:47 PM (This post was last modified: 03-22-2016 12:18 AM by StephenG1CMZ.)
Post: #10
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
(03-04-2016 03:27 AM)meseguer24 Wrote:  Dear friend,

I downloaded your app, but i cannot or maybe I dont know hot to install it. Sorry because I´m very new in this, but really before writting you I´ve tried a lot of things to do it but still haven´t found the way.

I got a HP Prime.

Welcome.

The ZIPP program requires 2 external programs.
If you are getting a compilation error at Z_LIGHTS or Z_UNITS, this means that you must first install those programs - alternatively, insert // at the start of those lines to comment out those programs.

A compilation error anywhere else probably indicates a difficulty with the Unicode space character in cutting and pasting the source code. Try deleting a line and retyping it.

Note: These are programs. They do not need installing as apps.

If that does not help, could you give some indication of the error you are having.
If that solved it, please let me know.

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
02-06-2019, 09:26 PM
Post: #11
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
KeithB suggested that I mention that this program includes a timer that can be used as a simple stopwatch, to help anyone searching for "stopwatch"...
Though if you want a dedicated stopwatch, there is much scope for improvement.

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
02-07-2019, 10:30 AM
Post: #12
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
My short interval timer here currently relies upon TICKS.
In http://www.hpmuseum.org/forum/thread-12369.html Cyrille suggests that ticks can be less accurate than using time/date functions, so I might implement another timer later.

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
03-10-2024, 07:15 PM
Post: #13
 StephenG1CMZ Senior Member Posts: 1,036 Joined: May 2015
RE: ZIPP: G1CMZ's Immensely Practical Package
The thunderstorm distance calculations and interval timer are now implemented in Python. It also includes inverse functions.
https://my.numworks.com/python/steveg1cmz

(I'm not sure how much precision is reasonable - I'm probably showing too many digits)

Stephen Lewkowicz (G1CMZ)
https://my.numworks.com/python/steveg1cmz
 « Next Oldest | Next Newest »

User(s) browsing this thread: 1 Guest(s)