Full Resumé

Will Warner is a contract software engineer and consultant with 35 years in the business.  In that time Will has contributed to the design of dozens of products that incorprate software.  He is a software developer who understands electronics and systems.

For the past 10 years Will has specialized in developing multi-threaded WinForms C# programs for pseudo-real-time control of medical devices, scientific instruments and machinery.  Out of this work came the ideas for structuring Windows applications described in the book.

EDUCATION    

MICHIGAN STATE UNIVERSITY, East Lansing, Michigan

Degree:  Bachelor of Science with high honor, 1978
Major:   Mathematics    
Minors:  Computer Science, Electrical Engineering

WORK HISTORY  

February 2008 to Present:  Consultant and contract software development:

Developed and employed unit tests for the C++ code of a medical device, using CPPUnit and VectorCAST.

Developed, in C#, features of a microscope:  interface to underlying SQL database, CPU temperature monitoring, infrastructure for rending the text on the GUI and in reports in any language, logic for limiting the size of DB tables and log files.

Developed a WinCE (Compact 7) C# WinForms application to perform service functions on a SpO2 monitor, involving interaction with a touchscreen, a USB port, the file system, the Windows operating system and hardware components through an underlying board-support package (BSP).

Added infrastructure for localizing on-screen and report text in a Windows application that controls a microscope.

Developed a multithreaded C# interface to a serial/USB connection to a glucose monitor for a WinForms application.

Developed a multithreaded C# / WinForms SDK to help developers use and expand upon signals derived from the brain, eye movement and facial muscle movement to create events (e.g., keystrokes, mouse clicks) in a PC.

Developed multithreaded C# / WinForms programs to run manufacturing test stands for testing the electronics and software in a heart-lung machine and blood-gas monitor.  Developed the GUI, threading architecture and APIs to drivers for GPIB, USB, digital and analog I/O and CAN bus. 

Developed multithreaded software to operate a system of instruments used to assess the quality of petroleum.  Developed the C# / WinForms GUI, threading architecture and protocol drivers for serial-port-based interfaces to 14 instruments.

September 2004 to February 2008:  Internal staff consultant, Orion Systems, Ann Arbor MI.

Led teams of engineers to develop numerous PC-based .Net Windows Forms applications, and WinCE/C# programs.  The programs involved the use of SQL data bases, serial ports and modems; communication with and control scientific and medical instruments; multithreading; graphic display of data and real-time signals (brain waves, ECG, other clinical vital signs); use of Visual Studio and National Instruments .Net development environment.

May 1985 to September 2004:  Consultant and Contractor with Real-Time Computer Applications and Peach Mountain Computing, involving the following projects:

University of Michigan Space Physics Research Laboratory (10/03 – 02/04)   Wrote a program to control a Time-of-Flight mass spectrometer and to histogram and log the output of the spectrometer and to graph in real-time the total ion current.  Wrote a C#/Windows Forms GUI and a VC++ API to the TOF adapter card, and a VC++ DLL API a National Instruments 6602 DIO and Counter/Timer board used in controlling the spectrometer and a gas heater/cooler.

Medstat (06/03 – 08/03)   In a project to create web-based access to a large distributed Sequel Server Database, I created (using Visual Studio .Net) a library of C# objects that simplifies access to the database by other layers of C# code.

University of Michigan Space Physics Research Laboratory (01/03 – 06/03)  Developed firmware and software for all the components of a magnetometer and data logger (which is currently in operation on top of Greenland’s ice cap).  Wrote C firmware for the 8051uC which functions as the instrument controller and communicates through UARTs with aTDS2020 flash memory-based data logger (which I programmed in FORTH), with a GPS receiver using the NMEA standard protocol, and with a remote laptop PC running a console program which I wrote in VB6. My 8051 code also digitizes four analog signals 10 times a second, compresses the readings and communicates them to the TDS2020 for storage in flash memory.   Every hour my 8051 code awakens a GPS receiver, waits it for it to acquire satellites, then resynchronizes the 8051’s internal clock with universal time obtained from the GPS receiver.  Wrote a VC++ DLL for the PC and additional code for the TDS2020 to implement a CAN bus connection for transferring logged data from the instrument to the laptop.  For the PC end of the CAN connection I selected the Vector CANtech PCMCAI CAN-bus adapter card and wrote a VC++ DLL API for it. (See my “Making the CAN bus a can-do bus,” August 21, 2003 EDN).

University of Michigan Space Physics Research Laboratory (06/02 – 11/02)  Designed and developed a system based on a PC that monitors the operation of a mass spectrometer, and simulates the input from its sensors, while the instrument executes scanning sequences.  By monitoring the operation of the instrument we can debug the scanning sequences before they are up-linked to the instrument’s twin which is orbiting Saturn on the Cassini spacecraft.  I wrote a GUI in VB6, a VC++ DLL and a Windows driver to control a National Instruments 6533 DIO board to periodically sense the state of the instrument and interact with it, a VC++ DLL to monitor messages on a MIL-STD 1553 bus, and a VC++ DLL to communicate the captured data (through TCP/IP sockets) to a remote data archiver.

