Sunday, September 27, 2009

Pos .Net Series, Post #9 –Barcode Scanners, MSRs and Keyboard HID Devices

A common problem people encounter when trying to use barcode scanners, and sometimes MSR devices too, is that most barcode scanners come preconfigured to report themselves as a ‘keyboard’ to Windows. This is convenient for most situations, as the scanner will then work with any application that supports keyboard input, including web pages, text editors, email programs and word processors as well as business applications such as POS systems. If you don’t need to know data came from the scanner, or which scanner etc. this is generally a good way to go as it requires no development on your part and allows your users to use the scanner in a variety of situations.

Sometimes however, you need more control. Perhaps you need to know if the data was scanned or keyed for reporting purposes. Some retailers use reports that show a high incidence of keyed barcodes to indicate that hardware is faulty, staff need re-training or that product is badly labelled. It might be you want to restrict use of the scanner to business applications that require barcode input, and not allow barcodes to be scanned into emails etc, or it might be you need to log whether data came from the scanner for auditing reasons.

In any case, if you need any of these features your best solution is to use the scanner via Pos .Net, but Pos .Net won’t work with a scanner that is configured as a ‘keyboard’ device. In fact, some service objects will throw exceptions when you try to use them with a scanner that is configured as a ‘keyboard’ or ‘USB HID’ device. In these situations you must reconfigure the scanner so it doesn’t report itself to Windows this way. How you do this depends on the specific make and model of scanner, but it usually involves scanning  a specific sequence of barcodes (which should be listed in the scanners user manual) to reprogram it.

More information on this can be found here.

Technorati Tags: ,,

Saturday, September 26, 2009

Xavier Michelides On Rove – Comedian

I saw this guy on Rove the other week when it was broadcast in New Zealand, he’s pretty funny and has a hilarious opening bit about Windows, so I thought I’d share.

See his clip on YouTube.

Technorati Tags: ,

Wednesday, September 23, 2009

Tech Ed 2009

So as I mentioned a few posts back, I went to Tech Ed New Zealand 2009 last week. Ever since I’ve been struggling with what to blog about it, if at all. I’ve had many great Tech Ed experiences in the past and was looking forward to going this year, but it turned out to be almost a complete waste of time, and I don’t really want to post a whole bunch of negative comments about it.

To be honest I’m not even sure why it was so bad, and I suspect that’s because there was more than one problem. One speaker admitted that content on .Net 4.0 and VS 2010 was reasonably light because beta 1 had been out long enough that most people who were interested had already seen it, and also because he believed beta 1 was terrible. The same speaker said that most of the time the Tech Ed event coincided with new releases, betas or otherwise, of products and so there was a lot of new stuff to talk about, but that wasn’t the case this year. The lack of interesting content meant I actually had three sessions where there weren’t any presentations on I wanted to go to, and I ended up doing work instead.

Lack of new content was a problem too, but perhaps that’s a symptom of the times we live in rather than a fault of Tech Ed. Most of the ‘good’ sessions I went to, such as the one on parallelisation in .Net 4.0, and some of the TFS sessions weren’t useful because I’d already seen everything that was presented already… online. In fact, one of the presentations on TFS branching and merging I’d seen the week before in an MSDN video online, and it was much better done in the online version. The Tech Ed version of the demo was functionally fine but too simple (not enough data in the setup) and so didn’t really indicate why or when the feature was useful, in fact my boss who was in the presentation with me was quite confused by why anybody would think the feature as demoed would be any good.

A second problem was that many of the sessions were insultingly simple. To use an ‘Australasian’ phrase, it was like being taught to suck eggs… when you’re"it was like being taught to suck eggs… when you’re already a professional egg sucker." already a professional egg sucker. One session spent around ten minutes explaining what code reuse was and different ways of implementing code reuse to a room of developers. Another session on Team Test and Lab Manager spent several minutes on a slide explaining why we should care about testing. Samples and examples were overly trivial (they always are, but seemed worse this year) and the rest of the time the speakers kept belabouring the same point over and over again. Often they spent 2 minutes or more on a concept or bullet point, when we’d got the message in about ten seconds.

Frustratingly several of the sessions could have been really good, but failed to deliver. One session on DSL’s and ‘declarative programming’ would have been excellent if the guys doing the presentation had gone into detail about the application they’d built, the pitfalls they’d run into, their solutions and so on. Instead we got not much more than the same DSL/code generation information that has been covered again and again on the internet in web pages, videos and podcasts (like Dot Net Rocks). They gave us a tantalising taste of a really cool framework they’d built to run some cool looking applications they’d also built, and then showed us how we could build a three step workflow that added two numbers together and returned the result… there just wasn’t any link in the presentation between the tools they were talking about and the result they’d achieved. If they hadn’t shown us the tiny bits we saw of the applications they’d built, the true power of the tools they’d used would have been completely lost. What’s more, even though their system was heavily workflow based, this wasn’t the presentation where we found out the workflow engine/library in .Net 4.0 has been completely rebuilt in a new namespace with the old one left in for compatibility. I wonder if they even know !

Another talk on building applications with WPF started out promising but then completely missed the point and was inaccurate to a degree. The talk started out saying it was going to explain why Window Forms programmers working in WPF are so unproductive (at least at first) and the experiences the presenter had while building his first few commercial applications using WPF. The presenter then went on to explain MVC/MVP a little bit and the problems inherent with them, then went on to explain how to properly bind controls and adjust their appearance etc at runtime in WPF to avoid these problems. The issue here is that he implied this couldn’t/wasn’t done with Windows Forms… but it’s exactly what we do at work ! There was nothing that required WPF in this part of the presentation even though that was implied. It was just good architecture, and again we were being taught to suck eggs. The only useful piece of advice was to design ‘lookless’ user interface, and that if you didn’t you’d run into problems. Good advice, but not exactly new. He spent most of the session saying everything should be lookless, then he almost (but not quite) said the only benefit to designing lookless controls/user interface is to be able to change the look and feel later, and then he said that even if you never customised the look of anything you should still use WPF… but then he didn’t explain why.

