<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>johna's blog</title>
<link>https://johna.compoutpost.com/</link>
<description>...mostly about web development and programming, with a little bit of anything else related to the Internet, computers and technology.</description>
<item>
<title>Diamond DM600 VHS Video Recorder</title>
<link>https://johna.compoutpost.com/blog/1924/diamond-dm600-vhs-video-recorder/</link>
<description>I bought this Diamond DM600 VHS video recorder somewhere around 2000, around the time when VHS players were being replaced with DVD players and recorders. I have never heard of the brand aside from this model, and recall that it was inexpensive.&lt;br&gt;&lt;br&gt;It is made in Thailand by Orion Electric Co. Ltd. of Japan.&lt;br&gt;&lt;br&gt;It features AV out (rear) and two AV inputs (front and rear), 6-head HI-FI stereo. It also has the typical features of late model VCRs like auto tracking, multiple tape speeds and on-screen display.&lt;br&gt;&lt;br&gt;The video recorder has been reliable until recently when the picture quality deteriorated. The cause of this fault ended up being just loose screws. The three screws that secure the cassette mechanism and one screw that secures the circuit board had all come loose and this was causing poor connect with the mechanism and the circuit board.&lt;br&gt;&lt;br&gt;The remote control model number is 076N0ED140.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1924_diamond-dm600-front.jpg&quot;&gt;&lt;img alt=&quot;Diamond DM600 (front)&quot; src=&quot;/blog/uploads/img1924_diamond-dm600-front.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1924_diamond-dm600-rear.jpg&quot;&gt;&lt;img alt=&quot;Diamond DM600 (rear)&quot; src=&quot;/blog/uploads/img1924_diamond-dm600-rear.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1924_diamond-dm600-remote--control-076N0ED140.jpg&quot;&gt;&lt;img alt=&quot;Diamond DM600 remote control (076N0ED140)&quot; src=&quot;/blog/uploads/img1924_diamond-dm600-remote--control-076N0ED140.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;</description>
<comments>https://johna.compoutpost.com/blog/1924/diamond-dm600-vhs-video-recorder/#comments</comments>
<pubDate>2026-05-24T12:00:00+10:00</pubDate>
<category>Electronics</category>
<category>Electrical Repairs</category>
<image>https://johna.compoutpost.com/blog/uploads/img1924_diamond-dm600-front.jpg</image>
<guid>https://johna.compoutpost.com/blog/1924</guid>
</item>
<item>
<title>Electronics in the 1980s were the best</title>
<link>https://johna.compoutpost.com/blog/1874/electronics-in-the-1980s-were-the-best/</link>
<description>Electronics in the 1980s were the best. It was all about lots of switches and lots of lights.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Video Cassette Recorder (VCR)&lt;/h2&gt;&lt;br&gt;The 1980s were the decade where VCRs took off.&lt;br&gt;&lt;br&gt;Before this, you had to watch what was on television at the time it was on television. No watching what you wanted, when you wanted. No recording something to watch later. No buying or borrowing movies and definitely no streaming.&lt;br&gt;&lt;br&gt;My family's first VCR was an Akai around 1980, and I have always admired the distinctive look of this brand's models.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1874_akai_vs-2eg_video_cassette_recorder.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Akai VCR&quot; src=&quot;/blog/thumb/img1874_akai_vs-2eg_video_cassette_recorder_lg.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Early models had the tape going into the top of the unit but it didn't take long for front-loading to become the norm. By the end of the 1980s you could get a stereo units and some had editing functions like my Sony SLV-757.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1874_sony-slv757.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Sony SLV-757 VCR&quot; src=&quot;/blog/thumb/img1874_sony-slv757_lg.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;Hi-Fi Systems&lt;/h2&gt;&lt;br&gt;In contrast to modern audio equipment, 1980s systems were almost a piece of furniture on their own.&lt;br&gt;&lt;br&gt;Although some systems were just a single box with speakers, the best systems were made up of components. You would have an amplifier, an AM/FM tuner, a cassette or double-cassette recorder, and a record player.&lt;br&gt;&lt;br&gt;A graphic equaliser was a very desirable feature, preferably with a spectrum analyser to visualise your music.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1874_aki-hifi.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Akai Hi-Fi system&quot; src=&quot;/blog/thumb/img1874_aki-hifi_lg.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h3&gt;Car Audio&lt;/h3&gt;&lt;br&gt;Although many car radios were just simple radio and sometimes cassette players, big stereos were popular.&lt;br&gt;&lt;br&gt;One of the most revered systems was from Fujitsu Ten, which almost resembled a home component system.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1874_Fujitsu Ten 1986.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Fujitsu Ten Car Audio&quot; src=&quot;/blog/thumb/img1874_Fujitsu Ten 1986_lg.png&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;Digital Watches&lt;/h2&gt;&lt;br&gt;Although digital watches were available prior to the 1980s, the black plastic digital watch became very popular in the 1980s.&lt;br&gt;&lt;br&gt;Common features were one or multiple alarms, hourly chime, stopwatch, countdown timer but the ones that was most interest in were calculator watches.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1343_casio-wl-10.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Casio WL-10&quot; src=&quot;/blog/thumb/img1343_casio-wl-10_md.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;Clock Radios&lt;/h2&gt;&lt;br&gt;Back in the 1980s we could choose to wake up to a noisy alarm or the the sound of a radio broadcast.&lt;br&gt;&lt;br&gt;Clock radios might have peaked in the 1970s but were still popular in the 1980s. There's not much that can change with a clock radio other than styling, although some did integrate extras like a cassette recorder, a (corded) telephone or even a television.&lt;br&gt;&lt;br&gt;Here is a picture of &lt;a href=&quot;/blog/1344/vintage-clock-radios-and-my-soundesign-3834-a/&quot;&gt;my Soundesign clock radio&lt;/a&gt; that I had as a child.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1344_soundesign-3834-a-2.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Soundesign 3834-A&quot; src=&quot;/blog/thumb/img1344_soundesign-3834-a-2_lg.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;Games consoles&lt;/h2&gt;&lt;br&gt;Although simple game consoles were becoming popular in the 1970s, by the 1980s some lucky families had something like an Atari 2600 or an Intellivision. The 1980s was a peak time for gaming consoles. They seemed to fizzle out with the rising popularity of home computers in the 1980s, but then they rose again during the 1990s and 2000s.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1874_atari-2600.jpg&quot;&gt;&lt;img alt=&quot;Atari 2600&quot; src=&quot;/blog/uploads/img1874_atari-2600.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;Computers&lt;/h2&gt;&lt;br&gt;In the 1980s we weren't limited to just PC (or Linux) and Mac, although these systems all started in this decade. The home computer industry was just getting started and there were many manufacturers producing their own systems, most incompatible with everything else available. Many came and went quickly, never to be heard of again.&lt;br&gt;&lt;br&gt;Home computers were, of course, simpler, and most booted into the BASIC programming language which resulted in many people learning to write their own software. It was also extremely popular for magazines to feature program listings -- mostly games -- that you could type in, which would usually take hours and involve finding and fixing many errors due to misreading or mistyping.&lt;br&gt;&lt;br&gt;Here in Australia, Commodore was one of the most popular brands, particularly the C64 and then later in the 1980s, the Amiga.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1874_commodore-64.jpg&quot;&gt;&lt;img alt=&quot;Commodore 64&quot; src=&quot;/blog/uploads/img1874_commodore-64.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
<comments>https://johna.compoutpost.com/blog/1874/electronics-in-the-1980s-were-the-best/#comments</comments>
<pubDate>2026-03-01T12:00:00+10:00</pubDate>
<category>Retro</category>
<category>Electronics</category>
<image>https://johna.compoutpost.com/blog/uploads/img1874_akai_vs-2eg_video_cassette_recorder.jpg</image>
<guid>https://johna.compoutpost.com/blog/1874</guid>
</item>
<item>
<title>How to fix no live video or recording on RxDrone</title>
<link>https://johna.compoutpost.com/blog/1903/how-to-fix-no-live-video-or-recording-on-rxdrone/</link>
<description>Most of the cheaper drones found on Aliexpress, eBay, Temu and similar sites are intended to be used with the Android app RxDrone where you can see the live video feed from the drone and record video to the phone.&lt;br&gt;&lt;br&gt;We recently bought a drone and had great difficulty getting the live video preview and recording working. We could control the drone using the app, and take photos, but video was near impossible. Maybe one time out of 30 attempts we could see and record video, which was very frustrating.&lt;br&gt;&lt;br&gt;While searching for a solution I came across a &lt;a href=&quot;https://www.tiktok.com/@heoxrc/video/7572465815598009608&quot;&gt;TikTok video&lt;/a&gt; which had the the solution to this problem, which is to install an older version of RxDrone.&lt;br&gt;&lt;br&gt;To do this you need to open the website &lt;a href=&quot;https://apkpure.com/&quot;&gt;apkpure.com&lt;/a&gt; in the browser on the phone.&lt;br&gt;&lt;br&gt;Then search for the app &quot;RxDrone&quot;. There are a couple of results and I chose the second one because that's what the guy on TikTok did.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;text-center&quot;&gt;&lt;a href=&quot;/blog/uploads/img1903_1917.png&quot;&gt;&lt;img alt=&quot;Screenshot&quot; src=&quot;/blog/thumb/img1903_1917_md.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Then scroll down to &quot;Old Versions of RxDrone&quot; and then press &quot;All Versions&quot; because the version we are looking for won't be in the list yet.&lt;br&gt;&lt;br&gt;A new list will appear and you will probably have to press &quot;Show More&quot; until you can see &quot;RxDrone 1.4.6&quot;.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;text-center&quot;&gt;&lt;a href=&quot;/blog/uploads/img1903_1918.png&quot;&gt;&lt;img alt=&quot;Screenshot&quot; src=&quot;/blog/thumb/img1903_1918_md.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Press &quot;Download&quot; and then on the next page scroll down and don't choose &quot;Fast Download&quot;, press on &quot;Download APK&quot;.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;text-center&quot;&gt;&lt;a href=&quot;/blog/uploads/img1903_1919.png&quot;&gt;&lt;img alt=&quot;Screenshot&quot; src=&quot;/blog/thumb/img1903_1919_md.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;You will get some sort of warning which you will need to continue past and then the download will commence.&lt;br&gt;&lt;br&gt;Once downloaded attempt to open the file which will likely result in another warning with an option to change a setting to allow to install this untrusted app (because it was not downloaded through Google Play). Follow the instructions to allow the app to be installed.&lt;br&gt;&lt;br&gt;Once installed you should now be able to see live video and record video.</description>
<comments>https://johna.compoutpost.com/blog/1903/how-to-fix-no-live-video-or-recording-on-rxdrone/#comments</comments>
<pubDate>2025-11-24T12:00:00+10:00</pubDate>
<category>Electronics</category>
<image>https://johna.compoutpost.com/blog/uploads/img1903_1917.png</image>
<guid>https://johna.compoutpost.com/blog/1903</guid>
</item>
<item>
<title>Skmei 2255 Calculator Digital Watch Review</title>
<link>https://johna.compoutpost.com/blog/1347/skmei-2255-calculator-digital-watch-review/</link>
<description>I recently bought a Skmei 2255 calculator digital watch from China and would like to share my opinion of it.&lt;br&gt;&lt;br&gt;The 2255 is a clone of the Casio DBC-32-1A and, aside from some different colour options and case labeling, looks and operates basically the same.&lt;br&gt;&lt;br&gt;I haven't owned or used the Casio so I can't comment on the differences, but I have used other Casio watches so can make some general observations from my experience.&lt;br&gt;&lt;br&gt;When my 2255 arrived it came in just a plastic bag with an instruction sheet and I was initially impressed with the way it looked. That feeling faded once I put it into use.&lt;br&gt;&lt;br&gt;The first issue is the viewing angle of the LCD screen. You cannot read the display from an angle of more than about 30 or 45 degrees. This is common with cheaper watches and, although it is a little annoying that you have to check the time looking almost straight, it is something you can probably live with.&lt;br&gt;&lt;br&gt;The next issue is the colour. I ordered the black version of the watch (it's also available in blue, gold and green). I did not notice until I went out into sunlight that the control panel is purple! It's hard to capture a good photo of this but when outside it is bright purple and I didn't sign up for purple. Strike two.&lt;br&gt;&lt;br&gt;The third and final strike is the calculator keys. I have watched video reviews on the Casio and the Casio keys appear to be usable, but it is impossible to press the Skmei keys with your finger &amp;ndash; you must press hard with your finger nail. It makes the calculator and phonebook almost unusable and you also have to use these keys sometimes for other functions like setting the time. I thought at first it was nice to be able to type in the time rather than incrementally adjust it, but it's hard to do.&lt;br&gt;&lt;br&gt;With those issues aside I can confirm that the phone does look good like the Casio (as long as you don't mind purple) and features like the automatic light work well. If like me, you are choosing a calculator watch for nostalgia, then you might still be happy with it for half the price of the Casio or less.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;https://skmei-watches.com/products/skmei-2255-calculator-digital-watch&quot; target=&quot;_blank&quot;&gt;Skmei website&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.casio.com/intl/watches/casio/product.DBC-32-1A/&quot; target=&quot;_blank&quot;&gt;Casio website&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;div class=&quot;row&quot;&gt;&lt;div class=&quot;col-6&quot;&gt;&lt;a href=&quot;/blog/uploads/img1347_skmei-2255-full.jpg&quot;&gt;&lt;img alt=&quot;Skmei 2255&quot; src=&quot;/blog/uploads/img1347_skmei-2255-full.jpg&quot; class=&quot;img-fluid mb-3&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;col-6&quot;&gt;&lt;a href=&quot;/blog/uploads/img1347_skmei-2255-closeup.jpg&quot;&gt;&lt;img alt=&quot;Skmei 2255 close up&quot; src=&quot;/blog/uploads/img1347_skmei-2255-closeup.jpg&quot; class=&quot;img-fluid mb-3&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;col-6&quot;&gt;&lt;a href=&quot;/blog/uploads/img1347_skmei-2255-display-issue.jpg&quot;&gt;&lt;img alt=&quot;Skmei 2255 display issue&quot; src=&quot;/blog/uploads/img1347_skmei-2255-display-issue.jpg&quot; class=&quot;img-fluid mb-3&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;col-6&quot;&gt;&lt;a href=&quot;/blog/uploads/img1347_skmei-2255-is-purple.jpg&quot;&gt;&lt;img alt=&quot;Skmei 2255 is purple&quot; src=&quot;/blog/uploads/img1347_skmei-2255-is-purple.jpg&quot; class=&quot;img-fluid mb-3&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;col-6&quot;&gt;&lt;a href=&quot;/blog/uploads/img1347_skmei-2255-instructions.jpg&quot;&gt;&lt;img alt=&quot;Skmei 2255 instructions&quot; src=&quot;/blog/uploads/img1347_skmei-2255-instructions.jpg&quot; class=&quot;img-fluid mb-3&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</description>
<comments>https://johna.compoutpost.com/blog/1347/skmei-2255-calculator-digital-watch-review/#comments</comments>
<pubDate>2025-01-27T12:00:00+10:00</pubDate>
<category>Electronics</category>
<category>Reviews</category>
<image>https://johna.compoutpost.com/blog/uploads/img1347_skmei-2255-full.jpg</image>
<guid>https://johna.compoutpost.com/blog/1347</guid>
</item>
<item>
<title>Another pointless project - the programmable digital watch</title>
<link>https://johna.compoutpost.com/blog/1346/another-pointless-project-the-programmable-digital-watch/</link>
<description>&lt;p&gt;&lt;img alt=&quot;Programmable digital watch project.jpg&quot; src=&quot;/blog/thumb/img1346_programmable-digital-watch-project_lg.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I've come up with yet another pointless project.&lt;/p&gt;
&lt;p&gt;Recently, I've rekindled my interest in digital watches after having found my old calculator watch from the 1990s.&lt;/p&gt;
&lt;p&gt;With mobile phones, there's no longer much need for a watch, let alone a calculator watch, and I was trying to think of what features might make a watch more appealing in the current age.&lt;/p&gt;
&lt;p&gt;To be honest, I couldn't think of any new features or good reasons to wear a watch other than for fashion reasons, or for people who want to be able to check the time quicker and more convenient than reaching for their mobile phone.&lt;/p&gt;
&lt;p&gt;But you can still buy a new calculator watch in 2025, so that indicates to me that there is a market for pointless watches for hobbyists. So what would be of interest to hobbyists?&lt;/p&gt;
&lt;p&gt;The only thing that I could come up with was being able to program your own watch. I know you can get smart watches and have apps for any purpose, or create your own app, but I was thinking of a much simpler, more convention digital watch that uses a typical watch battery that lasts for years rather than needing to be charged every day.&lt;/p&gt;
&lt;p&gt;It would have a simple BASIC-style programming language that would have minimal features and commands but enough to do anything a watch needs to do and more.&lt;/p&gt;
&lt;p&gt;How would you program it? You could develop in a desktop application or browser-based editor with a built-in emulator, and then compile into some sort of minimalist opcode and transfer to the watch by a simple serial two-pin cable. No USB as that might add to the complexity of the computing power needed for the watch.&lt;/p&gt;
&lt;p&gt;As a proof-of-concept I started working on a web-based emulator with a JavaScript library of functions, similar to what I would expect the watch would have. For my POC, developing your own programs is in the JavaScript language simply because I didn't want to go to the lengths of creating my own compiler.&lt;/p&gt;
&lt;p&gt;I have no idea the available computing power of a digital watch so I don't know if this is actually possible. For the POC, I kept things pretty minimal. I chose a display consisting of 4 rows capable of alphanumeric characters plus a row of common icons (AM, PM, 24HR, DST, ALM, SNZ, CHIME). The font is made up of 5 x 5 pixels. However, a fully customisable pixel display would be more flexible if possible.&lt;/p&gt;
&lt;p&gt;The top and bottom rows are 13 characters long and are intended to indicate what each of the four buttons do, as their functions would not be printed on the watch, and will vary depending on the mode and settings of the watch.&lt;/p&gt;
&lt;p&gt;I liked the idea of the different modes of the clock being stored in self-contained modules so did this for my example.&lt;/p&gt;
&lt;p&gt;This is very much a work-in-progress. The JavaScript library is only for the purpose of emulating what the watch would do. &lt;/p&gt;
&lt;p&gt;It's been quite interesting thinking of how to make the various watch functions work and the potential problems associated with certain situations, such as if an alarm was to go off while in the middle of setting the time.&lt;/p&gt;
&lt;p&gt;If you are reading this post, my question to you is if you had access to a programmable digital watch, what features would you like to create?&lt;/p&gt;
&lt;div class=&quot;alert alert-info&quot;&gt;UPDATE: turns out there is already something similar to this out there. &lt;a href=&quot;https://www.sensorwatch.net/&quot; target=&quot;_blank&quot;&gt;Sensor Watch&lt;/a&gt; is a new circuit board that fits inside a Casio F-91W watch housing and has an ARM processor. There is various firmware to download and a framework for creating your own. Updates are through USB and despite being a powerful processor, the battery can last 18 months. As good as this is, and much more powerful than I imagined possible, the programming part is more complicated than I would have aimed for, and the F-91W display is very limiting.&lt;/div&gt;
&lt;div class=&quot;alert alert-info&quot;&gt;UPDATE 2: Back in 1984 there was the Seiko UC-2000 -- a digital watch with a docking station with keyboard and even a printer. These were programmable in Microsoft BASIC. Read about it on &lt;a href=&quot;https://hackaday.com/2024/07/16/seiko-had-a-smartwatch-in-1984/&quot; target=&quot;_blank&quot;&gt;Hackaday&lt;/a&gt; or find some interesting information &lt;a href=&quot;https://github.com/azya52/seiko&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; including an emulator.&lt;br&gt;&lt;br&gt;&lt;img alt=&quot;Seiko UC-2000&quot; src=&quot;/blog/thumb/img1346_seiko-uc-2000_lg.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/div&gt;
&lt;h2&gt;Try it&lt;/h2&gt;
&lt;p&gt;Here is my incomplete first attempt at the proof-of-concept.&lt;/p&gt;
&lt;p&gt;The main clock mostly works, setting the date and time works but has issues due to problems with the JavaScript library, and the stopwatch works pretty well. I will keep working on these and the other functions like alarm, dual time and countdown timer.&lt;/p&gt;
&lt;p&gt;Inspect the page code to see how it works.&lt;/p&gt;
&lt;p&gt;Once the code is in a better state I might make a package that can be downloaded and will be easier to do some development for.&lt;/p&gt;
&lt;style type=&quot;text/css&quot;&gt;

        .pdw-container {
            background: url(/blog/uploads/img1346_watch-background.jpg) no-repeat;
            height: 681px;
            position: relative;
            width: 478px;
        }

        .pdw-display {
            position: absolute;
            left: 133px;
            top: 265px;
        }

        .pdw-container .button {
            height: 36px;
            position: absolute;
            /*outline: 1px solid red;*/
            width: 12px;
        }

        .pdw-container .button:hover {
            cursor: pointer;
            height: 36px;
            position: absolute;
            outline: 1px solid blue;
            width: 12px;
        }

        #button0 {
            left: 414px;
            top: 264px;
        }

        #button1 {
            left: 414px;
            top: 354px;
        }

        #button2 {
            left: 48px;
            top: 354px;
        }

        #button3 {
            left: 48px;
            top: 264px;
        }

        .r {
            display: flex;
            gap: 2px;
        }

        .r.md {
            gap: 2px;
        }

        .r.lg {
            gap: 2px;
        }

        .chr {
            display: flex;
            flex-wrap: wrap;
            gap: 1px;
            width: 14px;
        }

        .chr span {
            background-color: #eee;
            height: 2px;
            width: 2px;
        }

        .md .chr {
            width: 19px;
        }

        .md .chr span {
            height: 3px;
            width: 3px;
        }

        .lg .chr {
            width: 24px;
        }

        .lg .chr span {
            height: 8px;
            width: 4px;
        }

        .chr span.on {
            background-color: #111;
        }

        .dispr {
            font-family: monospace;
            font-size: 10px;
            color: #eee;
            display: flex;
            justify-content: space-between;
            width: 208px;
        }

        .dispr .on {
            color: #111;
        }

    &lt;/style&gt;

