Steve's Software Trek

Since I write software for a living, I thought I should dedicate some web space for some stuff that I have worked on. I mostly write embedded C for PC based controllers, but I have dabbled in a few other areas as well.

I switched webhosting to and they have lots of web software which can be point-n-click installed, 20 subdomains, and 6 domains on the same account. So I started blogging about software using WordPress and called the site Steve's Software Trek. How original!

My Software

The Personal Software Process (with ANSI C source code)

An object oriented elevator simulator design (with C++ source code)

compact.c - An idea for code from Circuit Cellar - Test Your EQ - programmed in C - using some extreme programming techniques. factors.c - a little program that gives the factors of a given integer.

mailto.c - Obfuscate your e-mail address to reduce the chance of a spam-bot harvesting it.

keylist.c, keylist.h, key.h - A linked list library programmed in C - using some extreme programming techniques. The linked lists are sorted by key as they are added, and can be retrieved by key, index, or FIFO. This library is useful for caching dynamic data by key, such as BACnet I-Am data for each Device Object. Of course, I updated the keylist library to use a dynamic array and binary search, so it is much faster now. I was also fascinated with embedded software ring buffers, but wanted to create a generic ring buffer library. After a couple of iterations, the Ring Buffer Library was created and includes unit tests. Unit tests not only verify the functionality of the software, but also provide examples of how to use the API.

bacenum.h - BACnet has quite a few enumerations, so I coded up a header file for C. Basically a cut and paste from the standard, and then a little cleanup to make it a C header. I also wrote the MS/TP (Master Slave/Token Passing) Data Link layer by basically doing a cut and paste from the standard - mstp.c. Am I just bored? No, I make some time in the mornings when I wake up to do things like read Slashdot, e-mail, and eat breakfast, and during Christmas 2003 vacation I wanted to see how difficult it would be to write it. It took me one morning to complete the Receive State Machine and another morning to complete the Master Node State Machine. I have it on good authority that you should implement the Master Node State Machine rather than the Slave Node. I also coded up a BACnet protocol stack for embedded devices. What are you waiting for? A protocol analyzer? Detailed BACnet protocol information is supported by the open source and cross platform protocol analyzer Ethereal since version 0.10.11.

dbuffer.c, dbuffer.h - A dynamic buffer library. dstring.c, dstring.h - a dynamic string library that relies on the GNU vasprintf function. These are nice little libraries that allow you the programmer to focus on getting the work done, and not on keeping track of a buffer and how big it is and is it big enough and have I overflowed it.

sbuf.tgz - A static buffer library. A little library that tracks the length of a buffer and prevents buffer overflows. It stores the size and length along with the pointer to the buffer, and has a couple of functions for accessing the buffer.

enumtext.c, enumtext.h - A simple library that takes a list of strings that are mapped to enumerations, and provides an easily maintainable way to get the strings when given the enumeration. Includes unit tests.

stdbool.h, stdint.h - header files that mimic the C99 standard boolean and standard integer types. Nice to use if you want to make your programs have data sizes that are portable and consistant across platorms. These are designed for the i386 protected mode architecture - size yours appropriately.

timer.c, timer.h - A timer library programmed in C for Win32 - using some extreme programming techniques. The timer is used to time things by marking the timer, and then reading back the elapsed time of the timer.

profile.c, profile.h, rmspace.c, rmspace.h, stptok.c, stptok.h - Some C code with unit tests, written using test-first extreme programming best practice, for reading and writing to INI files by simulating the Win32 API functions WritePrivateProfileString and GetPrivateProfileString (for Borland C++ or for GCC profile.tgz).

ctest.c, ctest.h, bool.h - A C test library used for unit testing.

graphics.cpp, graphics.h, and graphics.mak were written to draw primitive shapes with the SDL - Simple DirectMedia Layer library. The primitives include lines, circles, rectangles, and TTF Text.

A list of Linux Resources.

A list of Embedded Software Programming Resources.

A list of Open Source Software for Windows.


Geek Tools If you are always looking for a way to have all the external network resources that you use often, at your fingertips (and all sorts of cool tools that seem to be in different places that kept moving and disappearing as people moved around the net, from company to company), here is a website, capable of being used by any browser including LYNX, with minimal color (16) and minimal resolution (640 x 480), with no cookies, or Java. See also the Top 75 Security Tools.

Software Snippets - The SNIPPETS collection started out in the late 1980's as a personal project to collect useful snippets (hence the name) of C, and later C++, code which would be free for reuse in a personal or commercial environment. Over time, it has grown to more than 94,000 lines of code in over 700 separate files. The goal of SNIPPETS is to collect and disseminate the best C/C++ answers to "How do I...?" programming questions.

The Stellation project at IBM Research is working on developing programming environments that support collaboration between members of programming teams. is a mid-sized open source community focused on building better tools for collaborative software development. It provides information resources for software engineering professionals and students, and a home for open source software engineering tool projects, such as Subversion for software configuration management. Speaking of configuration management, the distributed nature of GNU Arch and Bazaar intrigues me.