My last negative comment is that all the evaluations had been moved to being ‘online’, which is perhaps not a bad thing in itself, but there was no ‘mobile’ version of the site at which you posted feedback. If you didn’t have a laptop or weren’t prepared to connect your laptop to the open wireless network, then you were pretty much out of luck for posting feedback during the day. Of course, with my internet connection still not working at home, that meant I pretty much couldn’t post feedback at all.

So with that off my chest, here’s a few positive/useful things;

The talk on parallelisation was very well presented, it would have been informative if I hadn’t seen it all on line already, and the presenter was funny and entertaining… “There’s only three ways to use all the CPU power on a 16 core machine. 1. Write a very bad program. 2. Write a very good program. 3. Run Outlook”…

“Did you hear about the 486 talking to the Pentium ?

486: What’s 2 + 2 ?

Pentium: 5.

486: That’s wrong !

Pentium: I know, but I was fast !”

Ok, it was funny in the presentation, I promise. Perhaps it was his accent.

I did however lean three things in this session.

First, it seems the TPL hasn’t just been added to the .Net 4.0 BCL as is, and then everyone called it a day… there have actually been updates inside the CLR to improve the threading abilities provided. This is apparently important for the second thing I learned; there are new debugging tools. Specifically there is a new ‘tasks’ window which shows running ‘Tasks’ (equivalent to the Task class in the TPL) and can indicate tasks that are deadlocked. Apparently the CLR had to be modified so that shared resources could be monitored in order to provide the deadlock detection. As well as the ‘Tasks’ window the existing Threads window has also had some updates, so it now shows the stack trace for each thread right there as part of the threads details, no more having to change the active thread and leap over to the call stack window.

Finally, there is a really exciting feature built out of black magic, called ‘Debug History’. The Debug History is shown in a dockable tool window within the IDE, and effectively tracks the runtime history of your application and allows you to revert execution to any prior point. I only saw about 4 minutes of this in the entirety of Tech Ed, and it was split over two different sessions so they demoed pretty much the same thing, but it was rumoured that you could put execution back at a prior point and all your memory would reset as at the selected point in time, expired threads would be restarted in the correct state and so on. I can’t imagine how many goats had to be slaughtered to make that sort of voodoo magic work. Only time will tell if it lives up to it’s promises.

In a talk on what was new in the .Net 4.0 framework we discovered that WF, originally WWF, and referring to ‘Workflow Foundation’ has been completely rewritten. Oh no, you might cry, will our existing applications work on .Net 4.0 ? Is it backwards compatible ? Yes, and sort of. It turns out the re-write was done in a new namespace, all the existing 3.5 WF classes and types remain and work as they used to, but you’re probably not going to get much benefit out of that so in reality you actually do need to re-write your workflow applications to use the new types in the new namespace. Luckily for us, we don’t use .Net workflows.

Last, but not least, the Microsoft Test and Lab Manager product which makes testers first class citizens of the SDLC and the TFS world looks awesome. Not only can testers easily view, edit and create work items, there are new work item types for test cases etc. There is also a fantastically robust looking user-interface action recorder which can be used by testers and developers to play back complicated sequences of actions require to reproduce problems, and with just a little coding these can be turned into automated user interface tests. When creating work items, videos of the testing, memory dumps for debugging, system information (such as CPU, RAM, available disk space, Windows & service pack versions etc) and action recording can all be attached (and sometimes automatically) to the created tasks. This product, when released, will definitely be worth looking into for anyone who takes testing seriously.

And sadly, that’s about it. So that’s my last word on Tech Ed for this year. I hope others got more out of it than my boss and I did, although I heard a few other people grumbling so it sounds like we weren’t the only unhappy ones.

Technorati Tags: ,

Tuesday, September 22, 2009

A Huge Thanks To…

The Chorus engineer that fixed my internet problems this morning… finally someone who actually knows what they are doing ! Apparently the most recent problem was pretty simple, I just wasn’t connected. Now I am.

Not only do I have internet access again, but I’m getting up to 16.8Mbps down and 700Kbps up, which is much faster than anything I’ve had before.

Now I just have to try and get a credit from Orcon for the period where the service wasn’t as advertised…

On-Screen Keyboards In WPF

Update 18/01/2011 : Check out this code project article if you're interested in an on-screen keyboard implemented in WPF;

The most popular post on my blog is an old one about creating on-screen/touch screen keyboard in Windows Forms. This isn’t surprising, I guess, since doing so is full of subtle traps that makes the process quite difficult when you first look into it. The Internet, and in particular, have all the information you need to get it right but it is mostly distributed among different articles and pages and not gathered all in one place, so doing the research can be time consuming, hence the popularity of my article which contains all the magic ingredients.
However, as pointed out by “Oregon Ted” in the comments on my post, the solution doesn’t work in WPF as the trick used to show a window without activating it doesn’t apply to the WPF object model. Luckily, Google found the answer on another blog (IRhetoric);
By using the technique shown in the link to show a WPF window without activation, and the other tips in my old post, you should be able to get an on-screen keyboard working in WPF with a minimum of fuss. I haven’t tried it myself though… so if anyone does please leave a comment to share your experiences.

Friday, September 18, 2009

Pos .Net Series, Post #8 – How Can I Create My Own Service Object ?




The first thing you should be asking yourself, is do I really need to ?

There are times when you do need to write your own service object;

    You’re an independent hardware vendor and want to make your device OPOS compatible.

    You want to be community minded and publish a free service object for a device that doesn’t already have one.

    You have an existing system that works with Pos .Net/OPOS and it will be at least as much work, or a better architecture, to write your own service object for a device that doesn’t already have one than to re-code the rest of your system to cope with this non Pos .Net device. 