&lt;div class=&quot;pdw-container mb-4&quot;&gt;
    &lt;div class=&quot;pdw-display&quot;&gt;

        &lt;div class=&quot;r&quot;&gt;
            &lt;div id=&quot;r0c0&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c1&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c2&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c3&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c4&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c5&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c6&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c7&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c8&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c9&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c10&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c11&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r0c12&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&quot;r md&quot; style=&quot;margin-top: 8px;&quot;&gt;
            &lt;div id=&quot;r1c0&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r1c1&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r1c2&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r1c3&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r1c4&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r1c5&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r1c6&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r1c7&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r1c8&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r1c9&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&quot;dispr&quot; style=&quot;margin-top: 1px;&quot;&gt;
            &lt;span id=&quot;disp24hr&quot;&gt;24HR&lt;/span&gt;
            &lt;span id=&quot;dispam&quot;&gt;AM&lt;/span&gt;
            &lt;span id=&quot;disppm&quot;&gt;PM&lt;/span&gt;
            &lt;span id=&quot;dispdst&quot;&gt;DST&lt;/span&gt;
            &lt;span id=&quot;dispalarm&quot;&gt;ALM&lt;/span&gt;
            &lt;span id=&quot;dispsnooze&quot;&gt;SNZ&lt;/span&gt;
            &lt;span id=&quot;dispchime&quot;&gt;CHIME&lt;/span&gt;
        &lt;/div&gt;

        &lt;div class=&quot;r lg&quot; style=&quot;margin-top: 0px;&quot;&gt;
            &lt;div id=&quot;r2c0&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r2c1&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r2c2&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r2c3&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r2c4&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r2c5&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r2c6&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r2c7&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&quot;r&quot; style=&quot;margin-top: 8px;&quot;&gt;
            &lt;div id=&quot;r3c0&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c1&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c2&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c3&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c4&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c5&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c6&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c7&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c8&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c9&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c10&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c11&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
            &lt;div id=&quot;r3c12&quot; class=&quot;chr&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;
       
    &lt;/div&gt;
    &lt;a id=&quot;button0&quot; class=&quot;button button0&quot;&gt;&lt;/a&gt;
    &lt;a id=&quot;button1&quot; class=&quot;button button1&quot;&gt;&lt;/a&gt;
    &lt;a id=&quot;button2&quot; class=&quot;button button2&quot;&gt;&lt;/a&gt;
    &lt;a id=&quot;button3&quot; class=&quot;button button3&quot;&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;script&gt;