Best of breed - my favorite cross-platform, open source applications. I use software for word processing, spreadsheet, presentation, and drawings. I use Mozilla for browsing and e-mail. I use FileZilla for FTP client and FTP server on the Win32 platform. A nice, full featured graphical text editor with syntax highlighting and many other bells and whistles is Vim, or Vi IMproved - a programmers text editor. I like a full featured graphics editing tool called the GIMP - the GNU Image Manipulation Program. If you like to play or edit sound, Audacity is a good, simple audio editor suitable for recording, mixing, and editing ordinary tracks of CD-quality audio. Games I enjoy playing are Tux Racer, BZFlag, Chromium BSU, Nethack, and Critical Mass. There are lots of games, such as Tux Paint, written using the Simple DirectMedia Layer, an open source, cross-platform multimedia library designed to provide fast access to the graphics framebuffer and audio device. An open source, cross-platform native UI framework is wxWidgets (formerly called wxWindows). I also have a list of other Open Source Software for Windows.


BACnet - dedicated to providing the latest information on BACnet - A Data Communication Protocol for Building Automation and Control Networks. Developed under the auspices of the American Society of Heating, Refrigerating and Air-Conditioning Engineers (ASHRAE), The protocol is supported and maintained by ASHRAE Standing Standard Project Committee 135. I help out on the committee, and also on the open source Visual Test Shell, an application for testing the BACnet functionality of various devices used in building automation systems. Project members are working on various enhancements to VTS as well as routine maintenance. I work on the open source BACnet for Linux project and on the embedded BACnet stack project. I also participate in the BACnet Testing Labs Working Group, and the BACnet Lighting Applications Working Group. I also gave a presentation once on Using BACnet for Lighting Applications. Aren't standards bodies wonderful?

Speaking of standards, the The Requests for Comments (RFC) document series, a set of technical and organizational notes about the Internet, is available.

Software Process

Extreme Programming - Extreme Programming , or XP for short, is a code-centric discipline for getting software done right, on time, within budget, while having fun along the way. The XP approach is to take the best software practices to the extreme. Another XP site has a great tutorial which includes an introduction and overview. Chuck Allison wrote a great article in C/C++ Users Journal about the The Simplest Automated Unit Test Framework That Could Possibly Work. It included test frameworks written in C, C++,and Java and opened my eyes to doing best practices to the extreme. What? You're not programming in one of those languages? You can download Test Frameworks for other languages.

Software Development Magazine had an article about test first programming of a GUI application that describes a method of incorporating automated testing into the application. The example GUI application is a simple game, but the design pattern, Model-View-Presenter, could be used for any GUI application. "In MVP, the View actually serves as both the view and controller (presenting output and managing input). The Model is the Model, as in MVC. The extra middle layer is considered a bridge between the View and the Model. It's specific to the application and is often considered throwaway if the View needs to change (for example) from Swing to HTML. In this situation, the Model would remain unchanged."

A Pattern Language has the structure of a network. A broad sweep through the patterns can capture some idea of and summarises or indexes the full network. Once you get this overview, you will then be able to find the patterns which are relevant to your own project and from these, using neighboring patterns in the network, able to identify other patterns that you may want to include.

Software engineers need certain things to help them be productive. Joel writes about the Bionic Office. He says that there's a lot of evidence that the right kind of office space can improve programmer productivity, especially private offices with doors that close. Most of the documented evidence comes from Peopleware. Productivity boosts come from being "in the zone," a state where the knowledge worker is able to fully concentrate on their work and tune out their environment. It takes an average of 15 minutes to get into the zone, but noise, phone calls, lunch, and other interruptions can easily and instantly knock the worker out of the zone. Prevent the interruptions and you can get a 260% productivity increase.

OUT-LAW.COM provides guides, articles and news stories relating to everything from the drawing up of on-line contracts and agreements to issues of taxation and defamation. You will also find sample contracts, checklists and other documents, indispensable to your business planning and operation.

Tech Interview has a large collection of puzzles and problems. Dr. Dobb's Journal Software Careers articles. Chris Sells writes about Interviewing at Microsoft. Or perhaps you just want to Ace the Interview.

For news I like to browse SlashDot and NewsForge.

Google - a very fast and often accurate search tool. Of course, you might need to use it in your native language. Try Elmer Fudd Google, Klingon Google, Pig Latin Google, or Swedish Chef Google. There are also other creative outlets at Google Labs, Google's technology playground. Google labs showcases a few of their favorite ideas that aren't quite ready for prime time. There is also Google Groups, which is used to post and read comments in Usenet discussion forums. Google offers a complete 20-year Usenet Archive with over 700 million messages. Wow!

My Home Page

Webmail at Lycos.

Webmail at Yahoo.

Webmail at Lithonia Lighting.

Contact Steve Karg