Notice that in the first case you are actually providing hardware, and in the last two cases the caveat is FOR A DEVICE THAT DOESN’T ALREADY HAVE ONE.   

I see a lot of people on various forums or message boards saying things along the lines of;

“I want to use the Pos .Net to create my service object but I am newbie and don’t know where to start. Can someone tell me how to create service object for pos printer ?”

Now, language barriers aside (and no, that wasn’t intended to be poking fun at anyone), most of these people actually DON’T WANT TO CREATE A SERVICE OBJECT.

What they want to do is operate a device using a service object.

I think part of the problem is the same SDK Microsoft ship for consumers of Pos .Net includes documentation, samples and classes for creating your own service objects, something that is not a trivial task.

People reading the documentation and looking at the libraries get confused and think they need to create their own service objects instead of realising they need to obtain one.

Also, anyone considering writing their own service object needs to realise how big a job this is. Apart from implementing the interfaces and classes in Pos .Net you need to perform all the low level device interaction for input and output, as well as status handling to do a good job. You also need to have read, understand and followed the UPOS specification to ensure that your service object behaves according the published rules.

One poor developer I saw asked why he was getting a ‘Method Not Implemented’ when he called base.PrintNormal in a class inheriting from the PosPrinter service object base class. He didn’t realise that he has to implement all the work of actually doing the printing and sending data to the device. The PrintNormal on the base class is just there to ensure you have that method on your interface (although why it isn’t abstract rather than a virtual method that throws an exception I don’t know).

If you still want to create a service object and you’re stuck at where to begin, then by all means set about learning what you need to know but realise that you’re a very long way off having anything that works. Posting in forums saying can someone provide me a sample isn’t likely to get you very far for complex devices like printers, you might get some for barcode scanners, Msrs and cash drawers but even then you’re likely to be just pointed at the samples that come with Pos .Net.

If you really do need to create a service object, and you understand everything I just said, then sorry… this post wasn’t very helpful to you.

If I’ve convinced you not to write your own service object, but now you need to find one, try my list of service object vendors.

Technorati Tags: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Windows Live Tags: Post,Create,Service,Object,STOP,times,vendor,OPOS,system,architecture,code,Notice,cases,caveat,DEVICE,message,printer,language,Microsoft,consumers,documentation,classes,objects,task,interaction,output,status,UPOS,specification,rules,Method,PrintNormal,PosPrinter,data,interface,exception,devices,Msrs,cash,forums,barriers,interfaces,printers,vendors,hardware

WordPress Tags: Post,Create,Service,Object,STOP,times,vendor,OPOS,system,architecture,code,Notice,cases,caveat,DEVICE,message,printer,language,Microsoft,consumers,documentation,classes,objects,task,interaction,output,status,UPOS,specification,rules,Method,PrintNormal,PosPrinter,data,interface,exception,devices,Msrs,cash,forums,barriers,interfaces,printers,vendors,hardware

Blogger Labels: Post,Create,Service,Object,STOP,times,vendor,OPOS,system,architecture,code,Notice,cases,caveat,DEVICE,message,printer,language,Microsoft,consumers,documentation,classes,objects,task,interaction,output,status,UPOS,specification,rules,Method,PrintNormal,PosPrinter,data,interface,exception,devices,Msrs,cash,forums,barriers,interfaces,printers,vendors,hardware

Friday, September 11, 2009

Pos .Net Series, Post #7 – Deploying Pos .Net

Deploying Pos .Net isn’t hard, but it’s not ideal either. You can see a thread I started on the subject on the Pos .Net forum here.

There is no merge module or redistributable exe/msi file for just the runtime components. In order to deploy Pos .Net you must run the SDK install, the same install that a developer runs. During the install you will be given the option for ‘Developer’, ‘User’ or ‘Custom’ installation, if you select ‘User’ then just the runtime files and configuration are installed.

If you want to deploy Pos .Net with your own application you need to run the self-extracting exe for the Pos .Net SDK, then embed the extracted files in your own setup program and add an instruction to your setup script to run the setup.exe for Pos .Net with a specific set of command line arguments. The Windows Embedded Team Blog has a post with the command line arguments here, note the arguments are case sensitive so be sure to use the right case in your setup script.

While this works well enough, it has the disadvantage that you must include the full sized SDK install in your setup instead of just the runtime files and dependencies. That will increase download times and bandwidth usage when deploying your application, and with no benefit to your users for the additional size.

Apparently there used to be a separate redist, but this was canned in favour of the ‘User’ option in the SDK install. Given this, it seems unlikely Microsoft will return to publishing a separate redist, unless perhaps there is significant lobbying from the developer community for one. If you’d prefer a separate redist, then I suggest you leave a comment on the Windows Embedded Team Blog post where they talk about deployment, or in the thread I started on deployment in the Pos .Net forum.

Technorati Tags: ,,

Broadband Alternatives

Given my (now long standing) internet problems, I’m thinking about investing in a carrier pigeon. Although I think DNS resolution might be a problem with that.

Alternatively I guess I could ask NASA to be my ISP, after all, if they can get high-speed access to the moon then West Auckland shouldn’t be a problem !

Continuing Internet Problems

See my previous post here

So after two more calls to Orcon they have finally submitted a request to get a Chorus/Telecom engineer out to my place (I have no idea what happened the the request I was told they submitted the first time I rang them after the service stopped working altogether on the 31st of last month !).

I can tell this because I got an (automated) email to my Orcon account saying I can expect my service to be connected on the 22nd of this month. That’s pretty useful when I can’t read my email at home, right?! At least I can use web mail to access that account from work.

I won’t hold my breath for the fix however, since I’ve had this email at least twice before with no solution actually arriving.