//Constants

let chars = [];
//            0  0  0  0  0  1  1  1  1  1  2  2  2  2  2  3  3  3  3  3  4  4  4  4  4
chars['A'] = [0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1];
chars['B'] = [1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0];
chars['C'] = [0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1];
chars['D'] = [1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1 ,0];
chars['E'] = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1];
chars['F'] = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0];
chars['G'] = [0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1];
chars['H'] = [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1];
chars['I'] = [0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0];
chars['J'] = [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0];
chars['K'] = [1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1];
chars['L'] = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1];
chars['M'] = [1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1];
chars['N'] = [1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1];
chars['O'] = [0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0];
chars['P'] = [1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0];
chars['Q'] = [0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1];
chars['R'] = [1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1];
chars['S'] = [0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0];
chars['T'] = [1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0];
chars['U'] = [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0];
chars['V'] = [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0];
chars['W'] = [1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0];
chars['X'] = [1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1];
chars['Y'] = [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0];
chars['Z'] = [1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1];
chars['0'] = [0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0];
chars['1'] = [0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0];
chars['2'] = [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1];
chars['3'] = [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0];
chars['4'] = [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
chars['5'] = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0];
chars['6'] = [0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0];
chars['7'] = [1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0];
chars['8'] = [0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0];
chars['9'] = [0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0];
chars[' '] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
chars[':'] = [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0];
chars['-'] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
chars['&gt;'] = [0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0];
chars['&lt;'] = [0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0];
chars['.'] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0];
chars[&quot;'&quot;] = [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
chars['+'] = [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0];
//chars[''] = [];
//            0  0  0  0  0  1  1  1  1  1  2  2  2  2  2  3  3  3  3  3  4  4  4  4  4

//Variables

let tenths = 0;

//Button handlers
var button = [];
button[0] = null;
button[1] = null;
button[2] = null;
button[3] = null;

//On tick handlers
let ontick_list = [];

//Show time
let showtime_list = {};

//Running clocks
let clock_list = {};

/**
 * Clear the screen (row = null) or a row (0 to 3)
 * @param {*} row
 */
function clear(row = null) {
    if (row === 0 || row === null) {
        print(0, 0 , '             ');
    }
    if (row === 1 || row === null) {
        print(1, 0 , '          ');
    }
    if (row === 2 || row === null) {
        print(2, 0 , '        ');
    }
    if (row === 3 || row === null) {
        print(3, 0 , '             ');
    }
}

/**
 * Draw a single character at a row and column
 * @param {*} row
 * @param {*} col
 * @param {*} chr
 */
function drawChar(row, col, chr) {
    let content = '';
    chars[chr].forEach((pxl) =&gt; {
        if (pxl === 0) {
            content += '&lt;span&gt;&lt;/span&gt;';
        } else {
            content += '&lt;span class=&quot;on&quot;&gt;&lt;/span&gt;';
        }
    });

    document.getElementById(`r${row}c${col}`).innerHTML = content;
}

/**
 * Display one of the system icons:
 * 24hr, am, pm, alarm, dst or chime
 * @param {*} disp
 * @param {*} status
 */
function display(disp, status) {
    if (disp === '24hr') {
        if (status === 1) {
            document.getElementById('disp24hr').classList.add('on');
        } else {
            document.getElementById('disp24hr').classList.remove('on');
        }
    } else if (disp === 'am') {
        if (status === 1) {
            document.getElementById('dispam').classList.add('on');
        } else {
            document.getElementById('dispam').classList.remove('on');
        }
    } else if (disp === 'pm') {
        if (status === 1) {
            document.getElementById('disppm').classList.add('on');
        } else {
            document.getElementById('disppm').classList.remove('on');
        }
    } else if (disp === 'dst') {
        if (status === 1) {
            document.getElementById('dispdst').classList.add('on');
        } else {
            document.getElementById('dispdst').classList.remove('on');
        }
    } else if (disp === 'alarm') {
        if (status === 1) {
            document.getElementById('dispalarm').classList.add('on');
        } else {
            document.getElementById('dispalarm').classList.remove('on');
        }
    } else if (disp === 'snooze') {
        if (status === 1) {
            document.getElementById('dispsnooze').classList.add('on');
        } else {
            document.getElementById('dispsnooze').classList.remove('on');
        }
    } else if (disp === 'chime') {
        if (status === 1) {
            document.getElementById('dispchime').classList.add('on');
        } else {
            document.getElementById('dispchime').classList.remove('on');
        }
    }
}

/**
 * Print a string on a row starting at a column
 * @param {*} row
 * @param {*} col
 * @param {*} str
 */
function print(row, col, str) {
    for (var i = 0; i &lt; str.length; i++) {
        drawChar(row, col + i, str.substring(i, i + 1));
    }
}

/**
 * Assign a handler to a button
 * 0 = TR, 1 = BR, 2 = BL, 3 = TL
 * @param {*} btn
 * @param {*} fn
 */
function onbutton(btn, fn) {
    button[btn] = fn;
}

/**
 * Call a handler every second
 * @param {*} name
 * @param {*} fn
 */
function ontick(name, fn) {
    onticks[name] = fn;
}

/**
 * Set optional date parts
 * @param {*} obj
 * @param {*} y
 * @param {*} m
 * @param {*} d
 */
function setdate(obj, y, m, d) {
    if (y !== null) {
        obj.setFullYear(y);
    }

    if (m !== null) {
        obj.setMonth(m);
    }

    if (d !== null) {
        obj.setDate(d);
    }
}

function addshowdate(name, obj, row, col, format) {
    print(row, col, formatDateOrTime(obj, format));
    showtime_list[name] = [obj, row, col, format, 0];
}

function removeshowdate(name) {
    showtime_list[name] = null;
}

function addshowtime(name, obj, row, col, format, ampm24hr) {
    printtime(obj, row, col, format, ampm24hr);
    showtime_list[name] = [obj, row, col, format, ampm24hr];
}

function removeshowtime(name) {
    if (!showtime_list[name]) {
        return;
    }
    print(showtime_list[name][1], showtime_list[name][2], (' ').repeat(showtime_list[name][3].length));
    showtime_list[name] = null;
}

function printtime(obj, row, col, format, ampm24hr) {
    if (ampm24hr === 1) {
        if (obj.getHours() &gt; 11) {
            display('am', 0);
            display('pm', 1);
            } else {
            display('am', 1);
            display('pm', 0);
        }
        display('24hr', 0);
    } else if (ampm24hr === 2) {
        display('am', 0);
        display('pm', 0);
        display('24hr', 1);
    } else {
        display('am', 0);
        display('pm', 0);
        display('24hr', 0);
    }
    print(row, col, formatDateOrTime(obj, format, ampm24hr));
}

function formatDateOrTime(val, format, ampm24hr) {
    let groups = [];
    let count = 1;
    for (let i = 0; i &lt; format.length; i++) {
        if (format[i] === format[i + 1]) {
             count++;
        } else {
            groups.push(format[i].repeat(count));
            count = 1;
        }
     }
     
     let result = '';
     groups.forEach((fmt) =&gt; {
        //TODO need formats for leading 0 and leading space and flashing
        if (
            fmt === fmt.toUpperCase() &amp;&amp; tenths &gt;= 50
            &amp;&amp; (
                fmt === 'YY'
                || fmt === 'YYYY'
                || fmt === 'M'
                || fmt === 'MM'
                || fmt === 'MMM'
                || fmt === 'D'
                || fmt === 'DD'
                || fmt === 'WW'
                || fmt === 'WWW'
                || fmt === 'H'
                || fmt === 'HH'
                || fmt === 'N'
                || fmt === 'NN'
                || fmt === 'S'
                || fmt === 'SS'
                || fmt === 'F'
                || fmt === 'FF'
                || fmt === 'FFF'
            )
        ) {
            result += (' ').repeat(fmt.length);
        } else {
            fmt = fmt.toLowerCase();
            if (fmt === 'yy') {
                result += ('' + val.getFullYear()).slice(-2);
            } else if (fmt === 'yyyy') {
                result += val.getFullYear();
            } else if (fmt === 'm') {
                result += (val.getMonth() + 1);
            } else if (fmt === 'mm') {
                result += ('0' + (val.getMonth() + 1)).slice(-2);
            } else if (fmt === 'mmm') {
                switch (val.getMonth()) {
                    case 0:
                        result += 'JAN';
                        break;
                    case 1:
                        result += 'FEB';
                        break;
                    case 2:
                        result += 'MAR';
                        break;
                    case 3:
                        result += 'APR';
                        break;
                    case 4:
                        result += 'MAY';
                        break;
                    case 5:
                        result += 'JUN';
                        break;
                    case 6:
                        result += 'JUL';
                        break;
                    case 7:
                        result += 'AUG';
                        break;
                    case 8:
                        result += 'SEP';
                        break;
                    case 9:
                        result += 'OCT';
                        break;
                    case 10:
                        result += 'NOV';
                        break;
                    case 11:
                        result += 'DEC';
                }                                                                                                                                                                                                                        
            } else if (fmt === 'd') {
                result += val.getDate();
            } else if (fmt === 'dd') {
                result += ('0' + val.getDate()).slice(-2);
            } else if (fmt === 'ww') {
                switch (val.getDay()) {
                    case 0:
                        result += 'SU';
                        break;
                    case 1:
                        result += 'MO';
                        break;
                    case 2:
                        result += 'TU';
                        break;
                    case 3:
                        result += 'WE';
                        break;
                    case 4:
                        result += 'TH';
                        break;
                    case 5:
                        result += 'FR';
                        break;
                    case 6:
                        result += 'SA';
                        break;
                }
            } else if (fmt === 'www') {
                switch (val.getDay()) {
                    case 0:
                        result += 'SUN';
                        break;
                    case 1:
                        result += 'MON';
                        break;
                    case 2:
                        result += 'TUE';
                        break;
                    case 3:
                        result += 'WED';
                        break;
                    case 4:
                        result += 'THU';
                        break;
                    case 5:
                        result += 'FRI';
                        break;
                    case 6:
                        result += 'SAT';
                        break;
                }
            } else if (fmt === 'h') {
                let h = val.getHours();
                if (ampm24hr !== 2) {
                    if (h === 0) {
                        h = 12;
                    } else if (h &gt; 12) {
                        h = h - 12;
                    }
                }
                result += h;
            } else if (fmt === 'hh') {
                let h = val.getHours();
                if (ampm24hr !== 2) {
                    if (h === 0) {
                        h = 12;
                    } else if (h &gt; 12) {
                        h = h - 12;
                    }
                }
                result += ('0' + h).slice(-2);
            } else if (fmt === 'n') {
                result += val.getMinutes();
            } else if (fmt === 'nn') {
                result += ('0' + val.getMinutes()).slice(-2);
            } else if (fmt === 's') {
                result += val.getSeconds();
            } else if (fmt === 'ss') {
                result += ('0' + val.getSeconds()).slice(-2);
            } else if (fmt === 'f') {
                let f = ('00' + val.getMilliseconds()).slice(-3);
                result += (f).substring(0, 1);
            } else if (fmt === 'ff') {
                let f = ('00' + val.getMilliseconds()).slice(-3);
                result += (f).substring(0, 2);
            } else if (fmt === 'fff') {
                let f = ('00' + val.getMilliseconds()).slice(-3);
                result += (f).substring(0, 3); //Unsupported - only shows hundredths
            } else {
                result += fmt;
            }
        }
     });


    return result;
}

/**
 * Set optional time parts
 * @param {*} obj
 * @param {*} h
 * @param {*} m
 * @param {*} s
 * @param {*} ms
 */
function settime(obj, h, m, s, ms) {
    //TODO something here broken - results in invalid date
    if (h !== null) {
        obj.setHours(h);
    }

    if (m !== null) {
        obj.setMinutes(m);
    }

    if (s !== null) {
        obj.setSeconds(s);
    }

    if (ms !== null) {
        obj.setMilliseconds(ms);
    }
}

//System on tick handler
function system_ontick() {
    if (tenths &lt; 99) {
        tenths++;
    } else {
        tenths = 0;
    }

    for (var obj in clock_list) {
        if (clock_list[obj] !== null &amp;&amp; clock_list[obj][1] !== 0) {
            //clock_list[obj][0].setSeconds(clock_list[obj][0].getSeconds() + clock_list[obj][1]);
            clock_list[obj][0].setMilliseconds(clock_list[obj][0].getMilliseconds() + (clock_list[obj][1] * 10));
        }
    }

    for (var obj in showtime_list) {
        if (showtime_list[obj] !== null) {
            printtime(showtime_list[obj][0], showtime_list[obj][1], showtime_list[obj][2], showtime_list[obj][3], showtime_list[obj][4]);
        }
    }
}

function addclock(name, obj, inc) {
    clock_list[name] = [obj, inc];
    //clock_list.push([obj, inc]);
}

function removeclock(name) {
    clock_list[name] = null;
    //clock_list.push([obj, inc]);
}

function button0_click() {
    if (button[0] !== null) {
        button[0]();
    }
}

function button1_click() {
    if (button[1] !== null) {
        button[1]();
    }
}

function button2_click() {
    if (button[2] !== null) {
        button[2]();
    }
}

function button3_click() {
    if (button[3] !== null) {
        button[3]();
    }
}


//Initialise

clear();

document.getElementById('button0').addEventListener('click', button0_click);
document.getElementById('button1').addEventListener('click', button1_click);
document.getElementById('button2').addEventListener('click', button2_click);
document.getElementById('button3').addEventListener('click', button3_click);


setInterval(system_ontick, 10);

&lt;/script&gt;
&lt;script&gt;

var clock_mode = (function() {
    let clocktime = new Date(); //1970, 1, 1, 0, 0, 0, 0); //main time and date
    let clockmode = 0; //0 = am/pm, 1 = 24 hour clock
    let clockdst = 0; //0 DST off, 1 = DST on
    let clockset = 0; // 0 = not in set mode, 1...6 (s, h, m, y, m, d)

    function setclockdst() {
        if (clockdst === 0) {
            clocktime.setHours(clocktime.getHours() + 1);
            clockdst = 1;
        } else {
            clocktime.setHours(clocktime.getHours() - 1);
            clockdst = 0;
        }
        display('dst', clockdst);
        //update the time immediately
        showtime();
    }
    
    function setclockmode() {
        if (clockmode === 0) {
            clockmode = 1;
        } else {
            clockmode = 0;
        }
        //apply the 24 hours to the clock setting
        showtime();
    }

    function showtime() {
        addshowdate('clock', clocktime, 1, 0, 'www dd mmm');
        // if (clockmode === 0) {
        //     addshowtime('clock', clocktime, 2, 0, 'hh:nn ss', 1); //0 = dont show am/pm/24hr, 1 = show am/pm, 2 = show 24hr
        // } else {
        //     addshowtime('clock', clocktime, 2, 0, 'hh:nn ss', 2);
        // }
        addshowtime('clock', clocktime, 2, 0, 'hh:nn ss', clockmode + 1);
    }

    function showclock() {
        print(0, 9, 'DST&gt;');
        print(3, 8, '24HR&gt;');
        print(0, 0, '&lt;SET ');
        showtime();
        onbutton(0, setclockdst);
        onbutton(1, setclockmode);
        onbutton(3, setclock);
    }

    //Clock setting

    function setclock() {
        if (clockset === 0) {
            print(0, 9, 'INC&gt;');
            print(3, 8, 'NEXT&gt;');
            print(0, 0, '&lt;DONE');

            onbutton(0, setclockinc);
            onbutton(1, setclockadv);
    
            setclockadv();
        } else {
            showclock();

            clockset = 0;
        }
    }
    
    function setclockadv() {
        if (clockset === 6) {
            clockset = 1;
        } else {
            clockset = clockset + 1;
        }
        showsetclock();
    }
    
    function showsetclock() {
        if (clockset &lt;= 3) {
            addshowdate('clock', clocktime, 1, 0, 'www dd mmm');
            switch (clockset) {
                case 1:
                    addshowtime('clock', clocktime, 2, 0, 'hh:nn SS', clockmode + 1);
                    addshowtime('clock', clocktime, 2, 0, 'hh:nn SS', clockmode + 1);
                    break;
                case 2:
                    addshowtime('clock', clocktime, 2, 0, 'HH:nn ss', clockmode + 1);
                    break;
                case 3:
                    addshowtime('clock', clocktime, 2, 0, 'hh:NN ss', clockmode + 1);
                    break;
            }
        } else {
            addshowtime('clock', clocktime, 2, 0, 'hh:nn ss', clockmode + 1);
            switch (clockset) {
                case 4:
                    addshowdate('clock', clocktime, 1, 0, 'www DD mmm');
                    break;
                case 5:
                    addshowdate('clock', clocktime, 1, 0, 'www dd MMM');
                    break;
                case 6:
                    addshowdate('clock', clocktime, 1, 0, &quot;'YY dd mmm&quot;);
                    break;
            }
        }
    }

    function setclockinc() {
        if (clockset === 1) {
            //seconds - set to zero
            clocktime.setSeconds(0);
        } else if (clockset === 2) {
            //hours
            if (clocktime.getHours() === 23) {
                clocktime.setHours(0);
            } else {
                clocktime.setHours(clocktime.getHours() + 1);
            }
        } else if (clockset === 3) {
            //minutes
            if (clocktime.getMinutes() === 59) {
                clocktime.setMinutes(0);
            } else {
                clocktime.setMinutes(clocktime.getMinutes() + 1);
            }
        } else if (clockset === 4) {
            //year
            if (clocktime.getFullYear() === 2125) {
                clocktime.setFullYear(2025);
            } else {
                clocktime.setFullYear(clocktime.getFullYear() + 1);
            }
        } else if (clockset === 5) {
            //month
            if (clocktime.getMonth() === 11) {
                clocktime.setMonth(0);
            } else {
                clocktime.setMonth(clocktime.getMonth() + 1);
            }
        } else if (clockset === 6) {
            //day
            //if (clocktime.getDate()) ldom
        }
    }

    //end clock setting

    let api = {};

    api.init = function() {
        setdate(clocktime, 2025, 0, 23);
        //settime(clocktime, 0, 0, 0);
        //console.log(clocktime);
        addclock('clock', clocktime, 1);
    }

    api.show = function() {
        clear();
        // print(0, 0, '&lt;SET');
        //print(0, 9, 'DST&gt;');
        print(3, 0, '&lt;MODE');
        //print(3, 8, '24HR&gt;');
        // addshowdate('clock', clocktime, 1, 0, 'DDD dd MMM');
        // if (clockmode === 0) {
        //     addshowtime('clock', clocktime, 2, 0, 'hh:nn ss', 1); //0 = dont show am/pm/24hr, 1 = show am/pm, 2 = show 24hr
        // } else {
        //     addshowtime('clock', clocktime, 2, 0, 'hh:nn ss', 2);
        // }
        //showtime();
        //onbutton(0, setclockdst);
        //onbutton(1, setclockmode);
        //onbutton(3, setclock);
        showclock();
    }

    api.hide = function() {
        //kill showdate
        //kill showtime
        removeshowtime('clock');
        //clear some things
        display('am', 0);
        display('pm', 0);
        display('24hr', 0);
        display('dst', 0);

        onbutton(0, null);
        onbutton(1, null);
        onbutton(3, null);
    }

    api.getclocktime = function() {
        return clocktime;
    }

    api.getclockmode = function() {
        return clockmode;
    }

    return api;
})();

var alarm_mode = (function() {

    let alarmtime = new Date(1970, 1, 1, 0, 0, 0, 0); //alarm time only use time
    let alarmset = 0;
    let alarmstatus = 0; //0 = alarm off, 1 = alarm on
    let snoozestatus = 0; //0 = alarm off, 1 = alarm on
    let chimestatus = 0; //hourly chime 0 = off, 1 = on

    function showstatus() {
        display('alarm', alarmstatus);
        display('snooze', snoozestatus);
        display('chime', chimestatus);
    }

    function showtime() {
        addshowtime('alarmtime', alarmtime, 2, 0, 'hh:nn', 0);
    }

    function showalarm() {
        print(0, 7, 'CHIME&gt;');
        print(3, 7, 'ALARM&gt;');
        print(0, 0, '&lt;SET ');
        showstatus();
        showtime();
        onbutton(0, setalarmchime);
        onbutton(1, setalarmstatus);
        onbutton(3, setalarm);
    }

    function setalarmchime() {
        if (chimestatus === 0) {
            chimestatus = 1;
        } else {
            chimestatus = 0;
        }
        showstatus();
    }

    function setalarmstatus() {
        if (alarmstatus === 0) {
            alarmstatus = 1;
        } else {
            alarmstatus = 0;
        }
        showstatus();
    }

    //Clock setting

    function showsetalarm() {
        switch (alarmset) {
            case 1:
                addshowtime('alarmtime', alarmtime, 2, 0, 'HH:nn', clock_mode.getclockmode());
                break;
            case 2:
                addshowtime('alarmtime', alarmtime, 2, 0, 'hh:NN', clock_mode.getclockmode());
                break;
        }
    }

    function setalarm() {
        if (alarmset === 0) {
            print(0, 7, '  INC&gt;');
            print(3, 7, ' NEXT&gt;');
            print(0, 0, '&lt;DONE');

            onbutton(0, setalarminc);
            onbutton(1, setalarmadv);
    
            snoozestatus = 0; //might need to be redisplayed

            setalarmadv();
        } else {
            alarmstatus = 1;

            showalarm();

            alarmset = 0;
        }
    }

    function setalarmadv() {
        if (alarmset === 2) {
            alarmset = 1;
        } else {
            alarmset = alarmset + 1;
        }
        showsetalarm();
    }

    function setalarminc() {
        if (alarmset === 1) {
            //hours
            if (alarmtime.getHours() === 23) {
                alarmtime.setHours(0);
            } else {
                alarmtime.setHours(alarmtime.getHours() + 1);
            }
        } else if (alarmset === 2) {
            //minutes
            if (alarmtime.getMinutes() === 59) {
                alarmtime.setMinutes(0);
            } else {
                alarmtime.setMinutes(alarmtime.getMinutes() + 1);
            }
        }
    }

    let api = {};

    api.init = function () {
        //show alarm status as stays on screen at all time
        showstatus();
    };

    api.show = function() {
        clear();
        print(3, 0, '&lt;MODE');

        print(1, 0, 'ALM');
        //Show time
        addshowtime('alarmclock', clock_mode.getclocktime(), 1, 5, 'hh:nn', clock_mode.getclockmode());

        showalarm();
    }

    api.hide = function() {
        
        if (alarmstatus !== 0) {
            setalarm();
        }

        removeshowtime('alarmclock');

        removeshowtime('alarmtime');
        //clear some things
        display('am', 0);
        display('pm', 0);
        display('24hr', 0);

        onbutton(0, null);
        onbutton(1, null);
        onbutton(3, null);

    }

    return api;
})();

var stopwatch_mode = (function() {

    let stopwatchtime = new Date(1970, 1, 1, 0, 0, 0, 0); //stopwatch (time only)
    let stopwatchstatus = 0; //0 = stopwatch stopped, 1 = stopwatch running
    let splittime = new Date(1970, 1, 1, 0, 0, 0, 0); //lap time (time only)
    let splitstatus = 0; //0 = lap in active, 1 = lap active

    function reset() {
        if (stopwatchstatus === 0) {
            //reset it
            stopwatchtime = new Date(1970, 1, 1, 0, 0, 0, 0);
            showtime();
            splitstatus = 0;
            removeshowtime('stopwatchsplit');
        } else {
            if (splitstatus === 0) {
                splittime = new Date(stopwatchtime.getTime());
                splitstatus = 1;
                addshowtime('stopwatchsplit', splittime, 1, 0, 'nn:ss.ff', 0);
            } else {
                splitstatus = 0;
                removeshowtime('stopwatchsplit');
            }
        }
    }

    function changestatus() {
        if (stopwatchstatus === 0) {
            stopwatchstatus = 1;
        } else {
            stopwatchstatus = 0;
        }
        addclock('stopwatch', stopwatchtime, stopwatchstatus);
        showtime();
    }

    function showstatus() {
        if (stopwatchstatus === 0) {
            print(0, 7, 'START&gt;');
            print(3, 7, 'RESET&gt;');
        } else {
            print(0, 7, ' STOP&gt;');
            print(3, 7, 'SPLIT&gt;');
        }
    }

    function showtime() {
        addshowtime('stopwatch', stopwatchtime, 2, 0, 'nn:ss.ff', 0);
        //addshowtime('stopwatchms', stopwatchtime, 1, 8, 'ff', 0);
        showstatus();
    }

    let api = {};

    api.init = function() {
        addclock('stopwatch', stopwatchtime, 0);
    }

    api.show = function() {
        clear();
        print(3, 0, '&lt;MODE');
        //print(0, 7, 'SPLIT&gt;');
        //print(3, 8, 'START OR STOP&gt;');
        // addshowdate('clock', clocktime, 1, 0, 'DDD dd MMM');
        // if (clockmode === 0) {
        //     addshowtime('clock', clocktime, 2, 0, 'hh:nn ss', 1); //0 = dont show am/pm/24hr, 1 = show am/pm, 2 = show 24hr
        // } else {
        //     addshowtime('clock', clocktime, 2, 0, 'hh:nn ss', 2);
        // }
        //showstatus();
        showtime();
        onbutton(0, changestatus);
        onbutton(1, reset);
    }

    api.hide = function() {
        removeshowtime('stopwatch');
        //removeshowtime('stopwatchms');
    }

    return api;
})();

var timer_mode = (function() {

    let timertime = new Date(1970, 1, 1, 0, 0, 0, 0); //stopwatch (time only)
    let timerstatus = 0; //0 = stopwatch stopped, 1 = stopwatch running

    let api = {};

    api.init = function() {

    }

    api.show = function() {
        clear();
        print(3, 0, '&lt;MODE');
        print(1, 0, 'TIMER');
        print(2, 0, 'TODO');
        //showtime();
        //onbutton(0, changestatus);
        //onbutton(1, reset);
    }

    api.hide = function() {
        removeshowtime('timer');
    }

    return api;
})();

var dualtime_mode = (function() {

    let dualtime = new Date(1970, 1, 1, 0, 0, 0, 0); //stopwatch (time only)
    let dualdst = 0; //0 DST off, 1 = DST on

    let api = {};

    api.init = function() {

    }

    api.show = function() {
        clear();
        print(3, 0, '&lt;MODE');
        print(1, 0, 'DUALTIME');
        print(2, 0, 'TODO');
    }

    api.hide = function() {
        
    }

    return api;
})();










let mode = -1; //0 = clock, 1 = alarm, 2 = stopwatch, 3 = timer, 4 = dual

//Initialise
clock_mode.init();
alarm_mode.init();
//etc

onbutton(2, changemode);

changemode();

function changemode() {

    switch (mode) {
        case 0:
            clock_mode.hide();
            break;
        case 1:
            alarm_mode.hide();
            break;
        case 2:
            stopwatch_mode.hide();
            break;
        case 3:
            timer_mode.hide();
            break;
        case 4:
            dualtime_mode.hide();
            break;
    }

    if (mode &lt; 4) {
        mode++;
    } else {
        mode = 0;
    }

    switch (mode) {
        case 0:
            clock_mode.show();
            break;
        case 1:
            alarm_mode.show();
            break;
        case 2:
            stopwatch_mode.show();
            break;
        case 3:
            timer_mode.show();
            break;
        case 4:
            dualtime_mode.show();
            break;
    }
}

&lt;/script&gt;


&lt;h2&gt;Proposed/Example Command reference&lt;/h2&gt;
&lt;p&gt;LET / CONST / VAR&lt;br&gt;
Use these JavaScript commands to declare variables&lt;/p&gt;
&lt;p&gt;ADDSHOWDATE(name, datetimevalue, row, column, format)&lt;br&gt;
Shows a date on the specified row, starting at the specified column, in the specified format.&lt;/p&gt;
&lt;p&gt;ADDSHOWTIME(name, datetimevalue, row, column, format, clockmode)&lt;br&gt;
Shows a time on the specified row, starting at the specified column, in the specified format, with am/pm/24 hour indicator, and update when the time or date changes.&lt;br&gt;
Formatting string allows you to control what parts of dates and times are shown, how many digits, and whether they should flash or not (useful for a set mode).&lt;/p&gt;
&lt;p&gt;REMOVESHOWTIME(name)&lt;br&gt;
Stop showing and updating a time previously set with SHOWTIME.&lt;/p&gt;
&lt;p&gt;PRINT(row, col, stringvalue)&lt;br&gt;
Prints alphanumeric characters on the specified row starting at the specified column.&lt;/p&gt;
&lt;p&gt;ONBUTTON(buttonnum, handler)&lt;br&gt;
When a button is pressed (numbered 0 to 3 clockwise) call the specified handler function.&lt;/p&gt;
&lt;p&gt;ONTICK(name, handler)&lt;br&gt;
Add an event handler function that will be called every second. Set handler to NULL to stop event handling.&lt;/p&gt;
&lt;p&gt;ADDCLOCK(name, datetimevalue, increment)&lt;br&gt;
Add a datetime object that the watch will automatically increment based on the specific increment. The normal clock and stopwatch would typically increment by 1 second, a countdown timer would increment by -1 seconds.&lt;/p&gt;
&lt;p&gt;REMOVECLOCK(name)&lt;br&gt;
Remove a clock from being updated by the watch.&lt;/p&gt;
&lt;p&gt;CLEAR(row = NULL)&lt;br&gt;
Clear the screen or a specific row.&lt;/p&gt;
&lt;p&gt;DISPLAY(icon, status)&lt;br&gt;
Show or hide one of the built-in icons (am, pm, 24hr, dst, alarm, snooze, chime).&lt;/p&gt;
&lt;p&gt;DATE FUNCTIONS&lt;/p&gt;
&lt;p&gt;I added a couple of my own functions, but for this POC I am mostly using JavaScript date object functions.&lt;/p&gt;
&lt;p&gt;SETDATE()&lt;br&gt;
SETTIME()&lt;/p&gt;
&lt;p&gt;GETHOURS()&lt;br&gt;
GETMINUTES()&lt;br&gt;
GETSECONDS()&lt;br&gt;
GETMILLISECONDS()&lt;br&gt;
GETYEAR()&lt;br&gt;
GETMONTH()&lt;br&gt;
GETDATE()&lt;br&gt;
GETDAY()&lt;/p&gt;
&lt;p&gt;SETHOURS()&lt;br&gt;
SETMINUTES()&lt;br&gt;
SETSECONDS()&lt;br&gt;
SETMILLISECONDS()&lt;br&gt;
SETYEAR()&lt;br&gt;
SETMONTH()&lt;br&gt;
SETDATE()&lt;br&gt;
SETDAY()&lt;/p&gt;
&lt;h2&gt;TODO&lt;/h2&gt;
&lt;p&gt;I need to add a function to sound a chime or alarm, and possibly handle stopping an alarm rather than make the programmer handle this.&lt;/p&gt;
&lt;p&gt;It would be nice to be able to develop games for the watch so that would need the ability to display graphics, play sounds, and have an event handler quicker than every second.&lt;/p&gt;
</description>
<comments>https://johna.compoutpost.com/blog/1346/another-pointless-project-the-programmable-digital-watch/#comments</comments>
<pubDate>2025-01-20T12:00:00+10:00</pubDate>
<category>Electronics</category>
<category>Web Development</category>
<image>https://johna.compoutpost.com/blog/uploads/img1346_programmable-digital-watch-project.jpg</image>
<guid>https://johna.compoutpost.com/blog/1346</guid>
</item>
<item>
<title>Radio Shack digital calculator/databank watches history</title>
<link>https://johna.compoutpost.com/blog/1345/radio-shack-digital-calculator-databank-watches-history/</link>
<description>&lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;col-sm-9&quot;&gt;
&lt;h2&gt;Micronta 63-5054&lt;/h2&gt;
&lt;p&gt;Eight-digit 4-function calculator, mineral lens, dual time, calendar, 1/100 second stopwatch with lap time, 24-hour alarm&lt;/p&gt;
&lt;p&gt;1983 - $39.95&lt;br&gt;
1984 - $31.95&lt;br&gt;
1985 - $19.95&lt;br&gt;
1986 - $15.95&lt;br&gt;
1987 - $12.95&lt;br&gt;
1988 - $12.95&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col-sm-3&quot;&gt;
&lt;a href=&quot;/blog/uploads/img1345_micronta-63-5054.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Micronta 63-5054&quot; src=&quot;/blog/thumb/img1345_micronta-63-5054_md.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;col-sm-9&quot;&gt;
&lt;h2&gt;Micronta 63-5060&lt;/h2&gt;
&lt;p&gt;Phone directory/calculator watch. Stores 40 phone numbers. Recall by entering party's name. Full-function calculator, calendar, 12/24-hour display&lt;/p&gt;
&lt;p&gt;1985 - $29.95&lt;br&gt;
1986 - $24.95&lt;br&gt;
1987 - $24.95&lt;br&gt;
1988 - $24.95&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col-sm-3&quot;&gt;
&lt;a href=&quot;/blog/uploads/img1345_micronta-63-5060.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Micronta 63-5060&quot; src=&quot;/blog/thumb/img1345_micronta-63-5060_md.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;col-sm-9&quot;&gt;
&lt;h2&gt;Micronta 63-5062&lt;/h2&gt;
&lt;p&gt;LCD calculator/alarm. Features 24-hour alarm, 4-function 8-digit calculator, autocalendar, stainless-steel band, with RS CD2032 battery&lt;/p&gt;
&lt;p&gt;1989 - $12.95&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col-sm-3&quot;&gt;
&lt;a href=&quot;/blog/uploads/img1345_micronta-63-5062.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Micronta 63-5062&quot; src=&quot;/blog/thumb/img1345_micronta-63-5062_md.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;col-sm-9&quot;&gt;
&lt;h2&gt;Micronta 63-5059&lt;/h2&gt;
&lt;p&gt;LCD calculator watch. LCD displays time./date. Has travel alarm. With RS 389 battery.&lt;/p&gt;
&lt;p&gt;1990 - $12.95&lt;br&gt;
1991 - $12.95&lt;br&gt;
1992 - $12.95&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col-sm-3&quot;&gt;
&lt;a href=&quot;/blog/uploads/img1345_micronta-63-5059.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Micronta 63-5059&quot; src=&quot;/blog/thumb/img1345_micronta-63-5059_md.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;col-sm-9&quot;&gt;
&lt;h2&gt;Micronta 63-5071&lt;/h2&gt;
&lt;p&gt;LCD calculator watch. LCD shows time/date. 24-hour travel alarm. Features 4-function 8-digital calculator. With RS389 battery.&lt;/p&gt;
&lt;p&gt;1993 - $12.95&lt;br&gt;
1994 - $12.99&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col-sm-3&quot;&gt;
&lt;a href=&quot;/blog/uploads/img1345_micronta-63-5071.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Micronta 63-5071&quot; src=&quot;/blog/thumb/img1345_micronta-63-5071_md.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;col-sm-9&quot;&gt;
&lt;h2&gt;Radio Shack 63-5021&lt;/h2&gt;
&lt;p&gt;8-digit caclulator, alarm, hourly chime, calendar, timer. Includes battery&lt;br&gt;
Available Oct 30, 1994&lt;/p&gt;
&lt;p&gt;1995 - $14.99&lt;br&gt;
1996 - $14.99&lt;br&gt;
1997 - $14.99&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col-sm-3&quot;&gt;
&lt;a href=&quot;/blog/uploads/img1345_radio-shack-63-5021.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Radio Shack 63-5021&quot; src=&quot;/blog/thumb/img1345_radio-shack-63-5021_md.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;From the 1996 catalogue, Casio calculators were added to the range. These are not covered on this page.&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;col-sm-9&quot;&gt;
&lt;h2&gt;Radio Shack 63-5087&lt;/h2&gt;
&lt;p&gt;New alarm watch with data bank. Stores namesd and phone numbers. Also has calculator, stopwatch, four alarms, would time clock, dual time&lt;/p&gt;
&lt;p&gt;1996 - $29.99&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col-sm-3&quot;&gt;
&lt;a href=&quot;/blog/uploads/img1345_radio-shack-63-5087.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Radio Shack 63-5087&quot; src=&quot;/blog/thumb/img1345_radio-shack-63-5087_md.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;col-sm-9&quot;&gt;
&lt;h2&gt;Radio Shack 63-5085&lt;/h2&gt;
&lt;p&gt;New flip-top watch with calculator. More features than meet the eye. A stylish and classic analog watch on top with an 8-digit calcutor, digitsal watch and stopwatch hidden udnerneath. Handy bulit-in alarm helps keep you on time. Hourly chime, month/day/date calendar&lt;/p&gt;
&lt;p&gt;1996 - $27.99&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col-sm-3&quot;&gt;
&lt;a href=&quot;/blog/uploads/img1345_radio-shack-63-5085.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Radio Shack 63-5085&quot; src=&quot;/blog/thumb/img1345_radio-shack-63-5085_md.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</description>
<comments>https://johna.compoutpost.com/blog/1345/radio-shack-digital-calculator-databank-watches-history/#comments</comments>
<pubDate>2025-01-09T12:00:00+10:00</pubDate>
<category>Electronics</category>
<category>Retro</category>
<image>https://johna.compoutpost.com/blog/uploads/img1345_micronta-63-5054.jpg</image>
<guid>https://johna.compoutpost.com/blog/1345</guid>
</item>
<item>
<title>Vintage clock/radios and my Soundesign 3834-A</title>
<link>https://johna.compoutpost.com/blog/1344/vintage-clock-radios-and-my-soundesign-3834-a/</link>
<description>As a child in Australia in the 1980s, I was always interested in technology including video games, computers, watches and audio/visual equipment.&lt;br&gt;&lt;br&gt;In the early 1980s, when I was about 12, I went with my family for a holiday to the USA, and one of the things I wanted to get when I was there was an interesting clock/radio.&lt;br&gt;&lt;br&gt;One of the first places we stopped at was New York City and it wasn't long before I convinced the family to look in some electronics stores and came across this most amazing clock/radio: the Soundesign 3834-A.&lt;br&gt;&lt;br&gt;This looked like it belonged on a spacecraft, with many buttons and a sleep horizontal design with angled display for the time and tuner.&lt;br&gt;&lt;br&gt;Unlike most clock/radios, this one also had a cassette recorder with built-in microphone.&lt;br&gt;&lt;br&gt;I convinced my father to buy it and brought it back to Australia where we discovered that we needed an expensive USA to Australia (110V to 240V) power converter.&lt;br&gt;&lt;br&gt;But once up and running, I loved this clock/radio for many years, although I can't recall whatever happened to it.&lt;br&gt;&lt;br&gt;Note that the photos are not mine and are from a USA eBay listing.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1344_soundesign-3834-a-1.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Soundesign 3834-A&quot; src=&quot;/blog/uploads/img1344_soundesign-3834-a-1.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1344_soundesign-3834-a-2.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Soundesign 3834-A&quot; src=&quot;/blog/uploads/img1344_soundesign-3834-a-2.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;</description>
<comments>https://johna.compoutpost.com/blog/1344/vintage-clock-radios-and-my-soundesign-3834-a/#comments</comments>
<pubDate>2025-01-07T12:00:00+10:00</pubDate>
<category>Electronics</category>
<category>Retro</category>
<image>https://johna.compoutpost.com/blog/uploads/img1344_soundesign-3834-a-1.jpg</image>
<guid>https://johna.compoutpost.com/blog/1344</guid>
</item>
<item>
<title>Vintage watches and my Radio Shack 63-5087 Multifunction Watch</title>
<link>https://johna.compoutpost.com/blog/1343/radio-shack-63-5087-multifunction-watch/</link>
<description>&lt;!--&lt;img alt=&quot;Radio Shack 63-5087 (rear)&quot; src=&quot;/blog/uploads/img1343_radio-shack-63-5087-front.jpg&quot; /&gt;--!&gt;As a child in the 1980s I loved all sorts of technology including watches. I liked digital watches in particular, the more features the better.&lt;br&gt;&lt;br&gt;I had many watches, although I can't remember many of them now, but I recall at least two calculator watches and some others.&lt;br&gt;&lt;br&gt;I do remember the Casio solar-powered WL-10 that I had in the 1990s. I actually found this recently and although it still worked the screen was damaged and for some reason I sold it on eBay rather then keeping it, as I wish I had done now.&lt;br&gt;&lt;br&gt;In addition to the usual digital watch functions, it also had five alarms.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;text-center&quot;&gt;&lt;a href=&quot;/blog/uploads/img1343_casio-wl-10.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Casio WL-10&quot; src=&quot;/blog/thumb/img1343_casio-wl-10_md.jpg&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;small&gt;(Not my photo)&lt;/small&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;But I do still have a Radio Shack 63-5087 data bank and calculator watch which was given to me as a gift by my then girlfriend, now wife, back in the 1990s.&lt;br&gt;&lt;br&gt;It has a two line display with the day, date and month at the top, and the time including seconds on the larger second line.&lt;br&gt;&lt;br&gt;Features include a calculator, data bank, four alarms, world time and stop watch.&lt;br&gt;&lt;br&gt;Battery is a CR2016.&lt;br&gt;&lt;br&gt;Mine has been stored for many years and when I found it recently I wanted to put it back in service.&lt;br&gt;&lt;br&gt;Unfortunately, in addition to scratches, bumps and scrapes, the strap had disintegrated. I found a 16mm strap on Aliexpress but, being only a 20mm wide band, it looks strange and it also needed some cutting to make it fit. I also tried a couple of other straps but none fitted well and I am trying to find a better one.&lt;br&gt;&lt;br&gt;The screws on the back of the case had corroded a little and one broke off. Many of the other screws are stripped, including the one that secures the battery.&lt;br&gt;&lt;br&gt;Fortunately, it still works and the date defaults to 1988.&lt;br&gt;&lt;br&gt;I couldn't find it in a Tandy Australia catalogue, but I did find the watch in a &lt;a href=&quot;https://www.radioshackcatalogs.com/flipbook/1996_radioshack_catalog.html&quot; target=&quot;_blank&quot;&gt;1996 Radio Shack catalog&lt;/a&gt; from the US.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1343_radio-shack-63-5087-front.jpg&quot;&gt;&lt;img alt=&quot;Radio Shack 63-5087&quot; src=&quot;/blog/uploads/img1343_radio-shack-63-5087-front.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1343_radio-shack-63-5087-rear.jpg&quot;&gt;&lt;img alt=&quot;Radio Shack 63-5087 (rear)&quot; src=&quot;/blog/uploads/img1343_radio-shack-63-5087-rear.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1343_tandy-1996-catalog-watches-excerpt.jpg&quot;&gt;&lt;img alt=&quot;Tandy 1996 catalog (watches excerpt)jpg&quot; src=&quot;/blog/uploads/img1343_tandy-1996-catalog-watches-excerpt.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;br&gt;&lt;br&gt;II tried a few watch straps and the one that suits the 63-5087 is one for the Casio W800H. There are a few versions of this strap but the one to look for is the one that is 18mm/24mm wide (some are 18mm/22mm).&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/img1343_radio-shack-63-5087-strap.jpg&quot;&gt;&lt;img alt=&quot;Radio Shack 63-5087 replacement strap&quot; src=&quot;/blog/uploads/img1343_radio-shack-63-5087-strap.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;</description>
<comments>https://johna.compoutpost.com/blog/1343/radio-shack-63-5087-multifunction-watch/#comments</comments>
<pubDate>2024-12-22T12:00:00+10:00</pubDate>
<category>Electronics</category>
<category>Retro</category>
<image>https://johna.compoutpost.com/blog/uploads/img1343_radio-shack-63-5087-front.jpg</image>
<guid>https://johna.compoutpost.com/blog/1343</guid>
</item>
<item>
<title>Ozito PRG-632VK Plunge Router User Manual</title>
<link>https://johna.compoutpost.com/blog/1341/ozito-prg-632vk-plunge-router-user-manual/</link>
<description>&lt;h2&gt;Ozito Plunge Router Model No. PRG-632VK Operating Instructions.&lt;/h2&gt;&lt;br&gt;&lt;h3&gt;Specifications&lt;/h3&gt;&lt;br&gt;Motor size: 1200W&lt;br&gt;Input: 230V - 50Hz&lt;br&gt;No load speed: 16,000 - 34,000 rpm&lt;br&gt;Collet size: 6.35mm (1/4&quot;)&lt;br&gt;Plunge depth: 42mm&lt;br&gt;Features:&lt;br&gt;Variable speed&lt;br&gt;Spindle lock&lt;br&gt;Lock off switch&lt;br&gt;12 TCT router bits included&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/att1341_PRG-632VK IM FA.pdf&quot;&gt;&lt;img alt=&quot;ozito-prg-632vk-plunge-router-operating-instructions.jpg&quot; src=&quot;/blog/uploads/img1341_ozito-prg-632vk-plunge-router-operating-instructions.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;/a&gt;</description>
<comments>https://johna.compoutpost.com/blog/1341/ozito-prg-632vk-plunge-router-user-manual/#comments</comments>
<pubDate>2024-11-22T12:00:00+10:00</pubDate>
<category>Electronics</category>
<image>https://johna.compoutpost.com/blog/uploads/img1341_ozito-prg-632vk-plunge-router-operating-instructions.jpg</image>
<guid>https://johna.compoutpost.com/blog/1341</guid>
</item>
<item>
<title>Sony KDL-32NX650 error 2200 and firmware updates</title>
<link>https://johna.compoutpost.com/blog/1330/sony-kdl-32nx650-error-2200-and-firmware-updates/</link>
<description>&lt;img alt=&quot;Sony KDL-40EX650 TV&quot; src=&quot;/blog/thumb/img1330_Sony-KDL-40EX650-40-Full-HD-Wi-Fi-Black-0_lg.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;br&gt;&lt;br&gt;I picked up a second hand Sony KDL-32NX650 television and was hoping to use the built-in Internet functionality to watch YouTube and other online streaming services.&lt;br&gt;&lt;br&gt;Unfortunately when trying to use any of the Internet services it showed error 2200, which indicates an Internet connectivity issue.&lt;br&gt;&lt;br&gt;I checked Sony's website and saw that the firmware version my TV has was older than the latest version and the newer version supported new Internet security protocols which was likely the cause of the issues.&lt;br&gt;&lt;br&gt;Unfortunately Sony had stopped automatic updates as of 2021 and when I asked for the latest version by email they said they wouldn't help.&lt;br&gt;&lt;br&gt;I searched the Internet and did manage to find a copy of the latest firmware, which is from 2014.&lt;br&gt;&lt;br&gt;After updating, the TV was able to connect to the Internet, but only provides ABC and a couple of other streaming services, some of which did not work. Most of the online applications, including the web browser, also did not work.&lt;br&gt;&lt;br&gt;It's a shame and a sign of the times that a perfectly fine twelve year TV is no longer supported, but it's still useful to me and by adding a Google TV or other device can still do streaming.&lt;br&gt;&lt;br&gt;The latest version of the firmware for this TV, and various similar models, is PKG2.120. The version I have for download here is for Australian models.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/att1330_sony_tvupdate_2012_2120_gaa_auth.zip&quot;&gt;sony_tvupdate_2012_2120_gaa_auth.zip&lt;/a&gt;&lt;br&gt;&lt;br&gt;To install, download the ZIP file and unzip it, then copy the folder named sony_dtv0FA20A02A0A2_00001201 to a USB device. It's important that the folder be in the root of the USB device otherwise the TV won't recognise it. Then turn on the TV and insert the USB and the TV will automatically start the update and display progress information on screen. At one point the TV will switch off and then turn back on by itself, so don't be alarmed if you see this.&lt;br&gt;</description>
<comments>https://johna.compoutpost.com/blog/1330/sony-kdl-32nx650-error-2200-and-firmware-updates/#comments</comments>
<pubDate>2024-07-23T12:00:00+10:00</pubDate>
<category>Electronics</category>
<image>https://johna.compoutpost.com/blog/uploads/img1330_Sony-KDL-40EX650-40-Full-HD-Wi-Fi-Black-0.jpg</image>
<guid>https://johna.compoutpost.com/blog/1330</guid>
</item>
<item>
<title>UL-TECH AHD Security Camera System Quick Installation Guide</title>
<link>https://johna.compoutpost.com/blog/1305/ul-tech-ahd-security-camera-system-quick-installation-guide/</link>
<description>Use the following link to download the Quick Installation Guide for UL-TECH AHD Security Camera Systems.&lt;br&gt;&lt;br&gt;(PDF, 13.5MB)&lt;br&gt;&lt;br&gt;&lt;a href=&quot;/blog/uploads/att1305_ul-tech-ahd-security-camera-system-quick-installation-guide.pdf&quot;&gt;ul-tech-ahd-security-camera-system-quick-installation-guide.pdf&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;img alt=&quot;UL-TECH DVR&quot; src=&quot;/blog/uploads/img1305_ul-tech-dvr.jpg&quot; class=&quot;img-fluid&quot; /&gt;</description>
<comments>https://johna.compoutpost.com/blog/1305/ul-tech-ahd-security-camera-system-quick-installation-guide/#comments</comments>
<pubDate>2023-05-18T12:00:00+10:00</pubDate>
<category>Electronics</category>
<image>https://johna.compoutpost.com/blog/uploads/img1305_ul-tech-dvr.jpg</image>
<guid>https://johna.compoutpost.com/blog/1305</guid>
</item>
<item>
<title>Tips and tricks for your UL-TECH DVR</title>
<link>https://johna.compoutpost.com/blog/1278/tips-and-tricks-for-your-ul-tech-dvr/</link>
<description>&lt;img alt=&quot;&quot; src=&quot;/blog/uploads/img1278_ul-tech-dvr.jpg&quot; class=&quot;img-fluid&quot; /&gt;&lt;br&gt;&lt;br&gt;These UL-TECH digital video recorders for security cameras are available cheaply on eBay, Amazon, etc but there are some extra features not mentioned in the instruction manuals.&lt;br&gt;&lt;br&gt;I have model CCTV-4C-4S-BK but these tips should apply to all models that look the same.&lt;br&gt;&lt;br&gt;Note that there are two versions of these DVRs that look the same, but have different firmware. The change over happened some time after 2023.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Desktop Application&lt;/h2&gt;&lt;br&gt;Note that there are at least two major versions of these DVRs. Early versions require Internet Explorer but later versions work in most browsers on Microsoft Windows.&lt;br&gt;&lt;br&gt;&lt;h3&gt;Early Versions&lt;/h3&gt;&lt;br&gt;The DVR has an application that mimics the functionality of the menus and controls that you use on the device itself.&lt;br&gt;&lt;br&gt;Unfortunately, it is an ActiveX application which means it can only be used on the outdated Internet Explorer browser.&lt;br&gt;&lt;br&gt;To access the application, open Internet Explorer and navigate to the IP address of your DVR. For example, type &quot;192.168.20.112&quot; in the address bar and press enter.&lt;br&gt;&lt;br&gt;You will need to enable unsigned ActiveX controls in Internet Explorer's options &gt; security &gt; custom level settings.&lt;br&gt;&lt;br&gt;If you want to download files from playback you will also need to run Internet Explorer as administrator.&lt;br&gt;&lt;br&gt;Update: In a recent Windows update, Internet Explorer will no longer work and instead try and open the application in Microsoft Edge. The application will work in Edge if you configure the application to load in Internet Explorer mode. This can be done by going into Edge's settings, going to the 'Default browser' settings and adding an 'Internet Explorer mode page'. Then you can enter the address of your DVR, eg. 'http://192.168.0.100/'. Note that these annoyingly expire every 30 days so will need to be added again and again as needed. I have been unable to save video files when using Edge, even when run as administrator.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Update Feb 2024: The download link for the desktop application (http://www.topslink.net/TSWebClient_EN_SetUp.exe) that appears when you first try and access it is no longer working. You can download &lt;a href=&quot;/blog/uploads/att1278_TSWebClient_EN_SetUp.exe&quot;&gt;TSWebClient_EN_SetUp.exe&lt;/a&gt; from here.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;&lt;div class=&quot;text-center&quot;&gt;&lt;a href=&quot;/blog/uploads/img1278_ul-tech-desktop-application.JPG&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/blog/thumb/img1278_ul-tech-desktop-application_sm.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;h3&gt;Later Versions&lt;/h3&gt;&lt;br&gt;To access the application, open your preferred browser and navigate to the IP address of your DVR. For example, type &quot;192.168.20.112&quot; in the address bar and press enter.&lt;br&gt;&lt;br&gt;You should then see a log-in page but don't log-in yet. Click the Download ActiveX link next to the Login button and download then open the downloaded file to install the desktop application.&lt;br&gt;&lt;br&gt;Once installed, you can then log-in and use the desktop application.&lt;br&gt;&lt;br&gt;If you get the error message &quot;&lt;em&gt;the program can't start because msvcp140.dll is missing&lt;/em&gt;&quot; during installation you will need to install Visual C++ redistributables. Go to the &lt;a href=&quot;https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads&quot;&gt;Microsoft support page&lt;/a&gt; and locate the download links on the page. You will need to download and install the X86 version even if you have a 64-bit version of Windows.&lt;br&gt;&lt;br&gt;You can then run again the ActiveX installation which will then uninstall the last attempt and then install again.&lt;br&gt;&lt;br&gt;If you get the same error again then you might need the X64 version of the Visual C++ redistributables too.&lt;br&gt;&lt;br&gt;&lt;b&gt;Updated for Windows 11 (Feb 2026):&lt;br&gt;If the web client opens in Google Chrome but it is not possible to see any live or playback video, then you may need to change a setting in Google Chrome.&lt;br&gt;IN the address bar type &lt;kbd&gt;chrome://flags&lt;/kbd&gt;. In the search box search for &quot;Choose ANGLE graphics backend&quot;. Change the setting from &quot;Default&quot; to &quot;D3D9&quot; or &quot;OpenGL&quot;. Press the button to relaunch Chrome. This setting may also exist in other browsers including Microsoft Edge.&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;div class=&quot;text-center&quot;&gt;&lt;a href=&quot;/blog/uploads/img1278_ul-tech-dvr-desktop-application-later-versions.JPG&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;UL-Tech DVR desktop application (later versions)&quot; src=&quot;/blog/thumb/img1278_ul-tech-dvr-desktop-application-later-versions_sm.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;IP Cam Viewer Lite&lt;/h2&gt;&lt;br&gt;&lt;h3&gt;Early Versions&lt;/h3&gt;&lt;br&gt;If you don't want to use UL-TECH's cloud-based service then you can use an app like &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.rcreations.ipcamviewer&amp;hl=en_AU&amp;gl=US&quot; target=&quot;_blank&quot;&gt;IP Cam Viewer Lite&lt;/a&gt; to view the live feed from your DVR.&lt;br&gt;&lt;br&gt;IP Cam Viewer Lite doesn't have an option for any UL-TECH devices but I found that the device &quot;HISUNG 3016B DVR W/ RTSP Port&quot; worked fine with the default settings.&lt;br&gt;&lt;br&gt;To use this from outside of your own local network you will need to follow the instructions below for &lt;b&gt;external access setup&lt;/b&gt;.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;text-center&quot;&gt;&lt;a href=&quot;/blog/uploads/img1278_Screenshot_20220130-083235.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/blog/thumb/img1278_Screenshot_20220130-083235_sm.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;h3&gt;Later Versions&lt;/h3&gt;&lt;br&gt;To use IP Cam Viewer Lite with later models select the make &quot;Generic URL&quot; and model &quot;Generic RTSP over TCP&quot;.&lt;br&gt;&lt;br&gt;For the URL enter the following, substituting your IP address or domain name if you have one, and specifying the camera number as the channel, and which stream you wish to use (0 for high quality, 1 for low quality):&lt;br&gt;&lt;br&gt;&lt;pre&gt;rtsp://192.168.20.113:554/avstream/channel=1/stream=0.sdp&lt;/pre&gt;&lt;br&gt;You will also need to enter a valid user name and password.&lt;br&gt;&lt;br&gt;To use this from outside of your own local network you will need to follow the instructions below for &lt;b&gt;external access setup&lt;/b&gt;.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;text-center&quot;&gt;&lt;a href=&quot;/blog/uploads/img1278_Screenshot_20250418-132916.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;UL-Tech IP Cam Viewer Lite setup&quot; src=&quot;/blog/thumb/img1278_Screenshot_20250418-132916_sm.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;strong&gt;Update:&lt;/strong&gt; IP Cam Viewer Lite has stopped working for me and just shuts down immediately when I try and access my cameras. I have now switched to &lt;em&gt;Onvier - IP Camera Monitor&lt;/em&gt; by &lt;em&gt;Biyee SciTech, Inc&lt;/em&gt;. Set up is similar. Add a new &quot;Generic RTSP&quot; device with the same URL as the other app above and add your username and password.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Local network set up&lt;/h2&gt;&lt;br&gt;By default the DVR is configured to automatically connect to your local network and your network (usually a modem/router) will assign it an IP address.&lt;br&gt;&lt;br&gt;But ideally you would assign a fixed IP address (and this is required if you want to set up external access from outside of your network).&lt;br&gt;&lt;br&gt;There are various ways to do this that will depend on your network set up but you would typically set an IP reservation for the DVR in your modem/router's LAN settings.&lt;br&gt;&lt;br&gt;&lt;h2&gt;External access setup&lt;/h2&gt;&lt;br&gt;If you want to access the desktop application outside of your local area network then you will need to set up external access.&lt;br&gt;&lt;br&gt;How to do this varies based on your network setup, but you would typically need to assign the DVR a fixed IP address and then set up your modem/router's firewall or port forwarding to allow ports 80, 554 and 34567 through to the DVR.&lt;br&gt;&lt;br&gt;There are other resources that can help you with this. Just Google your brand and model of modem/router and &quot;port forwarding&quot;.&lt;br&gt;&lt;br&gt;You would also need a static IP address for your Internet service or use a dynamic DNS service such as dyndns.org.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Accounts and passwords&lt;/h2&gt;&lt;br&gt;The default admin password is blank so if you do make your DVR available externally then you should create a password.&lt;br&gt;&lt;br&gt;You may also want to create a separate account with the more limited &quot;user&quot; group restrictions (can only view live and playback) for use in IP Cam Viewer Lite or similar applications.</description>
<comments>https://johna.compoutpost.com/blog/1278/tips-and-tricks-for-your-ul-tech-dvr/#comments</comments>
<pubDate>2022-01-30T12:00:00+10:00</pubDate>
<category>Electronics</category>
<image>https://johna.compoutpost.com/blog/uploads/img1278_ul-tech-dvr.jpg</image>
<guid>https://johna.compoutpost.com/blog/1278</guid>
</item>
<item>
<title>I transported a plasma TV flat and it survived!</title>
<link>https://johna.compoutpost.com/blog/1276/i-transported-a-plasma-tv-flat-and-it-survived/</link>
<description>&lt;img alt=&quot;&quot; src=&quot;/blog/uploads/img1276_plasma-tv.png&quot; class=&quot;img-fluid&quot; /&gt;&lt;br&gt;&lt;br&gt;See that big 60-inch plasma television in the photo? I bought it and needed to transport it about 15 kilometres and I had a station wagon that would not fit the TV standing upright, but would fit it lying flat.&lt;br&gt;&lt;br&gt;I did some online research and all of the advice was do not transport a plasma or large LCD/LED TV laid flat.&lt;br&gt;&lt;br&gt;The reason is because of the large panel of glass, which is able to support itself better when upright and prone to breaking when laid flat.&lt;br&gt;&lt;br&gt;It is nothing to do with gasses or liquids settling like some people claim, and you certainly do not need to let the TV settle upright before you use it.&lt;br&gt;&lt;br&gt;While researching I found a few people who said they had actually transported a plasma TV flat, some for short distances and some for long, and no actual damage had occurred. Some mocked them and said that the probably now had at least dead pixels that they hadn't noticed yet but, no, it seemed some people had got away with this amazing damage defying act!&lt;br&gt;&lt;br&gt;So I tried to search online for cases where people had transported a plasma TV flat and it had broken. I'm not sure if it was me subconsciously not wanting to find anything, or there really was nothing to find, but I found nothing.&lt;br&gt;&lt;br&gt;Because the TV cost A$50 and any alternate &quot;safe&quot; transport would have probably cost at least the same amount I decided to give it a go. I filled the station wagon with blankets, removed the rear seat to make as flat surface as possible and picked up the TV.&lt;br&gt;&lt;br&gt;I was expecting the seller of the TV to be shocked that I would be attempting to transport the TV flat, but surprisingly he said he had done that a few times before with the TV. Should I take the stand off to make it safer? &quot;Nah.&quot;&lt;br&gt;&lt;br&gt;So we not-so-gently packed the TV into the car and I drove the 15 km to my destination and the TV survived and was plugged in and turned on straight away and it worked!&lt;br&gt;&lt;br&gt;Now every plasma TV manufacturer ever in the history of the world (I guess) specifically states in their manuals, packaging and warranty documentation that you must never transport a TV flat so please don't take this blog post as a suggestion that you should not follow the manufacturer's instructions and the advice of the kind-hearted people of the Internet who believe that the &quot;gasses&quot; in your TV need to be upright, but if you have no alternative, are lazy or cheap, or maybe just a risk-taker, then I reckon there is a good chance you can make it too!</description>
<comments>https://johna.compoutpost.com/blog/1276/i-transported-a-plasma-tv-flat-and-it-survived/#comments</comments>
<pubDate>2022-01-28T12:00:00+10:00</pubDate>
<category>Electronics</category>
<image>https://johna.compoutpost.com/blog/uploads/img1276_plasma-tv.png</image>
<guid>https://johna.compoutpost.com/blog/1276</guid>
</item>
<item>
<title>Fixing LCD Stuck Pixels, Dead Pixels and Burn-in</title>
<link>https://johna.compoutpost.com/blog/382/fixing-lcd-stuck-pixels-dead-pixels-and-burn-in/</link>
<description>A stuck pixel is a coloured dot most noticeable when the rest of the screen is black.&lt;br&gt;&lt;br&gt;A dead pixel is a black dot noticeable when the rest of the screen is white.&lt;br&gt;&lt;br&gt;Burn-in (also known as image persistence) occurs when part or all of the display stays on screen for long periods without changing.&lt;br&gt;&lt;br&gt;If you have a dead pixel then there is nothing you can do. However if you have a stuck pixel then there is a small possibility that you may be able to get it working again. LCD burn-in can also be improved (but not completely eliminated) on LCD screens.&lt;br&gt;&lt;br&gt;To try and fix these problems you can download the applet at &lt;a href=http://www.jscreenfix.com/&gt;www.jscreenfix.com&lt;/a&gt; and follow the instructions there. Note: this applet cannot be downloaded or operated if you are using Internet Explorer. Instead use &lt;a href=http://www.mozilla.com/en-US/&gt;Firefox&lt;/a&gt; or another compatible browser.&lt;br&gt;&lt;br&gt;A proper screen blanker (one that keeps all parts of the display changing reasonably frequently) is a good idea on any type of monitor.</description>
<comments>https://johna.compoutpost.com/blog/382/fixing-lcd-stuck-pixels-dead-pixels-and-burn-in/#comments</comments>
<pubDate>2008-04-23T12:00:00+10:00</pubDate>
<category>Electronics</category>
<guid>https://johna.compoutpost.com/blog/382</guid>
</item>
</channel>
</rss>
