American Science & Engineering (acquired by Rapiscan)Senior Software Engineer
Jan. 2007 - Nov. 2012United StatesX-Ray Scanner Apps
Personnel Scanner
Tech Stack: C++, C#, TCP/IP, WinForms
- Motor Driver Interface: Designed, implemented and tested TCP IP interface to motor drivers sending simple text commands and profiles. One motor would spin a wheel on a horizontal axis, while another would move the spinning wheel up and down on the vertical axis. The api was first tested in a mock environment, adding to the existing C# Winforms app. The mock environment simulated rotational velocity and vertical speed and location. This work required coordination with mechanical and electrical engineers during system integration as the devices came on-line. Because of the mock test environment and successfully testing with the motors, we quickly determined that the scanner system had wiring problems.
Baggage Scanner
Tech stack desktop: C++, C#, MFC, .NET, XAML, GDI, Bitmap, WinForms, File IO, ISO Image, PrimoBurner SDK, SqlServer, TCP IP, Matlab, Threads, Mutex, Events
- X-Ray Thumbnail Control: Fixed a C# thumbnail control that translated x-ray intensities into either
colored images or greyscale images using lookup tables. It was painting really slowly until I figured out we needed to lock the bits in the bitmap before making changes to the array.
- Archiving Utility: Designed and implemented a Winforms Archiving utility that wrote images to an ISO image and written to CD or DVD media. The utility let the user either archive all images within a date range or select specific ones.
- Blend fictional threats into real time display: Implemented a C++ image filter that projected fictional threats seamlessly into real time baggage images. The filtering component was added into the image pipeline and monitored threat projection using a state machine. The outer state machine would track bags on the belt, the inner state would track where and if we were projecting fictional threats into the next bag. This filter worked with the bag masking, image stitching and virtual belt position components described below.
- Bag Detection: Implemented and collaborated with the imaging department to develop an image masking algorithm. The imaging department developed the algorithms using Matlab and I translated them into C++ modules that were added into the image pipeline. Verified the implementation using a bit mask of 1 and 0 written to a file against the images. This verification helped us gauge our thresholds limits.
- Image Stitching: Implemented and improved an image stitching component using C++. The component solved the problem of an operator stopping the belt, for any number of reasons, while we were acquiring bag image lines. After resuming the scan we needed to back up the belt and turn on the x-rays again in order to acquire lines that could be matched to previously acquired lines. The challenge of this problem was making sure we were getting a seamless match on the display, we needed to make sure the x-rays were at full power and the belt needed to back up enough so we could find a stitching point for the image.
- Virtual Belt Tracking: Refactored and tested an existing virtual belt component to improve the accuracy of bag tracking. I added state transitions like {started, accelerating, forward, reverse, stopping, and stopped} to improve our implementation. This component posted messages to the stitching component to let it know when to start looking for a good stitching line.
- Thread Wrapper Class: Refactored C++ thread creation, debugging and destruction policies. As our product lines grew we started witnessing startup and shutdown inconsistencies. I initiated and created a wrapper class to consolidate all the create, destroy and debugging code across our code base. The implementation named the threads so they would show up in the Visual Studio Threads view. We added an event to signal thread shutdown. This effort fulfilled the product requirement to shut off the x-rays within N-milliseconds when hitting the emergency off button. This improved the maintainability of the code base in over 300 dlls and improved the crash dump display as it showed the named threads during those debugging sessions.
- SQL Upgrade Script: Maintained and added to the SqlServer upgrade script, adding columns to existing tables and migrating existing data into new tables when needed.