I’d change ISP’s but since the problem appears to be roadside I’m not sure it will help. I think it it gets to 6 months without a solution though I will change, but so it feels like I’m getting something done about it. Of course, at the point the question will be which ISP do I choose…

Retrieving Associated Work Items for Build In TFS

I’m working on a deployment system for several of the products we publish at Auckland Software. As part of this we need to ‘publish’ the results of a successful TFS build to the QA environment for testing, and we’re trying to automate that process as much as possible. To that end, I’ve been writing some code to integrate to TFS, and one of things I needed to do was obtain the list of work items associated with the build.

I found several articles that showed this was possible with the GetAssociatedWorkItems method of the InformationNodeConverters object. The problem was, I couldn’t find where the InformationNodeConverters class lived. Some more searching on the internet revealed it was in the Microsoft.TeamFoundation.Build.Client namespace, in the Microsoft.TeamFoundation.Build.Client.dll file.

The next problem was that I couldn’t find the Microsoft.TeamFoundation.Build.Client.dll file, searching my PC for it I found it in several locations (some applications had installed their own copies) but the best looking location to reference it from seemed to be

C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies

Once I had my reference I could call the method I needed, but it didn’t work ! I had a valid build object to pass to the method, and the method succeeded without errors, but no work items were returned. I spent some time searching the internet for this problem, but didn’t find any reference to it. Eventually I started playing around with the code on my own, and I found the method only returned work items if I first called the RefreshAllDetails method of the build object first. This method took a second or so to execute, but without it the GetAssociatedWorkItems method didn’t work anyway.

It may be possible to call the Refresh method of the build object instead (and that might be faster), but I haven’t yet figured out the correct parameters to pass it. Calling the RefreshMinimalDetails method doesn’t help, just in case you’re wondering.

So if you’re trying to get work items related to a build and you’re not getting any results, try calling the RefreshAllDetails method of the build object first.

Technorati Tags: ,,,

Thursday, September 10, 2009

Pos .Net, PosPrinters and Nothing Happening

The other day I was working on some sample code using Pos .Net to print to a receipt printer. Try as I might, I could not get the code to print my text regardless of whether I used my Epson TM-T88IV or my TPG printer. My production code worked fine, but not the sample and I was stumped as to why.

Reading the Pos .Net SDK documentation I noticed it had several references to the way carriage return and line feed characters are processed and that sending one or the other would cause all previously buffered data to be printed. Nowhere did it say, however, that you must send one of the characters to get your text to print even though it turns out that including a \r\n on the end of my print data solved my problem.

I would have thought that if neither character was supplied the service object would print any buffered data when the PrintNormal method returned (except in Transactional printing mode), or at the very least when the Release() method was called. Since you can’t possibly print anything else after that without another call to the Claim method, it seems pretty obvious you’d want any previously buffered data printed before you finished with the printer. Flushing the buffer when Release is called would be good and expected behaviour, at least to my way of thinking. But apparently not.

So, the moral of the store is that if you’re printing with Pos .Net, but nothing is coming out of the printer and you’re not getting any errors, make sure you have a line feed somewhere in your print string (presumably at the end).

Something else that concerned me in the documentation for the Print Normal method was the part that talks about using the ValidateData method to determine if and how carriage return characters are processed. You just can’t take anything for granted.

Technorati Tags: ,,,,

Wednesday, September 09, 2009

TechEd 2009

My boss and I are going to Tech Ed 2009, which is always kind of cool. Unfortunately the sessions listed this year look a little boring… if it doesn’t say .Net 4.0, VS2010 or TFS2010 it doesn’t look particularly interesting. Hopefully there’ll be enough exciting stuff in those sessions to make the price tag worthwhile, and given what I’ve seen on the ‘net it certainly looks promising that will be case.

Some of the Sql Server 2008 sessions might be interesting, but we’re not likely to convince any of our customers to upgrade any time soon so we’re not going to be using it for years, and some of the Sql 2008 sessions conflict with .Net/VS/TFS sessions, so I can’t go to those ones anyway.

There’s also the usual scheduling issues; some sessions there’s nothing on I want to go to, other sessions there are three or four conflicting presentations I’d like to attend.

Anyway, here’s my anticipated schedule… why not leave a comment with your own thoughts/schedule ?


Monday, 14 September

9:00 - 10:00

KEY01 Keynote

New Zealand Room 3

10:40 - 11:55

ARC303 Making enterprise code re-use work in the real world

New Zealand Room 3

12:05 - 13:20

ARC205 How to build a small software enterprise from zero

New Zealand Room 3

14:15 - 15:30

DEV420 Deep-Dive in the new Parallels with .Net 4 and how to scale your code from one thread to 32 cores.

Marlborough Room

15:50 - 17:05

DEV307 Using Team Foundation Server in a Distributed World

Ballroom 1

17:15 - 18:30

DEV302 Get ready: What's coming with .NET 4.0

New Zealand Room 1

18:30 - 22:00

Welcome Drinks

20:00 - 22:00

Tuesday, 15 September

9:00 - 10:15

DEV204 What's new in Team Foundation Server 2010

Ballroom 1

10:45 - 12:00

ARC202 Challenging the role of the architect

Marlborough Room

12:10 - 13:25

DEV301 Visual Studio 2008 IDE Tips

New Zealand Room 2

14:20 - 15:35

15:45 - 17:00

DEV303 Building Applications with WPF

New Zealand Room 3

17:10 - 18:25

DEV304 Visual Studio Team System 2010: Odyssey Two

Ballroom 1

18:30 - 23:30


Wednesday, 16 September

9:00 - 10:15

DAT306 Reporting Services, what is really available to you?

New Zealand Room 3

10:45 - 12:00

12:10 - 13:25

14:20 - 15:35

DEV306 Team Foundation Server for Successful Project Management

Ballroom 1

15:45 - 17:00

DAT303 Managing Databases with Visual Studio

New Zealand Room 4

