A few years ago, I was asked to develop a Windows application for a nursing home that allows them to keep track of their residents and the medications they get. I was given some drawings that their users created and was asked to use them to throw together a simple prototype that demonstrates what could be possible. After about an hour or two, I had taken their drawings and converted them into an actual working application. Since this was only supposed to be a prototype, I never finished out all of its functionality. However, I did put enough work into it so that they could enter some basic information for their residents (name, DOB, apartment #, SSN, etc…). Along with the basic resident information, the app also allowed them to record contacts for their residents as well as any medications, diseases, allergies, or dietary information they needed for their residents. I even added the ability to store pictures of their residents and even added reporting capabilities so that whatever was viewed in the app could be printed on paper.
The very next day, I took what I had done so far and showed it to the customer who loved it. We discussed how I could put a larger database behind it and make it so that different users using the same computer or users on multiple computers could access the application. I mentioned the idea of making this a web application that could run on an internal server. But, they didn’t like that idea and preferred the thick client version just like the prototype. I even went thru an extensive whiteboard session to begin discussing what the app would eventually grow to become for the production-ready version of the app.
Shortly into the conversation, it came time to talk about the brass tax. At that point, the customer got all defensive and started acting like I should have been doing all of this work for free. In fact, he was so adamant that he crossed a boundary that I wasn’t willing to stick around for any longer. So, I grabbed my laptop, left the building, and never spoke to him again.
Today I was going thru some of my personal projects and stumbled across this one. Instead of deleting it from my computer or leaving it to waste away, I thought I would share it with anyone that might find a simple application like this useful. So, that’s just what I am going to do.
A while back, I wrote an article showing you how to create your own C# app for controlling the FOSCAM Wireless IP Camera. In that project, I showed you how to access individual images from your camera using the “snapshot.cgi” URL. Basically, that app would call the IP camera and retrieve 1 frame at a time which would simulate the appearance of streaming video. However, that app wasn’t really utilizing the streaming video capabilities that the camera had to offer which was somewhat noticeable in the video playback. Since writing that article, I have received hundreds of emails asking if I would show how to use the “videostream.cgi” URL instead. At one point I had built an app that does just that, but seemed to have lost the project somewhere along the way. Unfortunately, I have not had a lot of extra time to revisit this app until. The only reason I’m getting the chance / making the time to revisit the app now is because I have recently been conducting a major overhaul of my home automation & security system which involves this app.
One of the things I’ve done during that process is replace all of my FOSCAM IP Cameras with the INSTEON 75790WH wireless security IP cameras which are available on Amazon currently for around $65.00. They are pretty much the same exact cameras. Just like the FOSCAM IP cameras, the INSTEON cameras also include pan, tilt, & night vision. But, with many parts of my home automation system already being INSTEON, I chose to also use the INSTEON cameras as well. Since the FOSCAM and INSTEON cameras are basically the same, the C# IP camera controller app I introduced you to in the previous article will work for both. Plus, the updated version of the app I’m going to show you here also works with both cameras. After playing around with both cameras, the only real reason I would suggest going with the INSTEON version over the FOSCAM version is that INSTEON’s mobile app already supports the INSTEON camera natively. But, if you’re a geek like me and decide to roll your own software, you will be pleased with either camera.
A while back I wrote an article about a C# wrapper I wrote for the Cronus video game controller adapter. For those of you that aren’t familiar with this adapter, it’s basically a USB dongle that attaches to your Xbox, PlayStation, Wii, or computer that allows you to use any USB gaming controller you want, even if the controller isn’t made for the console you are wanting to use it on. For example, this little device will allow you to use your Xbox 360 controller on your PlayStation 4 if you wanted. Another cool thing about this device is that you can automate game play from your computer. Click here to checkout how I automated Guitar Hero from my laptop using this device. If you don’t have a Cronus controller adapter, you can find them on Amazon for around $50.
The wrapper that I shared in the first article was only capable of connecting to your Xbox (or other console if you made the necessary changes) and could send commands to the console. Since posting that article, I have received numerous emails from people asking if I could upgrade the wrapper & example app to also be capable of reading the state of the controller. Well, I’m glad to say that I finally took the time to do that. You can now use my Cronus C# API wrapper to capture the state of each button on the controller. For example, whenever you press the “A” button, your app can now detect that button press and act on it if necessary. In the example app I’m including at the bottom of this article, each button pressed on the controller is indicated on the Windows form. I have also setup the example app to forward all button presses to the console. This will allow you to play your games while the controller is connected to the Cronus all while capturing the button presses in real-time on your computer.
My newest ebook is finally available online. You can get it at https://sellfy.com/p/Q4Lg/. It’s currently only available in PDF format. I’m still working on converting it to MOBI and EPUB formats. Once I’m finished converting it, the ebook will be available on Amazon and Barnes & Noble for the Kindle, Nook, and other e-readers. Your feedback is greatly appreciated!
Table of Contents:
Chapter 1: Downloading and Installing Java, Eclipse, and the Android SDK
Chapter 2: Configuring Eclipse and Creating Your First Android App
Chapter 3: Creating a Layout and Adding Some Code
Chapter 4: Testing Your App with the Android Emulator
Chapter 5: Monetizing your Android App with Google AdMob
Chapter 6: Running Your Android App on Cellphones and Tablets
Chapter 7: Publishing Your Android App to the Google Play Store
Chapter 8: (Bonus) Google Glass and Windows 7
Chapter 9: (Bonus) Computer Vision with OpenCV and Google Glass
Recently I was working on a project for the Raspberry Pi that grew a little too big for a single Pi to handle. Instead of moving the app to a system that contains more resources, I thought I would divide up the work load and have individual tasks ran on multiple Raspberry Pi’s instead of one. Since I already have a RPi cluster, I thought this would be a great opportunity to put it to work. Even though there are plenty of different ways to do distributed computing, I chose to go the RPC route. Since I had a really good grasp of what needed to be done and what could be offloaded to other Pi’s for processing, I chose not to use any of the available 3rd party frameworks that are out there on the web. Instead, I chose to roll my own module using the XML RPC libraries that come packaged with Python. Since my project doesn’t require any extra dependencies, it makes it easier to get up & running on the different Pi’s in my cluster. Because I went thru the (easy) work of writing the RPC app, I thought I would share a simpler version of it with all of you in case you find yourself needing to do something similar.