TRIP - The HP28s Car Trip Computer
----------------------------------
Ver. 1.0 Copyright June, 1989
Robert Peraino
The car trip computer is a program which provides the common
statistics which most integrated car computers provide. Since the hp28
is not directly interfaced physically with your car, it cannot collect
the necessary information on-the-fly. But by simply providing the current
mileage reading, TRIP can report current time, elapsed time, elapsed miles,
average speed, estimated time of arrival (eta), and fuel consumption.
I constantly try to improve my software, and welcome comments. I am
especially interested to know if people find TRIP helpful on long road
trips. I welcome any suggestions for added features and/or improvements.
The code listings will be presented, followed by the user guide.
-----------------------------------------------------------------------------
Bob Peraino UUCP : uunet!pyrdc!gmu90x!peraino
George Mason University INTERNET: peraino@gmuvax.gmu.edu
UCIS, Thompson Hall, rm 2 BITNET : peraino@gmuvax
4400 University Drive PHONE : (703)-323-2549
Fairfax, VA 22030
-----------------------------------------------------------------------------
Listing conventions.
--------------------
This section describes the notations used to represent the special
characters found on the hp28s.
<= The "less than or equal to" sign.
>= The "greater than or equal to" sign.
<> The "not equal to" sign.
Some code listings have a line beneath the description which contains
a colon. This notation is used for functions which require input. Items
to the left of the colon are those objects taken from the stack as input.
Items to the right of the colon are the output of the function. For Example
string1 string : string3
means providing two strings causes the function to output a third. What
the third string is, would depend on the function.
Each code listing is preceded by a hex number delimited by CHK[..].
This is the checksum for the code module. This number is provided to
avoid typing mistakes. To generate a checksum after entering the module,
enter 'module name' onto the stack and run CHK:
CHK[129]
<< RCLF HEX 16 STWS SWAP RCL ->STR DUP
#0h 1 ROT SIZE
FOR j
OVER j j SUB NUM R->B XOR RL
NEXT
->STR 3 OVER SIZE 1 - SUB ROT STOF SWAP DROP
>>
Be VERY careful when entering the code. CHK is, of course, case
sensitive, and so is the 28. So if you enter a variable in upper case,
and a program references it in lower case, kablooie. And, the checksum
won't match.
Module listings.
----------------
Trip - The car trip computer.
tm - Trip computer menu
This list is used for displaying the custom menu.
CHK[F2A9]
{ FILUP AUTO UPDT TETA OFF }
TS - Target speed.
This routine calculates average speed necessary to reach destination
by target eta.
CHK[4C0F]
<< st TDIF HMS-> em SWAP / >>
ts - Tank size.
This value should be replaced by the size of your tank, in
gallons or liters.
CHK[A4]
10
mpg - Miles per gallon.
This value should be replaced by the average miles per gallon(liter)
for your car.
CHK[AC]
30
TETA - Target eta.
This routine sets your estimated time of arrival value, and
calculates average speed necessary to meet that target.
HH.MM : (new display)
CHK[52F2]
<< 504 525 IFUN ;Inverse the function on the screen.
"TETA-" OVER NTTC + OVER 'teta' STO ;Convert input target to char and
SWAP TS ->STR ;add to output. Do same for
" MPH -"SWAP + + 2 DISP ;calculated target speed.
L13 ;Output lines 1 & 3.
>>
L13 - Lines 1 and 3.
This routine displays updated lines #1 and #3.
CHK[771C]
<< "TIME-" TIME 1 5 SUB + " " + ;Calc current time.
ELM DUP em < "<" ">" IFTE ;Calc behind/ahead schedule arrow.
SWAP ->STR "MILE-" SWAP + + + 1 DISP ;Finish elapsed miles & display L1.
"ELAP-" ET NTTC + ;Calc elapsed time.
" FUEL-" + FC ->STR + 37 CHR + 3 DISP;Calc fuel and display L3.
>>
TDIF - Time difference.
This routine calculates the difference between two times.
CHK[C7E4]
<< DUP2 ;Make a copy of the two times.
IF < THEN ;If end is less than start then,
SWAP 24 + SWAP ; past midnight. add 24 to end.
END ;Endif.
HMS- ;Subtract start from end.
>>
IFUN - Inverse function.
This routine inverses the pressed function on the screen.
CHK[2C9A]
<< LCD-> -> b e s ;Grab beginning, end, and screen.
<< s 1 b 1 - SUB ;Extract screen up to function.
s b e SUB NOT + ;Extract function and inverse video.
s e 1 + 548 SUB + ->LCD ;Extract screen remainder and display.
>>
>>
AUTO - Automatic pilot mode.
This routine will automatically update the display based on the
current average speed, predicting the mileage rate.
(Current mileage) : (auto updated screen)
CHK[501]
<< 458 479 IFUN ;Inverse the function.
UPDT AS cm -> nas ocm ;Update figures, save ave spd & miles.
<< DO ;Calculate predicted elapsed miles and
ET HMS-> nas * sm + UPDT ; feed to UPDT to update screen.
UNTIL ;until...
KEY ; a key is pressed.
END ;Enddo.
DROP ocm 'cm' STO CLMF ;Dump key value, replace curr. mileage.
>>
>>
ENDT - End trip.
This routine performs cleanup activities.
CHK[C187]
<< { STRT } tm + MENU ;Change menu from ENDT to STRT.
fl STOF ;Reset system status.
{ st fm cm sm em fl teta } PURGE ;Cleanup temp vars.
>>
UPDT - Update screen statistics.
(current Mileage) : (new screen)
CHK[EE2E]
<< 481 502 IFUN ;Inverse function.
'cm' STO L13 ;Update current mileage & do L 1&3.
"ETA -" ETA NTTC + ;Calc and output ETA.
AS teta TS OVER < "<>" "><" IFTE ;Calc ahead/behind arrows.
"MPH -" + SWAP ->STR + + 2 DISP ;Calc average speed and display.
>>
ETA - Estimated time of arrival.
This routine calcs eta.
CHK[836A]
<< em ELM - AS / ->HMS CT HMS+ 24 MOD ;Miles remaining over average speed
>> ;plus current time equals eta.
FC - Fuel consumption
This routine calculates percentage of fuel used.
CHK[A46F]
<< cm fm - mpg / ts / 100 * ;Elapsed miles since last fillup over
>> ;mpg over tank size equals usage.
AS - Average speed.
CHK[70AB]
<< ELM ET HMS-> / ;Elapsed miles over elapsed time.
>>
ET - Elapsed time.
CHK[808]
<< CT st TDIF ;Current time minus start time.
>>
CT - Current time.
This routine takes character time "HH:MM:SS" and returns
numeric hh.mm.ss
CHK[CD3F]
<< TIME DUP 1 2 SUB "." + ;Grab hours.
OVER 4 5 SUB + ;Grab minutes.
SWAP 7 8 SUB + STR-> ;Grab seconds.
>>
ELM - Elapsed miles.
CHK[B802]
<< cm sm - ;Current miles minus start miles.
>>
FILUP - Tank filup.
This routine updates fm (fillup miles) for fuel consumption calc.
(current mileage) : (updated screen)
CHK[B6DB]
<< 435 456 IFUN ;Inverse function.
DUP 'fm' STO ;Update fillup miles.
UPDT ;Update screen.
>>
STRT - Start trip.
This routine sets things up for the stsrt of the trip.
(estimated miles), (initial target eta), (current mileage) :
CHK[879D]
<< { ENDT } tm + MENU ;Update menu.
DUP DUP CT 'st' STO 'fm' STO 'cm' STO ;
'sm' STO 'teta' STO 'em' STO RCLF ;
'fl' STO 1 FIX ;
>>
NTTC - Numeric time to character.
This routine takes the numeric time in the form hh.mmss and
returns character form "HH:MM"
CHK[4099]
<< STD DUP IP 100 / .001 + ->STR 2 3 SUB ;Grab hours- ensure trailing zero.
58 CHR + SWAP ;Add colon.
FP .001 + ->STR 2 3 SUB + 1 FIX ;Grab minutes.
>>
OFF - Turn the calculator off.
CHK[6E03]
<< #18E58h SYSEVAL
>>
Installation instructions.
--------------------------
Enter all code modules into a new subdirectory, say, TRIP. You will
notice a call to a routine called TIME. This routine is not included here,
since variations have been posted in the past, and it is an application
in itself considering the number of modules. To work, TRIP expects your
time routine to return "HH:MM:SS". Or you can modify it to suit yourself.
If you do not have a time routine, I can supply one. Be sure to modify the
tank size and miles-per-gallon variables to suit your particular car.
HP28c users can give it a go, but I do not know if it will fit. You
will have to remove all references to function IFUN whose only purpose is
to inverse the name of the function you press. You will also have no need
for variable tm, since the 28c has no custom menu, I believe. You will
also have to modify STRT and ENDT to remove the references to tm. If TRIP
still doesn't fit, you might want to try converting some of the low-level
functions to algebraic expressions. You will also do away with the OFF
function, whose only purpose is to move the OFF button to a more
convenient location.
User guide.
-----------
To start a trip, you must enter the following onto the stack;
1. Number of miles (or kilometers) to destination or intermediate point.
You should have an idea of how far you are going. If you do not know
exactly, TRIP will still work, but the ETA will not be accurate.
ETA is only as accurate as the stated miles.
2. Target estimated time of arrival in the format: HH.MM
By telling TRIP when you would LIKE to get there, it can tell you the
necessary average speed and whether you are ahead or behind schedule.
3. Current odometer reading.
When you have entered this information, type STRT. After a pause,
the custom menu will come up and you will have a regular screen back.
The custom menu displays the following functions:
ENDT FILUP AUTO UPDT TETA OFF
I will describe each of these functions in logical order.
UPDT
----
UPDT stands for Update, and is used for getting an updated screen
of information. The only parameter you need to enter is the current
odometer reading (or the last few digits, provided they won't wrap to
zero). Press UPDT, the function will highlight, and you will get a screen
that looks something like this:
------------------------
|TIME-06:21 MPH -54.8 |
|ELAP-00:22 FUEL-18.4%|
| {functions} |
------------------------
TIME- The current time.
ETA - Estimated time of arrival. This figure is based on your average speed
and remaining miles to go. Obviously, the farther into the trip you
are, the more accurate the ETA will be, since the overall average
speed will have a smaller and smaller standard deviation.
ELAP- Elapsed time into the trip.
MILE- Elapsed miles into the trip.
MPH - Average speed (miles per hour) but this would be KPH if you're using
all metric units.
FUEL- Fuel consumed, based on your tank size and average MPG. I decided to
make this fuel consumed rather than fuel remaining, because I didn't
want the number to go negative. I decided 101 per cent makes more sense
than -1 per cent.
The Arrows- The "<" next to MILE tells you that you are below your estimated
number of miles for the trip. A ">" would mean you have exceeded your
estimate. The "<" next to ETA means you will arrive sometime before your
target ETA, at the current speed. A ">" would mean you will arrive late.
The ">" next to MPH means that you are running ahead of schedule; you are
exceeding necessary average speed to meet target eta. A "<" would mean that
you are behind schedule, and you should pick up the pace. If you see a ">"
next to MILE meaning that you have exceeded the mileage estimate, then
ignore the ETA value because it will show a time prior to the present.
If you try to get an update less than one minute into the trip, the
numbers might be strange. In reality, you wouldn't do this anyway, but
I mention this because I know first time users will try to run it at home
just to see it, and may prematurely enter pseudo mileages.
AUTO
----
Enter the current odometer reading and press AUTO to enter autopilot
mode. The screen will automatically update continuously until a key is
pressed. (Don't press ON/ATTN!!!)
You might wonder how AUTO can accurately keep up the statistics if
there is no physical connection to the vehicle. When you press AUTO, it
calculates the current average speed, and makes a projection of elapsed
miles over time. For each loop, it calculates this projection and feeds
it to UPDT which does the screen upates, as if you had just typed in
the mileage. So obviously, using AUTO as soon as you start your trip
won't give you very accurate results. But if you wait until you're on
the highway for a while, it will be very accurate. And you can "tune"
it every once in a while by pressing any key to stop it, and restarting
it with the correct current mileage. This function was an afterthought. I
find it useful to use autopilot mode and fix my 28 someplace in the car
(like on the sun visor) where I can glance at it ocassionally.
During the development of the autopilot mode, I performed an
interesting test. When writing AUTO, I realized that average speed was
a calculated value. If I were to use the calculated value on every
pass to come up with the elapsed miles, then average speed would be
calculating speed in terms of itself, since the elapsed miles would be
used in the next pass to calculate average speed! During testing, I
decided to let this happen anyway, just to see what would happen. I
expected the average speed to pitch back and forth wildly. Instead, TRIP
acted like the driver was slowly taking his foot off the gas. The average
speed slowly dropped off, heading toward zero, and the ETA got longer
and longer. Quite an interesting simulation! In the real version, average
speed is calculated only once and that one constant is used to calculate
elapsed miles. The effect of this is, the calculated average speed drops
off a few miles per hour, and then levels off. The few miles per hour are
not important, since elapsed miles are always based on a fixed speed.
FILUP
-----
Use FILUP when you stop at a gas station and fill up your tank. It
"re-zeroes" the fuel consumption. Obviously, unless you are starting with
a full tank when you pull out of your driveway, the fuel consumption
number is not accurate until you stop to fill up. FILUP requires the
current mileage.
TETA
----
TETA is used when you want to CHANGE your target ETA. Enter the new
target ETA in the form HH.MM. TETA will display a screen similar to
UPDT except line two displays your entered TARGET eta, and MPH shows the
TARGET average speed necessary to meet the target ETA.
OFF
---
OFF is just the OFF key relocated to a more convenient location.
If you only get ocassional screen updates and want to shut the 28 off
afterwards, it is easier to press OFF while driving than pressing
ON.
ENDT
----
ENDT stands for End Trip. Press this when your trip is over. ENDT
will purge the temporary variables and restore your flag settings.
Conclusion.
-----------
It is obvious that TRIP was designed for trips with duration of
less than one day, since it doesn't take the date into account. At the
time I wrote this, I did not have date capability. Multi day trips
should consider each day's driving a separate trip. If you are a marathon
driver and intend to drive more than 24 hours straight, then you should
break up the trip into intermediate targets. I have since come up with
a date routine, and version 2.0 may take dates and many other features
into account.
I apologize if there are any errors in this document, and would
appreciate a note from anyone who finds any so that I may correct them.
This document was written in a big hurry, to honor as closely as possible
the date I said it was going to be released.
I welcome comments and suggestions. Happy driving!