DEV305 No More No Repro! An Introduction to Visual Studio Team System 2010 Team Test

Ballroom 1

17:00 - 18:30

Farewell Drinks


Technorati Tags: ,

Friday, September 04, 2009

Pos .Net Series, Post #6 – Performance, and Locating Service Objects

This is the sixth post in a series on Pos .Net. You can find the first post here, or see all the posts here.

I’ve combined the topics of performance and finding service objects into one post because there’s only a little to say about each.

First, performance is another one of those device dependent issues. I’ve had remarkably different performance even between the Epson OPOS service objects and the Epson native Pos .Net service objects, and sadly the latter is the one that seems to perform the worst. You’d think the OPOS service objects would be slower because of COM if nothing else, but that doesn’t seem to be the case. The Open and Claim methods in the native Pos .Net service objects can take half a second or so each to run, and sometimes setting the DeviceEnabled property can also take a noticeable amount of time.

Because of this it’s best to open the device once on start-up and close it when you shutdown, rather than every time you want to use the device. If you can do the same with Claim/Release and DeviceEnabled then you’ll get the best performance possible, but you won’t be sharing devices with any other software on the computer. You may need to invent configuration settings to say whether you claim at start-up or on each use, otherwise you may run into problems when a customer wants to use other software with the peripherals.

As for locating service objects, this is quite a mission. It seems not a lot of vendors have native Pos .Net service objects and those that do don’t publicise them all that well. More common are OPOS service objects, which are usually compatible with the Pos .Net system and are generally easier to find. The downside is they don’t support plug and play, they are COM based so require registration etc. which can lead to DLL Hell and performance may not be optimal because Pos .Net uses a special shim layer to integrate to them. Despite that, if an OPOS service object is all that’s available its better than nothing.

There isn’t a single repository on the web to locate service objects for Pos .Net, or even OPOS. Since Pos .Net and OPOS are useless without service objects you’d think it would be easier to find them, and that publishers would have a vested interest in advertising them.

There are a few websites that provide lists of service objects;

Monroe Consulting Services Site

Software Informer Website

In an attempt to provide a single/more complete source I’ve started my own collection which I plan to update as I come across new ones, or have them submitted to me by my readers. You can find my own list at;

Pos .Net and OPOS Service Object Links

I have tried to list all the service objects I could find or find references to, along with whether or not they are for OPOS, Pos .Net or both and a download link wherever possible. If you know of any service objects or supported devices not listed, please contact me with the details.

Pos .Net and OPOS Service Object Links

This post, which I will update from time to time, contains links to known Pos .Net and OPOS service object downloads.

APG (OPOS and Pos .Net)

Cash Drawers

Authentec (Pos .Net)

Rumoured to have a Pos .Net driver for some biometric devices, but no download link or other details found.
UPDATE 31/05/2010: Apparently you should request the appropriate “Technology Evaluation Kit” using the link below;

Avery Berkel/Weigh-Tronix (Pos .Net & OPOS)

Service object for 6710 POS Scale by SJJ Embedded Micro Solutions.


Printers (Note, you’ll need to choose your specific printer model before downloading the correct driver)
Also see here for a UPOS driver for Bixolon/Samsung printers.

Casio (OPOS)

See Epson, as they seem to be the manufacturer now.

Cherry (OPOS)

Printers, Msrs, (Barcode) Scanners, Smart Card Readers, Tone Indicators
Select a product in the drop-down list and then look for OPOS downloads.

Citizen (OPOS)


Custom Engineering/Kube (OPOS)

Driver link half way down page.

DataLogic (OPOS)

(Barcode) Scanners (select ‘OPOS’ from drop-down list)

Elane (POS .NET)
USB Scales, RS232 Scales


CashDrawers, Msrs, Keyboards

Epson Devices (Pos .Net & OPOS)

Download the Epson OPOS ADK for .Net from Epson Expert. You’ll need to create a login first, then you can find the downloads under Application Development/OPOS, or use this link;
Epson OPOS/Pos .Net Driver Downloads (Printers, CashDrawers, LineDisplays, HardTotals)
The OPOS downloads are at the top of the page, Pos .Net ADK downloads are at the bottom of the page. Supported device models are listed in the readme.txt file included in/installed by the download.

Flytech (OPOS)

Hosted at Software Informer website.

Fujitsu (OPOS)

Printers, CashDrawers, LineDisplays, PosPower (Power Management), Msrs, KeyLocks, ToneIndicator, Scanner, Scale

Handheld Products Barcode Scanners (Open Source?)
Note: Supports 64 bit Windows !

Honeywell (Pos .Net & OPOS)

(Barcode) Scanners
Select a product from the drop-down list and available downloads will appear, choose the UnifiedPOS Control entry if available.
Or try
Honeywell OPOS Drivers

HP Devices (OPOS)

HP RP 5700/5000/3000 Devices
Pos Printer
USB Line (Pole) Display
USB Mini Magnetic Stripe Reader
USB Barcode Reader
Pos Keyboard with Integrated MSR


SurePos hardware (various)
Requires registration to download.

ID Innovations (OPOS)


IdTech (OPOS)

Pin Pads, Keyboards, Signature Capture, Barcode Scanners, Msrs

IEE (Industrial Electronic Engineers – OPOS)


Intermec (OPOS)

Serial devices only it seems
Alternate download here

Ithaca/Transact (OPOS)


Logic Controls (Pos .Net and OPOS)

Printers, LineDisplays, CashDrawers, Msrs
Product category from drop-down list to see downloads. Pos .Net drivers for LineDisplays only, other devices have OPOS drivers.


Rumoured to have OPOS drivers, but I haven’t found a download link.

MagTek (Pos .Net & OPOS)

Pos .Net Drivers
Documentation for setting up the Pos .Net Example Service Object for Msrs to work with MagTek devices.
OPOS Drivers (Msrs & Micrs)
Note, apparently the OPOS service objects can be used to drive some IdTech devices too.