Terumo Cardiovascular Systems (09/00 – 08/02)   Developed a program in VB6 for a PC to test the operation of a LAN-based heart-lung machine.  The program monitors bus traffic and displays the state of all devices in the system.   The program also simulates devices (pressure and temperature sensors, for example) enabling hardware-in-the-loop testing of the system.  The program controls various devices to perturb flow and pressure and records and graphs the servo-response of pumps set up to maintain a flow or pressure set point.  It controls a scale and pumps in the system to verify the flow accuracy of the pumps.  I also conceived and wrote the test plans for this work.

Chromatofast (05/00 – 08/00)  – Developed, in C, the executive program for a PC104 system to function as the internal controller of a gas chromatograph, including digital and analog I/O through PC104 bus I/O boards and PID control of temperature.
LI-COR, Inc. (01/00 – 04/00)   Developed a VB5 console program for a laptop PC to control and monitor the operation of a spectroradiometer through a serial port.  The program also analyzed and plotted the data uploaded from the spectroradiometer.

Dolman, Inc. (10/98 – 08/99)   Helped architect two PC boards to switch between multiple video sources based on the detection of human voice at multiple microphones.  Then I wrote real-time programs in C to control the two boards.  My programs download DSP code into ADSP-2100 DSP chips and upload compressed audio data from a CT8020-TrueSpeech Co-processor; monitor the DSP chip registers to learn which microphone is processing human voice, and manipulate the registers in the proprietary video switching board to show the video from the camera pointed at the selected microphone and to superimpose on the video the name of the speaker; monitor, debounce and act on digital pushbutton inputs used to mute selected microphones.

Steeple Chase (08/97 – 09/98)   Wrote, in C,  iRMX threads and device drivers for Opto 22 digital and analog I/O devices, for a general purpose PID controller, and for the ARCNET bus using the COM20020 ARNET controller chip.

ABN-Amro   (03/98 – 06/98)   Wrote PL/SQL and Java packages to link webpage software to a large underlying Oracle database.

Open Networks Engineering  (01/98 – 03/98)  Wrote VRTX “threads” in C to automatically monitor and test the internal components of operating telephone switching equipment.  (See my “Non-preemptive multithreading performs embedded software’s juggling act,” July 8, 1999 EDN.)

Mechanical Simulation Corp. (02/97 – 06/97)  Designed signal conditioning electronics and real-time C code for a PC to use Computer Boards DIO and A/D boards to link an automobile simulation program in the PC to an antilock braking ECU for hardware-in-the-loop testing of the ECU.   My software conveys outputs of the ECU to the simulation program, and outputs of that program back to the ECU so the ECU responds as if it were controlling an actual car and its operation can then be analyzed.

Montronix, Inc. (08/96 – 05/97)  Ported a proprietary real-time operating system (implemented in C and assemble language) to the Intel 87C196 single-chip microprocessor and wrote devices drivers for sensors and displays in a device that monitored vibrations in machine tools to characterize tool wear and predict tool breakage.  Then I wrote, in C, a menu-based test program for the device that tested its ROM, RAM, battery, EEPROM, FLASH memory, LCD, keyboard, LEDs, and analog inputs.

Bell and Howell (3/95 – 5/95)   Wrote in C for UNIX a process to balance the load of requests to retrieve and FAX articles from a digitized magazine database.   (3/96 – 6/96)  Wrote APIs in C to use a pass-through SCSI driver and adapter card to control the operation of several brands of CD-ROM jukeboxes and CD-ROM drives.

Bio Image (periodically in 1994, 1995, 1996)  Developed a VC++ console program for a laptop PC to control and monitor the operation of a fluorometer through a serial port.  Wrote UNIX (Sun Solaris) SCSI device drivers for numerous document scanners and a CCD camera, and wrote C libraries for acquiring, compressing, decompressing and storing digitized images of DNA sequences.

ImageSoft Corp (periodically in 1990 – 1994)  Wrote, in C, UNIX SCSI device drivers for numerous brands of optical disk drives and optical disk jukeboxes; also for several tape drives and tape libraries.  Wrote UNIX servers for the archival and retrieval and transmission (through TCP/IP sockets) of compressed digitized images.  (See my “Compression algorithms reduce digitized images to manageable size, “ June 21, 1990 EDN).  (See my “Adapter and software simplify interface to SCSI peripherals,” June 1991 EDN.)

Access Corp (periodically in 1986 – 1991)   Developed embedded software for a Motorola 6803 single-chip microcomputer for a position-loop servo controller, a bar code reader and stepper-motor controller.  (See my “Use a single-chip microcomputer as the heart of your position controller,”  September 1, 1988 EDN)

Machine Vision International (1984 – 1985)   Architected and programmed a system for the use of machine vision in various industrial applications.  Wrote PC and UNIX drivers for video frame grabbers and code to execute machine vision algorithms, and PLC programs to act on the output of the of the machine vision algorithms.

Buschman Conveyors (1982 – 1984)  Wrote programs for Modicon PLCs to control large material handling systems involving many conveyors, barcode readers, palletizers, printers, and hot-backup.

The General Electric Company (1978 – 1982)  Design, development, and application of CNCs and PLCs.  Wrote embedded operating system code to enable a PLC to interpret and execute ladder-diagram programs.  Wrote embedded code to perform system diagnostics in a CNC.  Architected and programmed a system to drive a machine tool for automatic tool and workpiece inspection.