Cash Drawers

Motorola (OPOS)

Hosted at Software Informer website.

Micros (OPOS)

Hosted at Software Informer website.

Panasonic (OPOS)

Email Ken McCoy at mccoyk at panasonic dot com.

Partner Tech (OPOS)

Printers, CashDrawers, LineDisplays

Pioneerpos (OPOS)

CashDrawers, LineDisplays, Msrs

PreyKeyTech (OPOS)

Keyboards, Msrs, KeyLocks and ToneIndicators

Raymark (OPOS)

Hosted by Software Informer website.


Hosted by Software Informer website.

Senor (OPOS)

Hosted by Software Informer website.

Star Micronics (OPOS)

Printers, Cash Drawers

Symbol Technologies (OPOS)

From Software Informer website.

or from Symbol.

Syncron/Centric (OPOS)

Email Johan Hallez at johanhz at syncron-it dot com.

Tipro (OPOS)


Topaz Systems (OPOS)

Signature Capture


Toshiba (OPOS)

Hosted at Software Informer website.


Printers, CashDrawers

Tremol (OPOS)

(Fiscal) Printers

WASP (Pos .Net & OPOS)

Rumoured to have OPOS drivers for printers, but no download link has been found yet.
Get a Pos .Net cash drawer service object from (by SJJ Embedded Micro Solutions).

Wincor Nixdorf (OPOS)

Printers, HardTotals, CashDrawers, LineDisplays, FiscalPrinters, (Barcode) Scanners, Keyboards, PosPower, Micr
Note, this page contains an email address, you must email them to obtain drivers. Also, their UPOS documentation mentions Pos .Net, so native Pos .Net drivers may exist, but are not specifically mentioned. The documentation also says a development environment supporting COM is required, which is evidence that Pos .Net is only supported via OPOS legacy drivers.
Or try this link to the Software Informer web site.

Zebra (Pos .Net & OPOS)

Download requires registration. Also, single download for both OPOS and native Pos .Net service objects. Also note it’s rumoured these drivers (at least the Pos .Net native ones) only work with Pos .Net 1.1.


See Sean Liming’s site or the Monroe Consulting Services site for other lists of service objects and related downloads.
OPOS drivers listed at the Software Informer website.

Submit Another Vendor/Driver Set

Know of another vendor or driver set not listed here ? Want a correction made ? Send an email with the details to Yort.

Thursday, September 03, 2009

One More Reason The Internet Sucks

I’m not a huge fan of the internet, websites and web applications. They certainly have their"When all you’ve got is a hammer everything looks like a nail. It seems these days the internet is everyone’s hammer." place, and some great attributes. I’m not suggesting we should pretend they never existed and return to the pre-internet days, but I’m a firm believer in the right tool for the right job, and that when all you’ve got is a hammer everything looks like a nail. It seems these days the internet is everyone’s hammer.

My problem is that after 4 months of almost unusable internet connectivity at home, I now have NO internet connectivity at all. Lack of connectivity and the speed of any connection is one of the reasons I dislike the internet so much. It might be great in North America or perhaps Australia, maybe there you can get all you can eat, high speed, mobile connections for 1cent a month, but in New Zealand you just can’t. We suffer from lack of availability, poor quality of service and even when you get some kind of connection you usually end up paying far more than you would in most other developed countries.

"My service can be totally destroyed by a company I am not a customer of and have no direct dealings with."That aside, I want to talk about my specific problem… not so much because I have a problem and because I’m a whiner, but because it is totally incomprehensible to me how my service can be totally destroyed by a company I am not a customer of and have no direct dealings with… and that after four or five months I still cannot get my problem resolved. I have written to the prime minister (who has forwarded my complaint to the communications minister), my local MP and Fair Go, but have heard almost nothing in response. Here’s what happened to me;

About four or five months ago a bunch of Chorus vans turned up in the local streets around my home and started performing work on the road side telecommunications equipment.

Before I go any further let me explain how things are down here in lil’ ol’ NZ. Chorus is the company that performs servicing and upgrades to the physical telecommunications equipment owned by the corporate Telecom. Not too many years ago Telecom pretty much had a monopoly on telecoms within New Zealand. Gradually, we got Bell South (now Vodafone) and Telstra (Telstra clear) and then more and more telco’s. Telecom, however, remains a huge player because it owns almost all the fixed land line hardware throughout the country. Telecom used to a state-owned-enterprise, but was sold decades back, and while there is a legal agreement that provides for things like free local area calls for all NZ residents, Telecom continue to post multi-million dollar profits, and are generally seen in the same light as Microsoft are by those in the open source community. Pretty much all the other players are forced to rent or purchase whole sale any services that require the existing hardware, and New Zealand isn’t really a big enough market for people to start tearing up the place to lay their own equipment and lines.

So, Chorus have performed an upgrade that’s reduced the speed of my connection to the point"Chorus have performed an upgrade that’s reduced the speed of my connection to the point where it’s barely useable." where it’s barely useable. I waited a week or so to see if the problem resolved itself, it didn’t so I contact my ISP, Orcon. They asked me to run some online speed reports, most of which didn’t report any speed because the tests timed out. One of the few that succeeded showed I was getting 3kbps to a server in Christchurch. The incredulous tech support operator I was dealing with noted that was fifteen times worse than dial-up. It was eventually decided that Telecom/Chorus had upgraded the equipment from an exchange based system to a cabinet. I don’t pretend to understand the details at this point, just that this is what I was told.

In order to fix my problem they had to connect me to the cabinet, and would arrange to have that done urgently. Weeks go by and nothing changes, so I call again. I get a different person and a different story. It must be my modem, it must be too many devices in my house connected to the phone line, I need an ADSL splitter installed etc. Eventually after about 3 months I got the splitter installed, and it still didn’t solve my problem. Orcon agree to credit the cost of the splitter install (about $200) since it didn’t help, which was good, but I had to ring and ask them to do so.

At this point they finally work out, again, that I need to be connected to the cabinet and promise to have it done soon. Time goes by and nothing happens… I phone up to find out there “aren’t any ports available” and that I’m on a waiting list to be connected. New versions of the list are published approximately every three weeks and I should call Orcon back on the 17th to find out where I’m at. No, they can’t call me… they have too many customers in this situation to provide that service.

I call back on the 17th… no, there is no list out today. Call back in two weeks.

I’m pretty angry at this point ! The next day I get home and there is an expensive looking, full colour, plastic wrapped card from the Orcon marketing team, in my letter box, inviting me to sign up my friends to their service in exchange for a free night in a hotel. I must be getting old because I’d usually just throw this away but it so incensed me that I stuffed it back in an envelope with an accompanying letter that made a few salient points;

    They should integrate their direct mail system with their support system so they don’t send this kind of garbage to customers with outstanding support tickets 3 months old.
    I couldn’t sign up any of my friends, since they all knew about my connection problems as I wasn’t participating in online activities with them.
    I may also have said something about not being able to live with myself if I had signed up a friend or family member to their cruddy service….


I felt that having been fairly patient for three or four months now, and having not had "I may also have said something about not being able to live with myself if I had signed up a friend or family member to their cruddy service."my problems solved, I was entitled to rant a little.

I quickly got a call back from the head of the Quality Assurance team on behalf of the Customer Experience team manager who was unavailable. They were very apologetic and not sure why I’d had such problems but they were desperately trying to sort them out for me. I returned to being polite and civil… after all, no point in upsetting people who are trying to help.

I’m told at this point that *maybe* there aren’t any ports available, or maybe Telecom’s computer just didn’t show any available and no one actually went on site to check… Orcon will contact Telecom and try to get them to check the actual hardware.

New problem… All the Chorus engineers are on strike ! They don’t know when they can get someone out, but they’re trying really hard to get Telecom/Chorus to do it as soon as possible.

Well after several more weeks I got an automated email saying my connection would be cabinetised on the 31st of August. The 31st comes and my internet connection dies about 3pm. I’ve been warned this process will kill my connection and my phone line for about 4 hours, so I figure that’s not a problem and I’ll just check the connection tomorrow.

I wake up on the 1st of September to find that I have NO internet connectivity at all. It’s like DSL isn’t even enabled on the line, my router makes NO attempt to connect, the DSL light is just off – it doesn’t even flash.

I phone Orcon who, after getting me to reset the modem, unplug all my phone equipment and do a series of other silly checks decide the Chorus engineer must have got something wrong and log a fault with Telecom.

I called Orcon yesterday to find out what was going on… they’re still waiting on Telecom. I still have no internet connection at home at all.

I found this morning that I had an email in my Orcon email account (accessed via web mail at work) congratulating me on joining their fantastic service and that I would now be able to experience their terrific broadband.

I guess I should be thankful my phone still works !

At least I can still blog, because I use an offline tool (Windows Live Writer) to write the entries and my bosses don’t mind me spending the 2 seconds it take to publish an entry, at work, that I’ve written previously outside of work hours.

“Dilbert” on Extreme and Agile Programming — Global Nerdy

A friend of mine saw this at and passed it on. I thought it was too hilarious not to share...

“Dilbert” on Extreme and Agile Programming — Global Nerdy

Wednesday, September 02, 2009

What’s Wrong With Cell Phone UI, Part 2

In my last post I talked about the differences between my new phone (a Nokia E66) and my old phone (a Nokia 6125), but the text messaging user interface has been broken for longer than that.

On my original phones, a Nokia 5110 and a Nokia 3315, the text message user interface was brutally simple and wonderfully useable. Since then cell phone manufacturers have insisted on cramming in more and more features, and the extra features have broken the usability.

On the earlier phones the process to send a text message was simple and fast. Once you got into the text messaging system you selected new message with the navi-key, which then took you to a blank screen where you wrote the content of your message. When you’d finished the message you pushed the navi-key which then brought up the ‘send to’ screen where you could key a phone number to send the message to. Pressing the navi-key while the field was empty brought up your contacts list where you selected a contact and then pressed the navi-key again, then either sent the message to that contact or returned to the previous screen where you pressed the navi-key one more time to send the message. Virtually everything you did was done with the navi-key and maybe the up and down arrows, except for the actual typing of the message.

Apart from the near one-button send, and important thing to note is the order in which you were asked to do things. The very first screen was the message editor. Maybe I’m once again out of step with the rest of the world but when I want to send a text message to someone what I’m thinking about is the message content, not who I’m going to send it to. Either I’ve already decided who I’m sending the message to, in about a nanosecond while I was still picking up the phone, or I’m going to send it to multiple people and I generally have a good idea who those people will be but am not yet up to the point of thinking about specific individuals.

On the modern phones when I go into a new text message and it asks me who I want to send the message to, my concentration is broken. I either end up entering garbage into the destination field because I’m trying to type the message content which is then coming out as numbers, or my train of thought which was on what I wanted to say is interrupted with the need to think about who to send the message to. This isn’t good for usability, and it’s annoying.

Of course the reason for this is they’ve added a feature where you can send a single message to multiple people at once. That’s a"80 percent of the time I just want to send a message to one person. In fact, it’s probably more like 99% of the time." nice feature once in a while but the 80/20 rule has been violated, 80 percent of the time I just want to send a message to one person. In fact, it’s probably more like 99% of the time. The problem is that when you’re in the field to say who to send the message to the navi-key has to bring up the contacts list every time, it can never tell whether you want to send the message or pick another contact. Of course they could have used a different key for one function or the other, but they probably felt that broke the one-button model they were trying for. So instead, they moved the send to field to the first part of the edit screen, so now after selecting a contact you move down to the edit field and when you’re there the navi-key knows you don’t want to pick a contact so instead it can default to sending the message. They avoided breaking the interface in two ways, and instead broke it in a third.

I would personally (vastly) prefer if the message editor came first, then the send to field. If I pressed the navi-key in the send to field it could send the message and one of the other keys could be used to add additional contacts to the message destination. Even if the phone came configured the other way and I could change a setting to make it work the way I want, I’d be happy.

That’s not the only problem with modern phones. With one of my previous phones, when I received a text message and then chose to reply, it would ask how I wanted to reply. Excuse me ? What ? How do you think I want to reply to a text message ? By text message of course !

My phone would offer me a choice of text message, mms, phone call, email or fax. I never, ever sent emails or faxes from my phone, in fact I didn’t have the services enabled to do so but it still gave me those options every time. About one time in a thousand I might want to reply to a text message by phoning someone… again we’re back to the 80/20 rule, it would have been better for there to have been an extra item in the ‘Options’ menu that was ‘use number’ or ‘call back’ rather than asking me on every message whether I wanted to do this.

Although the user interface is different again, this is still a problem on the E66. When I hit the navi-button on a text message I’m reading I get a menu where the first option is Call, which expands to voice or video. The second option down is Reply (how dumb is that?) and that expands to text, multimedia or audio message (yet another option I have never, ever used).

I cannot tell you how much I hope someone from Nokia reads this and decides to make some changes. I don’t particularly like text messaging but thanks to my friends I do plenty of it and it’s getting more painful with every new phone (even when I don’t buy a Nokia, I’ve actually gone back to buying Nokia’s because they’re better than the other makes I’ve had).

Tuesday, September 01, 2009

Why Cell Phone Software Developers Need To Read A User Interface Book

I recently got a new phone, a Nokia E66. For the most part it’s a great phone, but it’s missing a couple of features in the text messaging system that really annoy me, and the text messaging user interface is still broken the same way it has been since the 3315 model back in the 90’s.

I’m not just picking on Nokia either, I’ve had several Samsung phones that were terrible, and I haven’t been all that impressed with what I’ve seen of other makes either.

In this post I’m just going to talk about the two features missing from the E66 that were in my previous model, a 6125. I’ll make another post later on why the user interface has gone down hill since the 3315.

The two features I miss in the E66 are;

    (graphical) Smiley’s
    Recent Contacts list

I never used to be a huge fan of smiley’s, they are silly and often seen to be unprofessional. The thing is though, they actually solve a communication problem by allowing you "If you put a smiley with its tongue poking out after a sarcastic comment it’s much less likely someone will mistake you for being serious." to express the tone of your message without having to re-word it or write more than is necessary to communicate your point. Texting is not generally a pleasant experience, even with mini qwerty keyboards on the phones and predictive texting it’s still fairly painful to type a message of any size, so short messages are good. However short messages can also come across as terse or angry, and other ‘tones’ such as sarcasm can be hard to pick sometimes, especially if the recipient doesn’t know you well. Smiley’s solve these problems, if you put a smiley with its tongue poking out after a sarcastic comment it’s much less likely someone will mistake you for being serious.

The E66 doesn’t support smiley’s, I’m presuming because it’s a ‘business’ phone and smiley’s are seen as something that professionals don’t need or use. There are two problems here; first, professionals and business people will often use one phone regardless of who they’re contacting, so if they’re texting their wife, friend or colleague then they might not be concerned with how professional it looks. Secondly, using a smiley and looking a little unprofessional can often be much better than not using one an accidentally causing offense because someone misreads the intent or tone of your message.

Of course I can add non-graphical smiley’s by inserting a : and a ) or (, but inserting symbols is also more painful than on my old phone. Luckily I’ve found that by pushing the 1 key twice it will put in a smiley for :) and pressing the * key changes it to a frownie :(. At least there’s a shortcut for those two.

The lack of a ‘Recent Contacts List’ is an even bigger annoyance for me. On my last phone when I chose to browse for a contact to send a text message to, I was first asked if I wanted to browse ‘recent contacts’ or my ‘phonebook’. If I selected recent contacts then I was shown a list of people I had recently texted or called. Since I have around 100 entries in my phone book but I regularly only text two or three people, that was really useful. If someone I didn’t text often called me about a job and I wanted to text them back later to let them know the job was done, then I could easily select that contact with a minimum number of key presses because they would be in the recent list.

My new phone doesn’t have this so to text my best friend, whose name is Stephen (Steve in my contacts), the old process was; press the navi-key once to say browse, press again for recent contacts and then either press it again to select him or press down once or twice and then press the navi-key to select him. That’s a total of about 5 key presses in a worst case scenario, and 3 of them were all the same button.

On my new phone I have to; press the navi key to select a contact, press the 7 key four times for S, which gets me to ‘Sally’, then press the 8 key for T then press the navi key.. that’s 6 key presses every time I need to select him, and at least three different keys.

Or it would be, if my new phone searched by first name then surname, but it doesn’t. It does a partial search for names that contain that letter sequence anywhere in the name. That means that when I type ST to find Steve, I get everyone who’s last or first name is Stewart, Stephanie, Stubbs, contains the word Customer (as in XYZ Customer Service), or any other string that contains ST. That’s confusing both because every other phone I’ve had has searched by first name then surname. Even though Steve is in the list, he’s way down the bottom… so I add E to ST, and then I still get Stewarts etc. I have to type all the way to STEV or STEP depending on how the name is spelt until I actually find a Stephen/Steven.

Of course all of this is assuming that I don’t make an mistake and hit the wrong button or press one too many times, in which case I either have to press it several more times to get back to the character I want, or hit the delete key and then start the character over again.

So all in all that portion of my new phone is a big step backwards in terms of usability. Of course, it’s  not the first step backwards… more on that next time.