<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-11245041</id><updated>2012-02-06T03:18:50.147-06:00</updated><title type='text'>The Oswald Project</title><subtitle type='html'>Anatomy of an Embedded Software Project</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11245041.post-113390840744657337</id><published>2005-12-05T22:20:00.000-06:00</published><updated>2005-12-06T16:34:46.253-06:00</updated><title type='text'>Now we are experiencing technical difficulties. (Please stand by)</title><content type='html'>Unfortunately, the &lt;a href="http://www.ripway.com"&gt;image hosting&lt;/a&gt; service I used had a policy unbeknownst to me whereby any accounts not logged into for 30 days would be deleted.  Pretty stringent, if you ask me, but I probably agreed to it in that 3x5 window somewhere.&lt;br /&gt;&lt;br /&gt;I'm in the process of recovering lost files and images, but I may have to recreate most of them.  It feels ironic, happening to someone who so frequently stresses to others the importance of multiple backups.&lt;br /&gt;&lt;br /&gt;"Jesus saves.  You should, too," my old college computer science professor used to say.  I heartily agree, but every so often I am reminded of the statement's truth in a painful way.&lt;br /&gt;&lt;br /&gt;As the old saying goes, the weight of the lesson is akin to the pain of the mistake.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-113390840744657337?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/113390840744657337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=113390840744657337' title='124 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/113390840744657337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/113390840744657337'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/12/now-we-are-experiencing-technical.html' title='Now we are experiencing technical difficulties. (Please stand by)'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>124</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-112247984390662061</id><published>2005-07-27T10:50:00.000-05:00</published><updated>2005-07-27T10:57:23.910-05:00</updated><title type='text'>We are experiencing non-technical difficulties.  Please stand by...</title><content type='html'>For those wondering where my posts have gone, please be patient.  Back in the real-life timescale (July), my wife and I had a healthy son, my mother-in-law unexpectedly passed away and my sister was lavishly married.  I've been rather busy and I'll continue as time allows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-112247984390662061?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/112247984390662061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=112247984390662061' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/112247984390662061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/112247984390662061'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/07/we-are-experiencing-non-technical.html' title='We are experiencing non-technical difficulties.  Please stand by...'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111965109357998417</id><published>2005-06-27T22:20:00.000-05:00</published><updated>2005-06-28T09:42:02.203-05:00</updated><title type='text'>Lines with Endcaps in Windows CE (3 of 3)</title><content type='html'>&lt;i&gt;(We now return to our regularly scheduled programming.  I believe we were still in February discovering lines with endcaps...)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Previously:&lt;/b&gt; &lt;a href="http://oswaldproject.blogspot.com/2005/06/lines-with-endcaps-in-windows-ce-2-of.html"&gt;Hatched brushes worked great...every 8th pixel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After flailing about for a while I discovered polygons.  That isn't to say I'd never heard of &lt;a href="http://www.andrews.edu/~calkins/math/biograph/199899/bioarch.htm#bio"&gt;Archimedes&lt;/a&gt; and triangles before, I just hadn't thought about his work in terms of my problem.&lt;br /&gt;&lt;br /&gt;And the problem was easy, too.  In any line that had a fixed width, the shape of the line was merely a &lt;code&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemfc/htm/cdc_63.asp"&gt;Polygon&lt;/a&gt;()&lt;/code&gt; with its end vertices shaped to look like semi-circles.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://home.ripway.com/2005-3/273114/polygon.gif" border=0 alt="Pixel-level polygon" width=301 height=157&gt;&lt;br&gt;&lt;i&gt;Above: a 5-pixel high polygon on your monitor under an electron microscope&lt;/i&gt;&lt;/center&gt;&lt;br /&gt;To break it down even farther (at a pixel-level) a "rounded glue line" was just a &lt;code&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemfc/htm/cdc_63.asp"&gt;Polyline&lt;/a&gt;()&lt;/code&gt; where the lines in the middle extended a pixel or two past the lines at the top and bottom, like a snaking connect-the-dots viewed from across the room.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://home.ripway.com/2005-3/273114/polyline.gif" border=0 alt="Pixel-level polyline" width=301 height=157&gt;&lt;br&gt;&lt;i&gt;Above: Refocusing our massive scanning &lt;a href="http://www.answers.com/electron%20microscope"&gt;electron microscope&lt;/a&gt; on a 5-pixel high polyline instead&lt;/i&gt;&lt;/center&gt;&lt;br /&gt;Having two equally promising prospects meant putting both to the test.  I set up a simple test of my idea, the meat of which is listed below:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#define POLYGON_POINTS 8&lt;br /&gt;#define POLYLINE_POINTS 10&lt;br /&gt;   &lt;br /&gt;DrawGlueLine(...) {&lt;br /&gt;CPoint polyPts[POLYLINE_POINTS];&lt;br /&gt;...&lt;br /&gt;   &lt;br /&gt;if (m_polygon)&lt;br /&gt;{&lt;br /&gt;   nCount = POLYGON_POINTS;&lt;br /&gt;&lt;br /&gt;   polyPts[0].x = rect.left+1;  polyPts[0].y = rect.top;&lt;br /&gt;   polyPts[1].x = rect.right-1; polyPts[1].y = rect.top;&lt;br /&gt;   polyPts[2].x = rect.right;   polyPts[2].y = rect.top+1;&lt;br /&gt;   polyPts[3].x = rect.right;   polyPts[3].y = rect.top+3;&lt;br /&gt;   polyPts[4].x = rect.right-1; polyPts[4].y = rect.top+4;&lt;br /&gt;   polyPts[5].x = rect.left+1;  polyPts[5].y = rect.top+4;&lt;br /&gt;   polyPts[6].x = rect.left;    polyPts[6].y = rect.top+3;&lt;br /&gt;   polyPts[7].x = rect.left;    polyPts[7].y = rect.top+1;&lt;br /&gt;   &lt;br /&gt;   pDC-&gt;Polygon(polyPts, nCount);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;   nCount = POLYLINE_POINTS;&lt;br /&gt;   polyPts[0].x = rect.left+1;  polyPts[0].y = rect.top;&lt;br /&gt;   polyPts[1].x = rect.right-1; polyPts[1].y = rect.top;&lt;br /&gt;   polyPts[2].x = rect.right;   polyPts[2].y = rect.top+1;&lt;br /&gt;   polyPts[3].x = rect.left;    polyPts[3].y = rect.top+1;&lt;br /&gt;   polyPts[4].x = rect.left;    polyPts[4].y = rect.top+2;&lt;br /&gt;   polyPts[5].x = rect.right;   polyPts[5].y = rect.top+2;&lt;br /&gt;   polyPts[6].x = rect.right;   polyPts[6].y = rect.top+3;&lt;br /&gt;   polyPts[7].x = rect.left;    polyPts[7].y = rect.top+3;&lt;br /&gt;   polyPts[8].x = rect.left+1;  polyPts[8].y = rect.top+4;&lt;br /&gt;   // Polyline draws up to the last x-pixel - 1, so&lt;br /&gt;   // draw 1 pixel farther&lt;br /&gt;   polyPts[9].x = rect.right;   polyPts[9].y = rect.top+4;&lt;br /&gt;   &lt;br /&gt;   pDC-&gt;Polyline(polyPts, nCount);&lt;br /&gt;}&lt;br /&gt;   &lt;br /&gt;...&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;Under the emulator, both polylines and polygons drew equally well (and equally fast).  But when I ran the demo on the physical device the polylines blew the polygons away.  I suspect it was for two reasons: the polygon fill was slow, and the polyline optimized itself to draw five lines instead of the nine I plotted.  (Four of the nine lines are just "steps" to the next level.  They have an effective length of zero.)&lt;br /&gt;&lt;br /&gt;Also, the lines were extremely fast.  On the actual device I drew 480 polylines every redraw no slower than drawing as many normal lines.  Flexible these lines were not.  But flexibility wasn't one of the original requirements.  I needed lines that would look like a line of glue and draw extremely fast.  On both those counts this solution fit the bill.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Moral of the story:&lt;/b&gt; I knew that I would have to go outside my toolbox to solve the problem, but I didn't know that my screwdriver would make an excellent wrench, so to speak.  It turned out that it wasn't noticeably slower to draw nine (or five) lines that appeared to look like a line with circle endcaps than to draw one plain line.&lt;br /&gt;&lt;br /&gt;I also benefited from simplifying the problem.  I didn't need to draw a line at an arbirtrary width with circles of an arbirtrary radius on each end.  I just needed to draw a specific-sized line.  And for my specific problem I found a specific solution.&lt;br /&gt;&lt;br /&gt;&lt;table cellspacing=0 cellpadding=2 border=0&gt;&lt;tr align="left" valign="center"&gt;&lt;td&gt;&lt;img src="http://home.ripway.com/2005-3/273114/zip.gif" width=16 height=16 alt="ZIP"&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://home.ripway.com/2005-3/273114/PolyTest.zip"&gt;PolyTest.zip&lt;/a&gt; (eVC 4.0 project compiled for 4.2 standard SDK)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111965109357998417?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111965109357998417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111965109357998417' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111965109357998417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111965109357998417'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/06/lines-with-endcaps-in-windows-ce-3-of.html' title='Lines with Endcaps in Windows CE (3 of 3)'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111988590553983550</id><published>2005-06-26T23:05:00.000-05:00</published><updated>2005-06-27T12:01:44.746-05:00</updated><title type='text'>Antonia</title><content type='html'>When I started writing here I told myself that this would be a work-only blog.  If I wanted to write anything personal, I thought, I would do it in another blog, and not under a pseudonym.  In that regard, I've been about as successful as the Chicago &lt;a href="http://www.billygoat.org/curse.html"&gt;Cubs&lt;/a&gt; at the World Series.  But some things are as important in the history of this project as any technical detail, and this record would be less of one for not having included them.&lt;br /&gt;&lt;br /&gt;So fast-forwarding for a moment to the present, today in real life marks the sixth anniversary of my marriage to Antonia, a beautiful woman that I don't deserve to have.  Five other anniversaries have come and gone, and I wonder what compels me to write this on our sixth.&lt;br /&gt;&lt;br /&gt;What compels me is that I love her.&lt;br /&gt;&lt;br /&gt;When I was a child, I would ask my parents how they knew that they had found "the right one."  I'm not sure why I wondered about those things, but I did.  The unsatisfactory answer that I always received was that "they just knew."  Unhappy with their response, I would usually ponder it for a few seconds, then go play with my Legos.&lt;br /&gt;&lt;br /&gt;It wasn't until I met Antonia I understood what they meant.  I didn't understand it right away, but when the time came that I was free of any logical or emotional reasons why I should choose to spend the rest of my life with her—and there were many—I came to the place where I just knew.  She was pretty, she was a lady, she was smart and she was the cutest thing in the world.  But apart from that, I knew that I needed to spend the rest of my life with this woman.&lt;br /&gt;&lt;br /&gt;Of all the choices that I've made, very few have been choices that set my life's course.  It's comforting to know that the important decisions have been accompanied by the calm confidence of knowing that it they were the right decisions.&lt;br /&gt;&lt;br /&gt;Antonia, you are not only the best thing that has ever happened in my life, you are the best thing that &lt;b&gt;will ever&lt;/b&gt; happen in my life.  I sometimes think that if you hadn't come across me, you would've been just fine.  But if I hadn't found you, I would still be lost—a ship without a course, or a rudder to steer by even if it had one.&lt;br /&gt;&lt;br /&gt;I'm glad to have found you, glad to see where we're headed, glad that our anchors are weighed and our course is set.  There's no one I'd rather sail this voyage with but you, and nowhere I'd rather go than where you are.&lt;br /&gt;&lt;br /&gt;Forever your love,&lt;br /&gt;D.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111988590553983550?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111988590553983550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111988590553983550' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111988590553983550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111988590553983550'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/06/antonia.html' title='Antonia'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111954443558938076</id><published>2005-06-22T23:28:00.000-05:00</published><updated>2005-06-28T11:18:39.180-05:00</updated><title type='text'>Lines with Endcaps in Windows CE (2 of 3)</title><content type='html'>&lt;b&gt;Previously:&lt;/b&gt; &lt;a href="http://oswaldproject.blogspot.com/2005/06/lines-with-endcaps-in-windows-ce-1-of.html"&gt;Circles are expensive&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It occurred to me that we might try using &lt;code&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemfc/htm/cbrush_5.asp"&gt;CreatePatternBrush&lt;/a&gt;()&lt;/code&gt; to draw the semi-circles on each end of the line.  Normally a pattern brush uses a (small) bitmap to repeat a pattern, but its original use was to create a hatched bit-pattern brush.&lt;br /&gt;&lt;br /&gt;These are like &lt;a href="http://www.mcescher.com/Gallery/symmetry-bmp/E124.jpg"&gt;tessellations&lt;/a&gt;, and are the same repeating patterns that you can play with in Display Properties, Background (none), &lt;a href="http://www.microsoft.com/enable/training/windows98/wallpaper.aspx"&gt;Pattern&lt;/a&gt;.  If you've ever worked with a bit-pattern brush before you know how difficult it is drawing on a flat canvas and trying to predict how it will look like, in effect, stretched over a globe.  Fortunately, preview windows usually take the guesswork out of things.&lt;br /&gt;&lt;br /&gt;With a few lines of test code I had a sample up and running:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;c_test.UpdateWindow();&lt;br /&gt;CDC* pDC = c_test.GetDC();&lt;br /&gt;&lt;br /&gt;// Create a hatched bit pattern&lt;br /&gt;WORD hatchBits[8] =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0x87, 0x03, 0x03, 0x03,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x87, 0xff, 0xff, 0xff };&lt;br /&gt;&lt;br /&gt;// Use the bit pattern to create a bitmap&lt;br /&gt;CBitmap bmp;&lt;br /&gt;bmp.CreateBitmap(8, 8, 1, 1, hatchBits);&lt;br /&gt;&lt;br /&gt;// Create a pattern brush from the bitmap&lt;br /&gt;CBrush brush;&lt;br /&gt;brush.CreatePatternBrush(&amp;bmp);&lt;br /&gt;&lt;br /&gt;// Select the brush into a device context and draw&lt;br /&gt;CBrush* pOldBrush =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(CBrush *)pDC-&gt;SelectObject(&amp;brush);&lt;br /&gt;&lt;br /&gt;CRect rect;&lt;br /&gt;c_test.GetClientRect(&amp;rect);&lt;br /&gt;pDC-&gt;FillRect(&amp;rect, &amp;brush);&lt;br /&gt;&lt;br /&gt;// Restore the original brush&lt;br /&gt;pDC-&gt;SelectObject(pOldBrush);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It worked great!  All I needed to do was separate the brushes into a right half and a left half and draw my line ends.  I started experimenting with some more brushed lines all over the screen.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://home.ripway.com/2005-3/273114/brushTest.gif" border=0 alt="Hatched brush test" width=112 height=56&gt;&lt;br&gt;&lt;i&gt;Above: the hatched brush test with the endcaps conveniently located on 8-byte boundaries&lt;/i&gt;&lt;/center&gt;&lt;br /&gt;Uh oh.  When I moved the start point to a physical (x,y) location that wasn't a multiple of 8 the brush drew a deformed circle.  Since the glue lines could occur at any point in a carton, only drawing them in predefined spots that were multiples of 8 wasn't going to work.&lt;br /&gt;&lt;br /&gt;I had a few more ideas, including dynamically modifying the brush depending on where it was going to be drawn.  But it was too complicated a solution for this kind of problem.  I tried a few more things until I was pretty convinced that I was at a dead end.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; At the time I didn't know there was a &lt;code&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/brushes_9c1k.asp"&gt;SetBrushOrgEx&lt;/a&gt;()&lt;/code&gt; (&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcegmm/html/wcegmm_Working_with_Brushes.asp"&gt;WinCE&lt;/a&gt;), which can be used to keep a pattern aligned.  My ignorance serendipitously led to finding a better solution.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Next time:&lt;/b&gt; &lt;a href="http://oswaldproject.blogspot.com/2005/06/lines-with-endcaps-in-windows-ce-3-of.html"&gt;An unexpected solution&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111954443558938076?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111954443558938076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111954443558938076' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111954443558938076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111954443558938076'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/06/lines-with-endcaps-in-windows-ce-2-of.html' title='Lines with Endcaps in Windows CE (2 of 3)'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111955860888708816</id><published>2005-06-22T22:45:00.000-05:00</published><updated>2005-06-23T15:49:24.003-05:00</updated><title type='text'>Keeping the Home Fires Burning</title><content type='html'>I'd be remiss not to mention the support system that kept me going till this point in the Oswald Project.  Some might say that I'm doing too much "mentioning" of things non-technical, but I'll return to the esoteric details of CE development soon enough.  There will always be more software projects; these are the things that are important.&lt;br /&gt;&lt;br /&gt;When I was unmarried and my only bills worth mentioning were car insurance and gas, I was happy to work long hours for the sake of working.  The reward of a good job to me was to have done it well.  Sometimes I even pulled all-nighters at work for no apparent reason other than that the work was there to do, and I liked to do it.  (Dick Buckzan, a machinist who starts his day at an ungodly hour, still laughs at me about coming in one morning and finding me slumped over my keyboard at my desk.)&lt;br /&gt;&lt;br /&gt;A decade later my “lifescape” has widened from a narrow slice of the spectrum to a panorama of responsibilities.  I'm blessed and fortunate to have wooed a wonderful wife, found a nice home and fathered a beautiful son (his brother is on the way).  But these blessings are also responsibilities, and in the workplace that translates into less hours in order to lead a more balanced life.&lt;br /&gt;&lt;br /&gt;With the Oswald Project, that changed.  I was thrust into a schedule that would've been unsustainable by myself.&lt;br /&gt;&lt;br /&gt;My savior was Antonia.  Despite working part-time as an accountant in tax season, she made the time to bring me lunches and dinners.  She kept the household running and did the job of two parents.  I don't know how she found the time to do it all.&lt;br /&gt;&lt;br /&gt;She became a den mother to my team, well known around the office for arriving bundled with dinner, drinks and a child in tow.  George and Ted enjoyed her company, and her presence always lowered our stress level a notch or two.  Later, when we discovered the joy of working on our laptops in my living room with a crackling fire and wireless internet access&lt;sup&gt;1&lt;/sup&gt;, she made sure that the area was always clean and work-ready.&lt;br /&gt;&lt;br /&gt;It's rare to see the man who receives a lifetime award who doesn't think his wife, family and those around him who made his accomplishments possible.  Without support systems like those it's infinitely harder to accomplish much at all.  I'm not winning any awards or recognition, but even in my small corner of the world, my small achievements are due in no small part to those that I rely on.&lt;br /&gt;&lt;br /&gt;Thanks, Antonia.  There's no one I'd rather rely on than you.&lt;br /&gt;&lt;br /&gt;[1] The CE emulator using the TCP/IP transport requires an IP address to communicate with eVC/Platform Manager.  This means either being online or installing a &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;839013"&gt;loopback adapter&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111955860888708816?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111955860888708816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111955860888708816' title='68 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111955860888708816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111955860888708816'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/06/keeping-home-fires-burning.html' title='Keeping the Home Fires Burning'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>68</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111818041884898620</id><published>2005-06-09T23:40:00.000-05:00</published><updated>2005-06-10T14:09:41.806-05:00</updated><title type='text'>To De-Feature or Not</title><content type='html'>Worked continued at a frenetic pace through February, although it became more apparent at the end of each day there were less days remaining than the amount of work.  Still, we pushed forward with our double-shift days.&lt;br /&gt;&lt;br /&gt;I found some solace, oddly, in winning &lt;a href="http://search.ebay.com/trinkets_W0QQfkrZ1QQfromZR8"&gt;trinkets&lt;/a&gt; on eBay auctions.  At least it took my mind off of other things for a few minutes.  The actual thrill was probably more in bidding at the last second than in buying anything.  I &lt;a href="http://auctioninsights.com/ebay-snipe.html"&gt;sniped&lt;/a&gt; in with two seconds left and won a weather station (thermometer, barometer, hydrometer).  It arrived with the dials permanenty set to 74&amp;deg; F, 30.5 inches and 30% humidity.  But it looked nice so I hung it on the wall anyway.  My auctioneering activities won me a reminder from Antonia that such pursuits had a very low &lt;a href="http://www.google.com/search?hl=en&amp;q=wife+acceptance+factor"&gt;wife acceptance factor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Around mid-month even the most optimistic of the project backers could see the &lt;a href="http://www.answers.com/writing+on+the+wall&amp;r=67"&gt;writing on the wall&lt;/a&gt;, so a meeting was called to de-feature the program for a workable, but not as comprehensive, demo.  Victor asked the most senior engineer, a 20-year employee, to sit in on the meeting and help make the difficult decisions.&lt;br /&gt;&lt;br /&gt;I made up a list of about 65 major features that we were working on and asked everyone which ones we should pull out for the demo.  We went over nearly every one, and each time someone voiced a reason why that particular feature should stay in.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Me:&lt;/b&gt; Okay, how about Shuttle Test on the Microwave sensor screen&lt;br /&gt;&lt;b&gt;Someone 1:&lt;/b&gt; Oh, no.  We need that if we're going to have Microwave.&lt;br /&gt;&lt;b&gt;Someone 2:&lt;/b&gt; If we pull that out we'd have to pull out Activate Shuttle as well.&lt;br /&gt;&lt;b&gt;Someone 1:&lt;/b&gt; Yeah, we can't do that.&lt;br /&gt;&lt;b&gt;Me:&lt;/b&gt; Okay, we'll leave it in.  How about Tolerance on the Pattern screens?&lt;br /&gt;&lt;b&gt;Someone 3:&lt;/b&gt; Wait, we can't pull &lt;b&gt;that&lt;/b&gt; out!&lt;br /&gt;&lt;i&gt;Et cetera.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;About an hour and a half later, we ended the meeting.  We had pulled out exactly two and a half features.&lt;br /&gt;&lt;br /&gt;Still, timelines and features aside, I thought the project was looking up.  Some major pieces were starting to fit together and we were making very good progress.  We still weren't going to be anywhere close to our deadline, but we were making progress.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111818041884898620?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111818041884898620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111818041884898620' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111818041884898620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111818041884898620'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/06/to-de-feature-or-not.html' title='To De-Feature or Not'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111842260457855217</id><published>2005-06-09T22:49:00.000-05:00</published><updated>2005-06-23T15:48:15.506-05:00</updated><title type='text'>Lines with Endcaps in Windows CE (1 of 3)</title><content type='html'>I believe that two things are important in any craft: having good tools,  and knowing how to use your tools.  Having good tools means that you won't spend needless amounts of time doing things the hard way.  And knowing your tools means that you know which tool is the right tool for which job.  It also means that when none of the tools in your toolbox is the right one, it's time to improvise.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;i&gt;&lt;b&gt;Microsoft Windows CE .NET:&lt;/b&gt; Windows CE does not support user-specified endcap styles, such as PS_ENDCAP_ROUND.&lt;/i&gt;&lt;/center&gt;&lt;br /&gt;Messages like this are a pretty good indicator that it's time to go outside of the toolbox.  (For some reason it's also a great motivator for me; nothing gets my creative juices going like someone telling me they don't think I can do it.)&lt;br /&gt;&lt;br /&gt;So I set about coming up with alternative.  We were looking for a way to show glue lines.  They needed to look like glue lines, and they needed to draw very quickly.  In a worst-case scenario, we were drawing 24 patterns x 20 events per pattern = 480 lines, several times per second.&lt;br /&gt;&lt;br /&gt;We could've showed a glue pattern with a simple thick line &lt;img src="http://home.ripway.com/2005-3/273114/linePlain.gif" border=0 align="middle" alt="Plain line" width=102 height=6&gt;, but a line with an endcap &lt;img src="http://home.ripway.com/2005-3/273114/lineEndcap1.gif" border=0 align="middle" alt="Line with round endcaps" width=102 height=6&gt; looks much closer to what a bead of glue actually looks like.  It shouldn't be very hard, I thought.  A round endcap is simply a half-circle at the end of each line.  &lt;img src="http://home.ripway.com/2005-3/273114/lineEndcap2.gif" border=0 align="middle" alt="Breakdown of line with round endcaps" width=102 height=13&gt;  Even simpler, since CE doesn't support drawing arcs, a round endcap was simply a &lt;b&gt;full&lt;/b&gt;-circle at the end of each line.&lt;br /&gt;&lt;br /&gt;I wrote up a &lt;code&gt;DrawGlueLine()&lt;/code&gt; function for our main dialog class to include two circles at the each end of a filled rectangle as the dimensions for a line.&lt;br /&gt;&lt;br /&gt;Unfortunately, drawing circles is computationally expensive, and the performance was nowhere close to being fast enough.  I considered other algorithms.  The Abrash/&lt;a href="http://groups-beta.google.com/group/comp.lang.asm.x86/msg/dccf93dbca607241?hl=en"&gt;Hardenbergh&lt;/a&gt; integer-only circle algorithm draws circles much more quickly, but implementing an x86 assembly (which I'm not very good at) routine just to draw endcaps seemed like overkill.&lt;br /&gt;&lt;br /&gt;So, it was back to the drawing board.  At least we knew what &lt;b&gt;didn't&lt;/b&gt; work.  As &lt;a href="http://www.thomasedison.com"&gt;Thomas Edison&lt;/a&gt; told a reporter in 1879, "I have not failed 5,000 times.  I have successfully discovered 5,000 ways that do not work and I do not need to try them again."&lt;br /&gt;&lt;br /&gt;We had found way #1 that did not work.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Next time:&lt;/b&gt; &lt;a href="http://oswaldproject.blogspot.com/2005/06/lines-with-endcaps-in-windows-ce-2-of.html"&gt;Simplyfing the problem and trying again&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111842260457855217?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111842260457855217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111842260457855217' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111842260457855217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111842260457855217'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/06/lines-with-endcaps-in-windows-ce-1-of.html' title='Lines with Endcaps in Windows CE (1 of 3)'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111816606277086203</id><published>2005-06-06T00:40:00.000-05:00</published><updated>2005-06-09T10:54:16.230-05:00</updated><title type='text'>Meetings on Meetings</title><content type='html'>The next day Victor held an early meeting about the project.  He wanted to know what our day's plans were and if we had any obstacles.  Then we talked about other parts of the program.  And then we talked about future features, and things that we might do sometime in the future.  Two hours later we were ready to get started on the day.&lt;br /&gt;&lt;br /&gt;The next day we had another meeting, and the day after that.  Over the course of the next few weeks we spent 100 or so man-hours having meetings about how the project more productive.&lt;br /&gt;&lt;br /&gt;I'm not a big fan of meetings for the sake of having a meeting.  I realize that on any large project, meetings tie the principal participants together and keep everyone appraised of its status.  And having many great minds in the same room brainstorming is a thing of wonder.  But I prefer a meeting with a set topic and duration.  Unfortunately, my preferences weren't the driving force behind our meetings.  I haven't worked at a company yet where someone told the president that his meeting was wasting time and he was talking about irrelevant things.  So we kept having meetings.&lt;br /&gt;&lt;br /&gt;One day, Rutherford called me into his office.  He had a strange habit: he would walk through the engineering department without saying anything.  A few moments later, Stasi style, one of us would get a call from his office asking to stop by.&lt;br /&gt;&lt;br /&gt;His sentences were steeped in bureaucratic style and usually began with steepled fingers, pursed lips, and an opening of "as you know..." or "moving forward..."&lt;br /&gt;&lt;br /&gt;"As you know, we've all been working very hard on this project," he started, predictably.  "We've also made an international commitment to a major vendor that this project is very, um, important to."&lt;br /&gt;&lt;br /&gt;He paused awkwardly.  I said nothing, wondering where he was going.  And since the awkward pause was his own, I left him on the hook.  He looked around, then continued, "Moving forward, if you can, uh, get this project finished by our deadline, we'd like to pay for you and, um, Antonia to have a nice meal downtown, and maybe spend the night."&lt;br /&gt;&lt;br /&gt;He smiled, as if he had just offered to double my salary.  I tried to decide whether I should be amused, offended or even grateful.  I think I ended up offused.&lt;br /&gt;&lt;br /&gt;"Well, thanks," I said lamely.  Then my jaw steeled, "We're working very hard on this project and we'll do the best we can."  I stood up and walked back to my desk.&lt;br /&gt;&lt;br /&gt;Later, I calld Antonia with the "great" news.  She was mad.  "For working 70 hour weeks they're offering you dinner and a hotel room?  How about a $10,000 bonus!"  I couldn't have agreed more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111816606277086203?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111816606277086203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111816606277086203' title='46 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111816606277086203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111816606277086203'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/06/meetings-on-meetings.html' title='Meetings on Meetings'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>46</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111716645057357955</id><published>2005-05-26T22:41:00.000-05:00</published><updated>2005-06-09T10:43:06.156-05:00</updated><title type='text'>The Ides of February</title><content type='html'>The first week of February turned out to be a really bad week.&lt;br /&gt;&lt;br /&gt;I was working on several parts of the project where we had seriously underestimated the amount of time they would take.  Added to that, Ted was taking too long on his tasks and needed more supervision than I had time to give.  And the end-of-February deadline, now just four short weeks away, loomed larger than ever in my mind.  All these factors compounded to exacerbate my worries, but I was relieved by the thought of my upcoming three-day weekend, a yearly family ski trip to visit my aunt and uncle in Vermont over Superbowl weekend.&lt;br /&gt;&lt;br /&gt;A group of a customer's operators were traveling to Relay Corp. for a week of training so I arranged to have Ted sit in on the training for two days.  It was expensive for us to pay for his time while he didn't work on the project, but it was worth it to get him up to speed on our business.  At least it got him to stop calling our technology "widgets."&lt;br /&gt;&lt;br /&gt;Late in the week Rutherford let us know that we had a meeting with Victor Relay, the President, about the timeline.  (It was typical for him to let us in on meeting dates with about 15 minutes to prepare.  I've always suspected it was to give himself a preparedness advantage.)  I was enthused that we would finally be able to talk about our timeline concerns and project struggles.  Our Engineering Dept. felt warm, so I grabbed a drink of water.  I wasn't sure if it was pre-meeting jitters or our cantankerous HVAC acting up again.&lt;br /&gt;&lt;br /&gt;Victor started the meeting with a very open-ended question.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Well, how's the Oswald Project coming?" he asked, looking at me.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;I explained frankly: "Not so good.  We're running into some hurdles and it might mean that we'll miss our deadline."&lt;br /&gt;&lt;br /&gt;There.  I'd said it.  It felt good to get it in the open and off of my chest.  But surprisingly, Victor didn't follow it up.  He seemed more interested in talking about the nuances of the UI than about Our Big Problem.  He honed in on a particular part of the project that I had been working on, a representation of a &lt;a href="http://www.pulnc.com/page8.htm"&gt;folder-gluer&lt;/a&gt; with a symbol underneath it for every trigger position.  I explained that in order to finish the UI in the time allotted I had changed the spec from showing each trigger directly under its position on the folder-gluer.  The new method spaced out all triggers in a common area and drew a line from the trigger to its position on the gluer when it was selected.&lt;br /&gt;&lt;br /&gt;(In the design phase I had shown a mock-up screen with 4 nicely spaced triggers, but the actual software was supposed to be able to support up to 24 triggers.  Not that most installations shipped that way, but they &lt;i&gt;could&lt;/i&gt;.  There was no way to space 24 triggers directly beneath the folder-gluer.  Faced with an impossible specification, I changed it.)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;I tried to carry the conversation forward, but he tenaciously held onto this single UI point.  "That won't work!" he cried.  "How will operators know which trigger they're looking at?"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;He had a point, but so did I.  "They didn't know what trigger they were looking at in the mock-up, either," I countered.  "This isn't any different."&lt;br /&gt;&lt;br /&gt;But he wouldn't let it go.  I could feel myself getting more frustrated.  I stood up, grabbed a hanging whiteboard and put it sideways on the boardroom table.  I drew the screen and drew out my problem.  Aha!  I'd clearly illustrated why I was right and he was wrong, I thought.&lt;br /&gt;&lt;br /&gt;Rutherford quietly snuck out a side door, leaving his notes on the table as if he would come back.  It was the second time he'd made such an exit at an Oswald meeting.  He didn't return.&lt;br /&gt;&lt;br /&gt;This meeting was quickly getting out of hand.  Victor changed tack.  "I have an idea.  How about when the operator touches a trigger we draw the trigger number and the stations that it's assigned to over here," he proposed, gesturing towards an open area in my drawing.&lt;br /&gt;&lt;br /&gt;I stared at him blankly.  We didn't have a way of finding out what stations a trigger was assigned to, and what he was suggesting was about a week's worth of work.  "I don't think we have the time to try to put that in," I said weakly, wishing we could go back to talking about the timeline.  My arm-turned-easel was getting tired and my voice felt parched.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;He didn't let up.  "It's not too hard.  We could just draw it here and here," he pointed again to the whiteboard.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Victor, we can put it in, but then we won't have time to work on other things.  Besides, it wasn't in the spec."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"But I don't see what's so hard about it.  Besides, you &lt;i&gt;already&lt;/i&gt; changed the spec!"  He was incessant. &lt;br /&gt;&lt;br /&gt;That was it.  How could he not see how trivial this was?  "I changed the spec to make it easier, not harder!  Look, Victor!  This isn't important to the project.  It wasn't in the spec and it will take time to add it.  That's time we don't have.  The entire project is in danger of missing our timeline!"  Other people in the room became noticeably nervous, but I didn't care.  George, who was sitting next to me, tugged at my sleeve to try to get me to sit down.  "We're already working insane hours on this project without adding features to it.  This isn't the way the project was supposed to go.  This isn't what I signed up for!"&lt;br /&gt;&lt;br /&gt;There was a long, uncomfortable silence.  I was aware of how hot my head felt.  "Look," I said, softening, "In a perfect world it would be a nice feature to have.  But I don't see how we can put it in and do everything else and still meet our deadline."&lt;br /&gt;&lt;br /&gt;Victor nodded, and changed the subject.  We talked for a little while longer, and all agreed to meet with him the next day.  It was late.&lt;br /&gt;&lt;br /&gt;&lt;center&gt; - - - &lt;/center&gt;&lt;br /&gt;We got back to work--our 2nd shift--but later that evening Victor called and asked to see me.  I walked into his office, a large, well-furnished room the size of Antonia's and my first apartment.  I thought I knew what he was going to say but he surprised me.  Instead of discussing the obvious, he talked to me about leadership.  He pointed out that I had disillusioned my team and offered suggestions for building strong teams.  Usually, I would have soaked up that kind of advice.  But after our clash I was in no mood to learn.  I told him that I thought the project had a 1 in 3 chance of success, and we would do our best.  I left his office not knowing where the project was headed, and I wondered if he did, too.&lt;br /&gt;&lt;br /&gt;Regardless, at least I had my weekend to look forward to.&lt;br /&gt;&lt;br /&gt;The next day, after a fitful night's rest, I felt a little strange.  I went into work but my head was in a vice and my bones were being stretched on the rack.  Instead of Antonia picking me up at work on the way to the airport as planned, I drove home early take a nap and sleep it off.  When I woke up, my fever registered 103&amp;deg;.  We needed to leave immediately to catch the flight, but I could barely get out of bed, much less drive to the airport.  I was loath to cancel the trip, but we had no other option.&lt;br /&gt;&lt;br /&gt;Instead of swooshing down the snowy slopes I spent the weekend bottled up in bed.&lt;br /&gt;&lt;br /&gt;On Sunday, I unpacked my unused suitcase.  It was the symbol of an unrealized vacation, and combined with the knowledge that there would be no more vacations for a long time to come, it felt terrible.  That was one of the worst weekends of my life.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111716645057357955?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111716645057357955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111716645057357955' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111716645057357955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111716645057357955'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/05/ides-of-february.html' title='The Ides of February'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111711754774370135</id><published>2005-05-25T22:23:00.000-05:00</published><updated>2005-05-26T23:02:29.273-05:00</updated><title type='text'>This is the Part Where I Introduce Victor Relay</title><content type='html'>If there is a single reason why I still work at Relay Corp., it's Victor Relay.  Victor offered me my first job, a summer internship, while I was still in college in the mid 90's.  I accepted.  I didn't have a job description, but I was handy with computers and Relay was starting to move into the digital age, so I made myself useful and carved out a niche.  When I met Antonia that same summer and got a full-time offer that fall, I stayed.&lt;br /&gt;&lt;br /&gt;Victor taught me about business, about dealing with people and about life.  He wasn't just a boss, he was a mentor.  As Relay Corp. grew (I'm employee #7) to over 50 employees, including a London branch, Victor had less time to spend with me, but the time that he did was just as important.  When my salary came up for review last year I negotiated directly with Victor.  My direct boss at the time, Rutherford, was present only as a token to his position.&lt;br /&gt;&lt;br /&gt;Victor was a great motivator and leader.  As great bosses do, he made work more than just work.  Work became a place to better my skills and myself.  Since I loved the work anyway, I thrived.  I designed and developed an &lt;a href="http://www.answers.com/ERP"&gt;ERP system&lt;/a&gt; that ran the company.  When I decided to finish my Computer Science degree, Relay Corp. offered to pay my tuition.  (I didn't accept, but that was for other reasons.)  When Victor stopped by, it was to check on how I was doing, or if I needed better tools.  (I always needed better tools.)  If I had just returned from a vacation, he was genuinely interested in how my trip had been.&lt;br /&gt;&lt;br /&gt;I'm not alone in my adulation.  Many people at Relay would say the same thing.  So would people at Victor's church and in his personal life.  Victor's unique quality is that he makes people feel important.  No matter what he's doing, he always has time to talk.  And when he talks, he looks you in the eye, smiles and makes you feel like the most important person in the building.  Former President Bill Clinton was reported to have such a quality.  I've met only two or three other people like that in my lifetime.&lt;br /&gt;&lt;br /&gt;With his good looks, pleasant charm and mellifluous voice Victor could've made a run at anything and been successful.  But he chose to grow Relay Corp. and grow the people that worked there.&lt;br /&gt;&lt;br /&gt;Perhaps one day I'll own my own business.  If that happens, it will be to a large degree because of the influence that Victor has had on my life.  I will focus on my people, believe in my company and make others believe in my company, and lead by example like Victor.&lt;br /&gt;&lt;br /&gt;Here's to you, Victor.  I hope I grow up to be like you one day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111711754774370135?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111711754774370135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111711754774370135' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111711754774370135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111711754774370135'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/05/this-is-part-where-i-introduce-victor.html' title='This is the Part Where I Introduce Victor Relay'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111582405191168934</id><published>2005-05-10T23:52:00.000-05:00</published><updated>2005-06-09T10:08:00.453-05:00</updated><title type='text'>A Disheartening Discovery</title><content type='html'>January was a long, cold month.  Like a &lt;a href="http://www.doorbell.net/pbc/"&gt;Polar Bear Club&lt;/a&gt; member's inaugural dive, knowing in advance how much I was going to be working didn't prepare me for actually working that much.  George worked three days per week, so Mondays and Tuesdays (nights included) were our days to really shine.  As the nights wore on Ted worked alongside me out of loyalty, but he would eventually wear down and call it a night.&lt;br /&gt;&lt;br /&gt;Getting George to work more hours was like pulling teeth, and since he was training for an upcoming marathon he liked to go out for a nightly run.  I was envious that he was going out and taking care of his body while mine was slumped over a keyboard.&lt;br /&gt;&lt;br /&gt;I persuaded Rutherford to let the company reimburse me for working dinners.  This soon settled into a routine of &lt;a href="http://www.panera.com"&gt;Panera&lt;/a&gt; Monday, sandwich Tuesday and Chinese Monday.  By Thursday and Friday we were so exhausted we just worked late and went straight home.&lt;br /&gt;&lt;br /&gt;By midnights I was physically spent, but my mind wouldn't stop racing.  To fall asleep I started reading &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0029356717/"&gt;Showstopper&lt;/a&gt;, the chronicle of &lt;a href="http://www.answers.com/dave%20cutler"&gt;Dave Cutler&lt;/a&gt; and the development of &lt;a href="http://www.microsoft.com/presspass/features/1998/winntfs.asp"&gt;Windows NT from 1988 - 93&lt;/a&gt;.  As a software developer on a death march reading about other developers on their death march, it was remarkably prescient--and sometimes depressing--reading material.  Though I was falling asleep later and later, I found myself waking earlier and earlier, eager to get back to the project and implement a new idea.&lt;br /&gt;&lt;br /&gt;But even though our project productivity soared, it seemed as though outside events were conspiring against us.  Nitin, our new Systems Administrator, had been on the job about three months and was finally taking charge of all major systems.  But two mission-critical systems crashed badly one week, and as the resident expert on the systems (I had written one of them) I was called on to resurrect them.&lt;br /&gt;&lt;br /&gt;Also, the project's popularity was its own enemy.  Everyone wanted to see a demo of the mock-up screens I had done in &lt;a href="http://www.microsoft.com/office/visio/"&gt;Visio&lt;/a&gt;.  I wound up performing at least half a dozen demos of the software.  One for the field servicemen's annual meeting, one for the salesmen, one for visitors from our UK division, etc.  We even jury-rigged a complete demo controller running off of a laptop input for a trade show.&lt;br /&gt;&lt;br /&gt;Every time I was called on to do the dog and pony for the project, that meant that I wasn't &lt;b&gt;working&lt;/b&gt; on the project.  It was frustrating, but not as frustrating as what I found out in our annual year-end meeting.&lt;br /&gt;&lt;br /&gt;Every year at the end of January the entire company gets together for a year-end review.  If we hit our sales target for the previous year, everyone receives a 3% bonus.  Having already spent the money five times over in our minds, we all cheer, shake the president's hand, and go home happy.  But this year--even though we had hit our target--I was more interested in the projected numbers for the upcoming year.  On the charts, in big, bold fonts, were revenue numbers from the Oswald project starting in May.  May!&lt;br /&gt;&lt;br /&gt;I tried to ask a few shielded questions about the sales numbers, but my answers were deflected.  John Dell (no relation), our ebullient and well-loved Sales &amp; Marketing Director, was confident in his sales team's ability to sell our finished-by-May project.  And then I realized that even though I had told my boss and our Engineering Director that the March demo with our OEM was in jeopardy and the May date wasn't going to be likely, either, no one else knew.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111582405191168934?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111582405191168934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111582405191168934' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111582405191168934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111582405191168934'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/05/disheartening-discovery.html' title='A Disheartening Discovery'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111531256928803255</id><published>2005-05-04T23:46:00.000-05:00</published><updated>2005-05-05T12:10:05.750-05:00</updated><title type='text'>Double-Buffered Drawing</title><content type='html'>&lt;a href="http://msdn2.microsoft.com/library/b367a457(en-us,vs.80).aspx"&gt;Double-buffered drawing&lt;/a&gt; has been around for a long time.  I won't try to improve on any on the &lt;a href="http://www.cs.clemson.edu/~cs428/resources/java/tutorial/JTHiloGraphics.html"&gt;tutorials&lt;/a&gt; and &lt;a href="http://www.codeproject.com/gdi/flickerfree.asp"&gt;examples&lt;/a&gt; out there, which are probably better than anything I could do anyway.&lt;br /&gt;&lt;br /&gt;This is just a post to show some example code for how to do this in Windows CE.  The principles remain the same:&lt;ol&gt;&lt;li&gt;Create an off-screen buffer&lt;br /&gt;&lt;li&gt;Draw in the off-screen buffer&lt;br /&gt;&lt;li&gt;Copy the buffer to system (or graphics) memory&lt;/ol&gt;Source snippets:&lt;br /&gt;&lt;pre&gt;// Create an off-screen buffer to draw in&lt;br /&gt;CDC dcOffScreen;&lt;br /&gt;CBitmap bmpOffScreen;&lt;br /&gt;dcOffScreen.CreateCompatibleDC(pDC);&lt;br /&gt;bmpOffScreen.CreateCompatibleBitmap(pDC,&lt;br /&gt;   rect.Width(), rect.Height());&lt;br /&gt;   &lt;br /&gt;CBitmap* pOldBmp =&lt;br /&gt;   dcOffScreen.SelectObject(&amp;bmpOffScreen);&lt;br /&gt;dcOffScreen.FillSolidRect(&amp;rect,&lt;br /&gt;   GetSysColor(COLOR_STATIC));&lt;br /&gt;   &lt;br /&gt;// Set the pointer to the up or down bitmap (if it exists)&lt;br /&gt;if (state &amp; ODS_SELECTED)&lt;br /&gt;   pBmp = (m_bmpDn.m_hObject ? &amp;m_bmpDn : &amp;m_bmpUp);&lt;br /&gt;else&lt;br /&gt;   pBmp = &amp;m_bmpUp;&lt;br /&gt;   &lt;br /&gt;// Draw whichever bitmap the pointer is set to&lt;br /&gt;pBmp-&gt;GetBitmap(&amp;bmpInfo);&lt;br /&gt;TransparentImage(pDC-&gt;GetSafeHdc(), /* hdcDest */&lt;br /&gt;   pRect-&gt;left, pRect-&gt;top,&lt;br /&gt;   bmpInfo.bmWidth, bmpInfo.bmHeight, /* dest */&lt;br /&gt;   (HBITMAP) bmp, /* hdcSrc */&lt;br /&gt;   0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, /* src */&lt;br /&gt;   CLR_TRANSPARENT);&lt;br /&gt;   &lt;br /&gt;// Blit the off-screen DC back over to the button DC&lt;br /&gt;pDC-&gt;BitBlt(rect.left, rect.top, rect.Width(),&lt;br /&gt;   rect.Height(), &amp;dcOffScreen, 0, 0, SRCCOPY);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111531256928803255?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111531256928803255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111531256928803255' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111531256928803255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111531256928803255'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/05/double-buffered-drawing.html' title='Double-Buffered Drawing'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111471122274860587</id><published>2005-04-27T23:55:00.000-05:00</published><updated>2005-05-05T11:43:43.083-05:00</updated><title type='text'>Pick-Me Buttons</title><content type='html'>Now that we knew how to draw transparently...&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a onmouseover="bnPickMe1.src='http://home.ripway.com/2005-3/273114/bnPickMe1Dn.gif'" onmouseout="bnPickMe1.src='http://home.ripway.com/2005-3/273114/bnPickMe1Up.gif'"&gt;&lt;img name="bnPickMe1" src="http://home.ripway.com/2005-3/273114/bnPickMe1Up.gif" border=0 alt="Pick-me button 1" width=64 height=64&gt;&lt;/a&gt;&amp;nbsp&amp;nbsp&lt;a onmouseover="bnPickMe2.src='http://home.ripway.com/2005-3/273114/bnPickMe2Dn.gif'" onmouseout="bnPickMe2.src='http://home.ripway.com/2005-3/273114/bnPickMe2Up.gif'"&gt;&lt;img name="bnPickMe2" src="http://home.ripway.com/2005-3/273114/bnPickMe2Up.gif" border=0 alt="Pick-me button 2" width=64 height=64&gt;&lt;/a&gt;&amp;nbsp&amp;nbsp&lt;a onmouseover="bnPickMe3.src='http://home.ripway.com/2005-3/273114/bnPickMe3Dn.gif'" onmouseout="bnPickMe3.src='http://home.ripway.com/2005-3/273114/bnPickMe3Up.gif'"&gt;&lt;img name="bnPickMe3" src="http://home.ripway.com/2005-3/273114/bnPickMe3Up.gif" border=0 alt="Pick-me button 3" width=64 height=64&gt;&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;What you see above is a group of pick-me buttons, which I so named because they seemed to jump up at me and say, "Pick me!  Pick me!"  Right now they're entirely pre-drawn, but eventually we'll be able to draw everything except the button image using &lt;code&gt;RoundRect()&lt;/code&gt;, &lt;code&gt;GradientFill()&lt;/code&gt;, and &lt;code&gt;Ellipse()&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;One of my true passions has always been computer interfaces.  How do we &lt;a href="http://www.answers.com/interface"&gt;interact&lt;/a&gt; (link: see Usage Note) with these powerful machines that force us to work by their rules?  But I'll spare you the soap box (in this post).  What this meant for this project was that the entire user interface was my canvas, and I was an eager painter.&lt;br /&gt;&lt;br /&gt;Pick-me buttons aren't really 2D or 3D controls.  They live somewhere in the 2&amp;frac12;D world.  Their shadow gives them a sense of height and a different platform than the background they rest on.  The illusion is compounded by the way that they jump up when selected, and their shadow correspondingly shrinks.&lt;br /&gt;&lt;br /&gt;These buttons really only work in a horizontal arrangement, which makes them good if you have a landscape display.  They use more space than their Win32 counterparts, toggle button and radio button groups.  But in my opinion they're well worth the real estate.  Also, for our application the only input was by a touch interface.  Touching one of these buttons and seeing it spring to life gives immediate visual feedback and tactile gratification.&lt;br /&gt;&lt;br /&gt;They worked even better when we set up our button class to reduce flicker by buffering its draws off-screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111471122274860587?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111471122274860587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111471122274860587' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111471122274860587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111471122274860587'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/04/pick-me-buttons.html' title='Pick-Me Buttons'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111470770023151454</id><published>2005-04-27T22:43:00.000-05:00</published><updated>2005-05-05T12:10:51.256-05:00</updated><title type='text'>Drawing Transparent Controls</title><content type='html'>A quick search of the Windows CE newsgroups shows no small number of &lt;a href="http://groups-beta.google.com/groups?hl=en&amp;lr=&amp;num=10&amp;q=transparent+group%3Amicrosoft.public.windowsce.*&amp;qt_s=Search"&gt;questions about transparency&lt;/a&gt; in controls.  With its pared-down API, CE doesn't make it quite as easy as regular Win32 to draw transparently.  Still, it can be done, and (as we found) it's not too difficult, either.&lt;br /&gt;&lt;br /&gt;The biggest and foremost obstacle is, as the help puts it, that "all windows implicitly have the &lt;code&gt;WS_CLIPSIBLINGS&lt;/code&gt; and &lt;code&gt;WS_CLIPCHILDREN&lt;/code&gt; styles [set]."  (In "regular" windows, a &lt;code&gt;WM_PAINT&lt;/code&gt; message would cause a window to repaint its entire background.  CE, an OS that usually runs on &lt;a href="http://www1.us.dell.com/content/products/productdetails.aspx/axim_x30_low?c=us&amp;cs=19&amp;l=en&amp;s=dhs"&gt;low-horsepower devices&lt;/a&gt;, tries to save some time by only drawing the region not covered by other windows.  When a parent window is finished painting it selfishly tells all child windows to go paint themselves.)  This works fine if you want to paint normal-looking buttons&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://home.ripway.com/2005-3/273114/bnTestCE.gif" border=0 alt="WinCE Test Button" width=136 height=48&gt;&lt;/center&gt;&lt;br /&gt;but as soon  as you want to get fancy (move your mouse over the button to see the fancyness)&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a onmouseover="bnTest.src='http://home.ripway.com/2005-3/273114/bnTestOswaldDn.gif'" onmouseout="bnTest.src='http://home.ripway.com/2005-3/273114/bnTestOswaldUp.gif'"&gt;&lt;img name="bnTest" src="http://home.ripway.com/2005-3/273114/bnTestOswaldUp.gif" border=0 alt="Oswald Test Button" width=128 height=64&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;it makes life a little harder.&lt;br /&gt;&lt;br /&gt;In our case we wanted buttons with round corners.  Also, they needed to depress and visibly lose their shadow (see above), which meant that if we merely painted the button image over itself we would still see the border from the last button image.&lt;br /&gt;&lt;br /&gt;Also, many static images in our application needed a transparent background.  (The alternative was to use icons, which don't scale well past 16x16 increments, or to "hard-code" the background into each image, which was a terrible option for obvious reasons.)&lt;br /&gt;&lt;br /&gt;Enter our saviour, &lt;code&gt;&lt;a href="http://www.microsoft.com/technet/prodtechnol/wce/evaluate/graphics.mspx"&gt;TransparentImage()&lt;/a&gt;&lt;/code&gt;, the CE equivalent of Win32's &lt;code&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_0fzo.asp"&gt;TransparentBlt()&lt;/a&gt;&lt;/code&gt; (or just &lt;a href="http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B79212"&gt;blitting with a monochrome bit-mask&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; You might be tempted to just use &lt;code&gt;SetBkMode(TRANSPARENT)&lt;/code&gt; in OnCtlColor.  But the problem with doing that is that the control becomes too transparent and won't even repaint in response to a &lt;code&gt;WM_ERASEBKGND&lt;/code&gt; message.  On the other hand, passing back a brush created with the current background color would work just fine in OnCtlColor.  You just have to make sure that you keep the brush valid (for example, make it a class member) or use a stock brush.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A note on my nomenclature:&lt;/b&gt; I use &lt;code&gt;c_&lt;/code&gt; as a prefix for control variables (to differentiate from &lt;code&gt;m_&lt;/code&gt; for data variables), a habit I picked up from &lt;a  href="http://www.flounder.com/getdlgitem.htm#Creating%20Control%20Variables" &gt;the Flounder&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For drawing transparent static controls, this worked great in the parent window's OnPaint handler:&lt;br /&gt;&lt;pre&gt;// Draw the "background" images transparently&lt;br /&gt;// NOTE: Validate the control so it doesn't try to re-&lt;br /&gt;// paint itself with its default bmp.  Other options:&lt;br /&gt;//    1. c_sensor.SetRedraw(false);&lt;br /&gt;//    2. c_sensor.SetBitmap(bmp);&lt;br /&gt;//    3. Subclass CStatic and paint our own control&lt;br /&gt;c_sensor.ValidateRect(NULL);&lt;br /&gt; &lt;br /&gt;pDC = c_sensor.GetDC();&lt;br /&gt;pOldFont = pDC-&gt;SelectObject(&amp;m_fontSmall);&lt;br /&gt;c_sensor.GetClientRect(&amp;rect1);&lt;br /&gt;DrawBitmap(pDC, &amp;rect1, IDB_SENSOR);&lt;br /&gt; &lt;br /&gt;// Draw the centered text overlay on the bitmap&lt;br /&gt;overlay.Format(_T("%d"), m_sensorNum);&lt;br /&gt;pDC-&gt;SetBkMode(TRANSPARENT);&lt;br /&gt;pDC-&gt;DrawText(overlay, &amp;rect1, DT_CENTER);&lt;br /&gt; &lt;br /&gt;pDC-&gt;SelectObject(pOldFont);&lt;br /&gt;c_sensor.ReleaseDC(pDC);&lt;/pre&gt;&lt;br /&gt;DrawBitmap calls a parent-class function that calls &lt;code&gt;TransparentImage()&lt;/code&gt;, like so:&lt;br /&gt;&lt;pre&gt;TransparentImage(pDC-&gt;GetSafeHdc(), /* hdcDest */&lt;br /&gt;   pRect-&gt;left, pRect-&gt;top,&lt;br /&gt;   bmpInfo.bmWidth, bmpInfo.bmHeight, /* dest */&lt;br /&gt;   (HBITMAP) bmp, /* hdcSrc */&lt;br /&gt;   0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, /* src */&lt;br /&gt;   CLR_TRANSPARENT);&lt;/pre&gt;&lt;br /&gt;where &lt;code&gt;CLR_TRANSPARENT&lt;/code&gt; is a pre-defined color set to hot pink, &lt;code&gt;RGB(255, 0, 255)&lt;/code&gt;.  (I figured we wouldn't have much use for that color, and even if we did, I'd rather not see it!)  For even more flexibility, you could also looked for a pre-determined pixel--say (0, 0)--and use its color as the images transparent color.&lt;br /&gt;&lt;br /&gt;The most robust way to do this would be to use option #3 from above and subclass our own static controls.  That way, we could control our background repainting in OnEraseBkgnd and our normal painting in DrawItem.  But the statics were easy enough to handle in their parents' OnPaint method.  We did subclass the buttons and used an off-screen buffer to do all our drawing before blitting them back over to the screen.  But that's a post for another day.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Final note:&lt;/b&gt; You might look at our solution and say, "Hey, that's not really transparent.  You're just faking it by drawing the same background color!" and you'd be right.  This is good-enough transparency.  It works well on a monochromatic background.  &lt;b&gt;True&lt;/b&gt; transparency involves using &lt;code&gt;GetPixel()&lt;/code&gt; to see what's "underneath" and duplicating it, or at least part of it, in the draw.  Yeah, that's also another post for another day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111470770023151454?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111470770023151454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111470770023151454' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111470770023151454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111470770023151454'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/04/drawing-transparent-controls.html' title='Drawing Transparent Controls'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111453620434095515</id><published>2005-04-25T00:21:00.000-05:00</published><updated>2005-04-26T12:32:05.556-05:00</updated><title type='text'>Using a Custom SDK and Emulator with EVC</title><content type='html'>If you're not debugging on a physical device, you need a good emulator for testing code.  In our case, our hardware spec still wasn't finished and a prototype wasn't close to being complete.  But we did know that our 15" flat-panel display would run at 1024x768, which meant that the emulator default of 800x600 cut off a significant portion of our screen.&lt;br /&gt;&lt;br /&gt;So we needed a custom emulator to run at that resolution.  (We also needed it to handle the custom IOCTLs that we were sending, but that wouldn't come till later.)  This shouldn't have been very hard to do, but as with all things just starting out, we didn't even know where to start troubleshooting because we didn't have a "known good" reference point.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; In my case, I had installed Platform Builder 4.2, then installed PB 5.0.  When our SBC vendor told us that they only had a BSP for 4.2 I uninstalled version 5.  This led to several wasted days of troubleshooting why coreroller.dll wasn't correctly registered, even after reinstalling v4.2.  Moral of the story: don't try running 4.2 and 5.0 on the same system, as &lt;a href="http://groups-beta.google.com/group/microsoft.public.windowsce.platbuilder/search?hl=en&amp;group=microsoft.public.windowsce.platbuilder&amp;q=4.2+5.0+install&amp;qt_g=1&amp;searchnow=Search+this+group"&gt;this search&lt;/a&gt; will attest to.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Make sure that you have a good platform and the Emulator Debug configuration is working.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; Make sure that in Platform Settings, for the emulator configuration, the &lt;b&gt;Enable KITL&lt;/b&gt; option is unchecked!  If you build a platform and export an SDK with this option turned on, eVC will &lt;b&gt;not&lt;/b&gt; connect to the emulator unless Platform Builder is running and it can connect via KITL.&lt;br /&gt;&lt;br /&gt;If you need to, rebuild the platform for that configuration.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Select Platform, Configure SDK...  The SDK Roller will start in "Export SDK Wizard" mode.  Run through the wizard and select the options for your platform.  In our case we're using MFC for applications.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; At the end of the wizard click &lt;b&gt;Finish&lt;/b&gt;, but don't build the SDK yet.  Select Platform, Configure SDK again, which now starts up the &lt;b&gt;SDK Configuration Settings&lt;/b&gt; dialog.  You may want to change some settings.  For example, make sure that TCP/IP is the default transport.  We wanted to mirror our device as closely as possible, so in the emulation tab we set the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Fixed screen resolution: width:&lt;/b&gt; 1024, height: 768, color: 16 (bits)&lt;br /&gt;&lt;li&gt;&lt;b&gt;Memory:&lt;/b&gt; 64 (MB)&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; If you plan on buildling multiple SDKs--we're on version 9 right now--you'll want to make sure to put the version number in the that the &lt;b&gt;Platform name&lt;/b&gt;, and maybe even in the &lt;b&gt;MSI file name&lt;/b&gt; setting.  Otherwise, when you use Windows' uninstall applet, all of your SDKs in the uninstall list will have the exact same name.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; When you've configured your settings, select Platform, Build SDK and watch it build (or work on something else if you're the industrious type).  It should take a few minutes to build the MSI file and add the customized help, ending with this message:&lt;br /&gt;&lt;br&gt;&lt;i&gt;MSI file construction completed.  0 error(s), 0 warning(s).&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; If you've been using eVC you should exit it now.  The Platform Manager behaves strangely if you install an SDK while it's still running.  Closing eVC usually terminates the Platform Manager as well, but after several bad experiences I always check-and-terminate cemgr.exe if it's still running.  For good measure, I also exit Platform Builder.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6.&lt;/b&gt; Install the MSI file you created.  It should take a few minutes, depending on which options you installed.  When you restart eVC you'll see a new option in the Select Active WCE Configuration combo box of the WCE Platform toolbar (or select the Build, Set Active Platform menu).  Rebuild your project under that platform and launch the emulator.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; If eVC fails to connect to the emulator you might need to reboot and restart eVC.  Some people recommend always rebooting after installing an SDK, although I can usually get away without having to do that.  If it still fails to connect, &lt;b&gt;make sure&lt;/b&gt; that the KITL transport option is unchecked for your platform.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Another Note:&lt;/b&gt;The Platform Builder Help also has a step-by-step topic entitled &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcepb40/html/_wcepb_to_export_an_sdk_to_embedded_visual_c___30.asp"&gt;Exporting an SDK&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Once we had our custom emulator up and running we never looked back.  (For one thing, screen design was so much easier when we could see the entire screen!)  Using the emulator made our development time so much faster.  Even after we got our prototype, if we wanted to test the app, we would have to pull out the CF card from the hardware, copy the new executable to the card, put the card back into the prototype, reboot it, and run the app.  Using the emulator meant that we could compile, download and run in a matter of seconds.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Last note:&lt;/b&gt; Compared with hardware, the emulator is of course slow, especially when debugging, but for quick testing it's more than adequate.  Some of these &lt;a href="http://groups-beta.google.com/group/microsoft.public.windowsce.embedded.vc/search?hl=en&amp;group=microsoft.public.windowsce.embedded.vc&amp;q=%22folder+sharing%22&amp;qt_g=1"&gt;eVC tips&lt;/a&gt; show how to get the most out of your emulator cycles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111453620434095515?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111453620434095515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111453620434095515' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111453620434095515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111453620434095515'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/04/using-custom-sdk-and-emulator-with-evc.html' title='Using a Custom SDK and Emulator with EVC'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111319867880158488</id><published>2005-04-10T23:04:00.000-05:00</published><updated>2005-06-09T10:01:52.676-05:00</updated><title type='text'>Thoughts Concerning the Instruction of Computing Machines (or, Methods to Programme Electronick Devices)</title><content type='html'>Dear Reader,&lt;br /&gt;&lt;br /&gt;A curious piece of information has come to my attention that I thought most worthwhile to share with you.  It appears that an astute portion of my readership has been following this tale with some interest, yet the details of my work are befuddling and torpor-inducing.&lt;br /&gt;&lt;br /&gt;Therefore I thought it advantageous to share the proce&amp;#x0192;s of my work, which I hope will enlighten the fellowship of readers.  To my esteemed colleagues I ask leniancy while my path follows this slight detour, and now let us turn to the subject at hand.&lt;br /&gt;&lt;br /&gt;Using an electronick computing machine I am able to manipulate a software programme, being a set of instructions for the computing machine, or &lt;i&gt;computre&lt;/i&gt;, that charge its core with strict obedience, so that anon the same results are repeated.&lt;br /&gt;&lt;br /&gt;The programme, which is so named Platfourme Builder, produces the desired result of specifying which components of a large system I should build.  Certain components allow me certain functions--&lt;i&gt;exempli gratia,&lt;/i&gt; a component known as &lt;i&gt;Clear Type&lt;/i&gt; reveals the most wondrous movable type before my eyes.&lt;br /&gt;&lt;br /&gt;Once my components are selected, I must only build this system, and using such built system I am able to package a reference of my system which would rival our dear &lt;a href="http://www.britannica.com/eb/article?tocId=9032600&amp;query=britannica&amp;ct="&gt;Britannica&lt;/a&gt;.  This reference is known as exporting the &lt;a href="http://www.answers.com/SDK"&gt;SDK&lt;/a&gt;, whose acronym is unknown to me but likely represents Scientific Device Kit.&lt;br /&gt;&lt;br /&gt;Such SDK is then used in my IDE, known as eVC, for the purposes of writing specific instructions for my system.  I apologise for the liberal use of acronyms when English words would suffice, but I find no other way of expre&amp;#x0192;sing my language to you.  What I call an IDE you may know as an integrated development environment, or a system for developing systems.  Specifically, my environs is called by the name eVC, a system written in the third great instruction language (known as C) for embedded electronick devices.&lt;br /&gt;&lt;br /&gt;When the instructions are properly built and ready--with nearly 20,000 operations at the present time and more being added daily it is a terrifyingly complex proce&amp;#x0192;s--the system is run in a world which emulates ours.  This other world, a sphere within a sphere, so to speak, is termed an &lt;i&gt;emulatour&lt;/i&gt;, which purpose is to test our system before the instructions are run on an actual device.&lt;br /&gt;&lt;br /&gt;Knowing that the instructions will work properly in the emulatour, I then place a copy of the instructions on the physikal device and attempt to monitor the electronick wizardry as it deciphers my commands.&lt;br /&gt;&lt;br /&gt;From start to finish this is a most complicated proce&amp;#x0192;s and at times days are spent sorting out the minutest nuance of our system.  You may wonder if this is frustrating, and that is decidedly so, but it is also wondrous and fascinating, and the vexation of every impediment I encountre is but naught when compared to the delight of discovering its solution.&lt;br /&gt;&lt;br /&gt;It is my desire that this discourse has been of some benefit to you.&lt;br /&gt;&lt;br /&gt;I remain your most humble servant,&lt;br /&gt;D. Philippe&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111319867880158488?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111319867880158488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111319867880158488' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111319867880158488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111319867880158488'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/04/thoughts-concerning-instruction-of.html' title='Thoughts Concerning the Instruction of Computing Machines (or, Methods to Programme Electronick Devices)'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111306422464626729</id><published>2005-04-09T10:32:00.000-05:00</published><updated>2005-04-10T22:56:38.263-05:00</updated><title type='text'>High-Speed Timers with Windows CE</title><content type='html'>A paradox that has always fascinated me about computers is the way that they do so much while being so stupid.  At their heart computers have only a primitive bit of intelligence:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is it a 1?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is it a 0?&lt;br /&gt;That's it.  However, the redeeming quality of this neolithic process is the computer's ability to make more of these determinations in one second than you or I can make in our lifetimes.  I've heard it called the &lt;a href="http://www.unwords.com/unword/dopeler%20effect.html"&gt;dopeler effect&lt;/a&gt;: the tendency of dumb things to appear smarter when happen rapidly.&lt;br /&gt;&lt;br /&gt;Primitive paradoxes aside, what this means in the real world is that computers work so well because they can do things amazingly faster than we can do them.  Windows CE, for example, provides a timer that lets you track up to 1,000 things per second.  For nearly all of the day-to-day programming tasks this is fast enough.  But if you're working with high-speed machinery or programming servos on a &lt;a href="http://www.siliconchip.com.au/cms/A_30345/article.html"&gt;robotic arm&lt;/a&gt; or, like us, watching cartons fly by at about 40 ft/sec (12 m/s) it's nowhere near fast enough.&lt;br /&gt;&lt;br /&gt;For our purposes, we needed a timer that would fire 20,000 times per second, or about 50 µs.  So, we stole the timer that Windows CE uses for the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcedebug5/html/wce50orisettingupkernelprofiler.asp"&gt;kernel profiler&lt;/a&gt;.  It means that we lost any kernel profiling abillity but I don't know that we would've used it anyway.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disclaimer:&lt;/b&gt; This is how &lt;i&gt;we&lt;/i&gt; did it.  This doesn't mean that it's the "best practices" way of doing it.  (But boy, does it work!)&lt;br /&gt;&lt;br /&gt;Setting up a high-speed timer isn't very hard.  There are just three things to do.  First, we need to modify timer.c.  (Do make a backup.)  For an X86 platform, we find this in %_WINCEROOT%\PUBLIC\COMMON\OAK\CSP\I486\OAL\timer.c.  We'll make as few changes as possible.&lt;br /&gt;&lt;pre&gt;// Our own interrupt task&lt;br /&gt;extern void PolledInterruptTask(void);&lt;/pre&gt;...and later on...&lt;pre&gt;int ProfileInterrupt(void) &lt;br /&gt;{ &lt;br /&gt;   PolledInterruptTask(); &lt;br /&gt;&lt;br /&gt;   dwReschedCount++;&lt;br /&gt;    &lt;br /&gt;   if (dwReschedCount &lt; dwProfilingMultiple)&lt;br /&gt;      return SYSINTR_NOP;&lt;br /&gt;&lt;br /&gt;   dwReschedCount = 0;&lt;br /&gt;   return SYSINTR_RESCHED;&lt;br /&gt;}&lt;/pre&gt;Now we have a have an interrupt that will fire our custom task, whatever it is.  We still need a way to start the profiler, which we can do using a &lt;a href="http://oswaldproject.blogspot.com/2005/03/writing-kernel-level-code.html"&gt;custom IOCTL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In oemctl.c we need to add the following &lt;code&gt;case&lt;/code&gt; to OEMIoControl():&lt;br /&gt;&lt;pre&gt;   switch (dwIoControlCode) { &lt;br /&gt;   case IOCTL_START_CUSTOM_TIMER: &lt;br /&gt;#ifndef DEBUG &lt;br /&gt;      // Start up the profiler timer &lt;br /&gt;      OEMProfileTimerEnable(50); &lt;br /&gt;#endif &lt;br /&gt;&lt;br /&gt;      retval = TRUE; &lt;br /&gt;      break;&lt;/pre&gt;With the OAL parts working, we should build the platform.  At this point we can also export a custom SDK to use with eVC (more on that in a later post).&lt;br /&gt;&lt;br /&gt;Our last step is to call the new IOCTL as our application starts up.  In our initialization code we might have something like this:&lt;br /&gt;&lt;pre&gt;   if (!KernelIoControl(IOCTL_START_CUSTOM_TIMER,&lt;br /&gt;      NULL, 0, NULL, 0, NULL)) {&lt;br /&gt;      LOG(__FILE__, __LINE__,1,&lt;br /&gt;         "High-speed timer startup failed!");&lt;br /&gt;   }&lt;/pre&gt;&lt;br /&gt;It took us a little while to get everything working right, but once we did we tested it on a prototype and could verify that everything was working correctly.  But was it running at 50 µs?  It would be a little while before we could test it and find out.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note 1:&lt;/b&gt; The MSDN lists a more in-depth way of implementing timers in CE in this article: &lt;i&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncenet/html/tchRockSolidCETimers.asp"&gt;Implementing Rock-Solid Windows CE Timers On Windows CE .NET 4.1 Platforms&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note 2:&lt;/b&gt; Modifying timer.c is also known as cloning the public code, which this MSDN article talks more about: &lt;i&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnembedded/html/embedded09162003.asp"&gt;Cloning the Microsoft Public Code&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111306422464626729?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111306422464626729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111306422464626729' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111306422464626729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111306422464626729'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/04/high-speed-timers-with-windows-ce.html' title='High-Speed Timers with Windows CE'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111199209836151753</id><published>2005-03-27T23:17:00.000-06:00</published><updated>2005-04-09T10:32:26.063-05:00</updated><title type='text'>Ted's Excellent Adventure (2 of 2)</title><content type='html'>Just because someone shows up in jeans and sneakers doesn't mean that they're not a great programmer, and I was willing to give Ted the benefit of the doubt.  Usually I'm not usually one to judge someone based on their look or clothes.  Well, on second thought, I take that back.  I usually &lt;b&gt;do&lt;/b&gt; form an opinion, then remind myself that I shouldn't judge a book by its cover.&lt;br /&gt;&lt;br /&gt;Ted's book was tall and in its forties.  He had blond, wavy hair and an easygoing smile.  His voice was pleasant and accentless, and though his thick frame wasn't as brawny as it had once been I could tell by looking at him that he hadn't stared at computer monitors his whole life.  And he definitely liked the "casual" part of business casual.&lt;br /&gt;&lt;br /&gt;After the cursory tour of the company--oh look, here are more offices, and just wait till you see our bathrooms!--I gave him the executive overview of what we did and what the project was about.  We set up a work area and held a small meeting about the project.&lt;br /&gt;&lt;br /&gt;In a previous CE project that was similar to ours, Ted said, the team he worked on used a &lt;a href="http://www.sum-it.nl/en200037.php3"&gt;3-tier architecture&lt;/a&gt; approach.  He recommended it for our project as well.  We agreed.  After all, the application needed &lt;b&gt;some&lt;/b&gt; architecture.  Right now it was just a collection of loosely related dialogs and a lot of code written in here's-my-first-crack-at-it-MFC (by me).&lt;br /&gt;&lt;br /&gt;Meanwhile, I was working on some nagging CE issues.  We still didn't have a way to share memory between the UI app and the real-time app.  Our attempt at using &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemain4/html/_wcesdk_Windows_CE_Memory_Architecture.asp"&gt;memory-mapped files&lt;/a&gt; hadn't worked.  (That turned out to be a blessing in disguise.)  I had a devilishly hard time getting Platform Builder to configure and export a &lt;a href="http://groups-beta.google.com/group/microsoft.public.windowsce.platbuilder/search?group=microsoft.public.windowsce.platbuilder&amp;q=export+custom+sdk&amp;qt_g=1"&gt;custom SDK&lt;/a&gt;, and when I finally did it wouldn't work.  So I let Ted port the application into the 3-tier framework.  I had some questions about it but I waited until he was finished.&lt;br /&gt;&lt;br /&gt;While we worked we got to know more about Ted.  He was a former &lt;a href="http://www2.acc.af.mil/afrcc/"&gt;Air Force Search and Rescue&lt;/a&gt; parajumper, but the pay rate didn't cut it so he switched to programming.  (Some switch!)  As an independent contractor he had worked on projects for &lt;a href="http://support.intel.com/support/notebook/centrino/sb/CS-008170.htm"&gt;Intel&lt;/a&gt; and &lt;a href="https://iweb.alpine-usa.com/Hondadvdsales/naviorder.php"&gt;Alpine&lt;/a&gt;.  He did software projects for a living, but his &lt;a href="http://www.npr.org/templates/story/story.php?storyId=4457805"&gt;&lt;i&gt;meraki&lt;/i&gt;&lt;/a&gt; aspiration was in board game design.  He had invented a multi-level tic-tac-toe game and was hoping that a big retailer would pick it up.  He gave a few of us his game as a present.&lt;br /&gt;&lt;br /&gt;The framework that Ted implemented was a sound one, but it had some bureaucratic parts that I didn't like.  And while Ted had been on the team that implemented it, he wasn't the designer and wasn't privy to the details that I wanted to know about.  It had been previously implemented on a "push" system, where the process control (or object) layer worked off a timer to constantly push data out to the (dumb) dialogs.  Our design was different: the dialogs had to be intelligent and needed to request data from the control layer when they recognized the need for new data.  Ted didn't like the idea.&lt;br /&gt;&lt;br /&gt;Ted had a few idiosyncracies, as we all do.  One was that he was fairly certain of his opinions without being able to say why.  (On the other hand, I'm also rather opinionated but can usually make up a pretty good reason.)  So it was frustrating to try to elicit a reason for why he was sometimes so firmly attached to a particular idea.&lt;br /&gt;&lt;br /&gt;He also had a minor disease I started calling "weekenditis."  On Monday mornings he would arrive in the depths of despair, bemoaning the sad state of our project and pledging to incorporate a time-consuming, application-wide fix that wasn't in the timeline.  Usually the problem wasn't nearly as bad as he made it out to be.  I learned to defer these fixes and steer him back to the more important tasks at hand.&lt;br /&gt;&lt;br /&gt;He had helped us implement &lt;a href="http://msdn.microsoft.com/vstudio/previous/ssafe/productinfo/qa/"&gt;SourceSafe&lt;/a&gt;, which replaced our highly efficient but less-than-traceable verbal system.  (Don't laugh: I know of at least one Fortune 500 company that still works on major projects by emailing unencrypted .zip files back and forth.)  He used it to check out files and make tiny changes to irrelevant things, like code formatting.  I would rather have had him spend his time on more important things.&lt;br /&gt;&lt;br /&gt;But the small drawbacks were easily outweighed by how big of an asset he became to the project.  He fit right into the team, and that's not an easy thing to do.  He found a nearby place to stay (&lt;a href="http://www.roommates.com/info.rs"&gt;roomates.com&lt;/a&gt;) and quickly made friends with almost everyone in the company except Vince Pawlowicz, who didn't get along with anyone anyway.  (It helped that he had a cool game to give out.)  Our "&lt;a href="http://oswaldproject.blogspot.com/2005/03/teds-excellent-adventure-1-of-2.html"&gt;personal Moses&lt;/a&gt;" he was not, but maybe our hopes had been unrealistic anyway.  I refactored the timeline&lt;sup&gt;1&lt;/sup&gt; and we moved on.&lt;br /&gt;&lt;br /&gt;For better or for worse, Ted was now a permanent part of the team.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] Rutherford, Alec and I had a meeting about how best to use Ted in the light of us still needing a "CE expert."  We made some adjustments to the timeline (i.e., shuffling our already-overworked resources around but not adjusting the deadline).  Alec remarked that he didn't see how we could possibly finish the project on time, which apparently wasn't what Rutherford wanted to hear because he said nothing but smiled falsely and closed the meeting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111199209836151753?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111199209836151753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111199209836151753' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111199209836151753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111199209836151753'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/teds-excellent-adventure-2-of-2.html' title='Ted&apos;s Excellent Adventure (2 of 2)'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111164633757784584</id><published>2005-03-23T23:26:00.000-06:00</published><updated>2005-03-24T22:23:13.010-06:00</updated><title type='text'>Ted's Excellent Adventure (1 of 2)</title><content type='html'>&lt;b&gt;Q:&lt;/b&gt; How comfortable would you be hiring a guy based on a 10-minute phone interview?&lt;br /&gt;&lt;b&gt;A:&lt;/b&gt; Not very&lt;br /&gt;&lt;br /&gt;Nevertheless, that was the position that we found ourselves in after scouring the country for WinCE developers.  I suppose it meant that either the CE developer market was very hot and no one was available to work on new projects, or that the market was very cold and no one was available to work on new projects.&lt;br /&gt;&lt;br /&gt;To be fair, we were asking a lot.  We needed an experienced, on-site developer who was free within 3 weeks and available for about 3 months.  We were looking for our own personal Moses, come to free us from the shackles of our DOS world and lead us into the promised land of Windows CE.  There were other people (and companies) available, but none that met those criteria.&lt;br /&gt;&lt;br /&gt;After searching every way we knew how, including using a national developer contracting service, we ended up with exactly three prospects.  One was Daron, the &lt;a href="http://oswaldproject.blogspot.com/2005/03/beginning-very-good-place-to-start.html"&gt;WinCE training&lt;/a&gt; instructor.  He was a &lt;a href="http://mvp.support.microsoft.com/gp/mvpfaqs"&gt;Microsoft MVP&lt;/a&gt; in whom I had every confidence.  The other two were prospects from the independent contractor agency.&lt;br /&gt;&lt;br /&gt;On the telephone, Sudeep Swarnapurishwara sounded every last bit like his name foretold.  Although he lived in the area and was very experienced, he had a few strikes against him.  His English was terrible (despite having lived in the U.S. for a dozen years), he sounded too confident about anything that we asked him (including topics where he misunderstood what we were asking him), and he was taking a month-long trip to India during the month the project was scheduled to end.&lt;br /&gt;&lt;br /&gt;Our next call was more promising.  Ted Nulder lived in California but was willing to relocate to Chicago for the duration of the project.  He had experience with two previous CE projects and he interviewed very well.  I think the call with him gave some people in the conference room that &lt;a href="http://www.google.com/search?hl=en&amp;lr=&amp;c2coff=1&amp;q=warm+fuzzy+feeling+site%3Aunixwiz.net"&gt;warm fuzzy feeling&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So between Daron and Ted it came down to a matter of price.  Daron didn't come cheap: between $160 - 200/hr, depending on whether he worked off- or on-site.  I tried to beat up his company on the price--I've learned a thing or two from our killer purchasing manager--but they weren't willing to budge.  By comparison, Ted cost about half that.  In our selection discussions I pointed out that productivity between different programmers varies by an &lt;a href="http://c2.com/cgi/wiki?GrandMasterProgrammer"&gt;order of magnitude&lt;/a&gt;, but at that price difference I could feel the hollowness of my own argument.&lt;br /&gt;&lt;br /&gt;Our own engineers bill out at $200/hr, so for us to balk at that kind of price conjures up images of pots and kettles.  But balk we did.  Ted made arrangements to start on Jan. 4, the first working day of 2005.  For $90/hr, we were the proud new owner of a CE expert.  Our Moses was on his way to lead us through the desert of development into a future flowing with &lt;strike&gt;milk and honey&lt;/strike&gt; products and profits.&lt;br /&gt;&lt;br /&gt;Or so we thought.&lt;br /&gt;&lt;br /&gt;I was interested to meet the kind of guy that would move to a different city and live there while working on a long-term project.  (I'm married, with a 2-year-old son and another on the way, so it wasn't something that I would've done.)  So Tuesday morning, when the receptionist rang and said that Ted had arrived, I walked to the foyer to greet him.&lt;br /&gt;&lt;br /&gt;An old quote says that you never get a second chance to make a first impression, and I believe it.  What kind of impression I made on him, I'll probably never know.  But the impression that he made on me, I'll never forget.&lt;br /&gt;&lt;br /&gt;Even to this day when I think about it, I can still feel the way my heart sank.  I think it was the jeans and sneakers that said it best.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111164633757784584?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111164633757784584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111164633757784584' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111164633757784584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111164633757784584'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/teds-excellent-adventure-1-of-2.html' title='Ted&apos;s Excellent Adventure (1 of 2)'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111127084391139687</id><published>2005-03-19T16:05:00.000-06:00</published><updated>2005-03-24T15:02:08.026-06:00</updated><title type='text'>Writing Kernel-Level Code</title><content type='html'>If you need access to kernel-level routines, Windows CE provides the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcedsn40/html/cgconcreatingoemadaptationlayer.asp"&gt;OEM Adaptation Layer&lt;/a&gt; (OAL) to do just that via custom kernel IOCTLs.  A custom IOCTL lets you write code with kernel-mode functionality and provides your application with a means to call it.&lt;br /&gt;&lt;br /&gt;First, a quick timeout for some pretty graphics.  The OAL looks something like this:&lt;br /&gt;&lt;center&gt;&lt;a onmouseover="oalArch.src='http://home.ripway.com/2005-3/273114/oalArchitecture2.gif'" onmouseout="oalArch.src='http://home.ripway.com/2005-3/273114/oalArchitecture1.gif'"&gt;&lt;img name="oalArch" src="http://home.ripway.com/2005-3/273114/oalArchitecture1.gif" border=0 alt="OAL Architecture" width=400 height=180&gt;&lt;/a&gt;&lt;/center&gt;(Now why did they ever replace good ol' &lt;a href="http://www.chris.com/ascii/"&gt;ascii art&lt;/a&gt; with those &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=3FB3BD5C-FED1-46CF-BD53-DA23635AB2DF&amp;displaylang=en"&gt;newfangled&lt;/a&gt; &lt;a href="http://home.ripway.com/2005-3/273114/oalArchitecture.vsd"&gt;graphics&lt;/a&gt;?)&lt;br /&gt;&lt;br /&gt;While we're in timeout I'll take a second to point out that IOCTL stands for I/O control (code) and can be pronounced &lt;i&gt;eye-okk'-tull&lt;/i&gt; if you're feeling brave.&lt;br /&gt;&lt;br /&gt;Okay, back to the tutorial.  Creating a new IOCTL isn't very hard.  All you need to do is define a custom code for kernel handling that can be called in an application with &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemain4/html/cmrefKernelIoControl.asp"&gt;KernelIoControl&lt;/a&gt;.  Here's how to do it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Open oemioctl.c, which should be in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(_WINCEROOT)\platform\cepc\kernel\hal\oemioctl.c.&lt;br /&gt;The basic structure of the OemIoControl function is a large &lt;code&gt;switch&lt;/code&gt; statement.  Adding new functionality is as easy as defining a new &lt;code&gt;case&lt;/code&gt; and handling it.&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; You should be able to find a list of currently defined codes in ..\OAK\INC\pkfuncs.h.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Define a new control code.  Valid control codes for OEMs are between 2048 - 4095.  (MS reserves 0 - 2047 for itself.)  Hopefully 2,000 custom codes are enough.  (For comparison, we're using 17 codes right now.)&lt;br /&gt;&lt;br /&gt;A control code might look like this (excuse the width problems):&lt;br /&gt;&lt;pre&gt;#define IOCTL_ZOOM_TAXI&lt;br /&gt;   CTL_CODE( FILE_DEVICE_HAL, 0x0800,&lt;br /&gt;   METHOD_BUFFERED, FILE_ANY_ACCESS )&lt;/pre&gt;&lt;br /&gt;The third parameter, METHOD_BUFFERED, is ignored in CE.  &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcedsn40/html/cgrefCTL_CODE.asp"&gt;CTL_CODE&lt;/a&gt; expands to&lt;br /&gt;&lt;pre&gt;#define CTL_CODE( DeviceType, Function, Method, Access )&lt;br /&gt;   ( ((DeviceType) &lt;&lt; 16) | ((Access) &lt;&lt; 14)&lt;br /&gt;   | ((Function) &lt;&lt; 2) | (Method) )&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Add a new &lt;code&gt;case&lt;/code&gt; under the main &lt;code&gt;switch&lt;/code&gt; statement in OemIoControl:&lt;br /&gt;&lt;pre&gt;case IOCTL_ZOOM_TAXI:&lt;br /&gt;   LoadYellowCabGfx();&lt;br /&gt;   ZoomTaxi(LEFT_TO_RIGHT, TRUE);&lt;br /&gt; &lt;br /&gt;   retval = TRUE;&lt;br /&gt;   break;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Note:&lt;/b&gt; This is a good time to put &lt;a href="http://www.answers.com/topic/defensive-programming"&gt;defensive programming&lt;/a&gt; to work.  Any problems here and you'll hang or crash the entire system.  For starters, make sure that you check the actual size of the incoming buffer against the reported size.&lt;br /&gt;&lt;br /&gt;(&lt;b&gt;From the MSDN 2535 lab notes:&lt;/b&gt; Just for testing purposes, you might want to try incrementing a counter every time you pass your IOCTL and printing a &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceoem/html/_wcepb_RETAILMSG.asp"&gt;RETAILMSG&lt;/a&gt; that displays the value of the counter.  If you run into some problems and you're wondering if anything is actually happening this is a nice sanity check.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Build your platform.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5a.&lt;/b&gt; If you're using Platform Builder, open your project and add the following where you need it:&lt;br /&gt;&lt;pre&gt;#include &amp;lt;kfuncs.h&amp;gt;&lt;br /&gt; &lt;br /&gt;KernelIoControl(IOCTL_ZOOM_TAXI, // I/O ctl code&lt;br /&gt;   NULL,           // input buffer pointer&lt;br /&gt;   0,              // input buffer size&lt;br /&gt;   &amp;dwTaxi,        // output buffer pointer&lt;br /&gt;   sizeof(dwTaxi), // bytes that can be returned&lt;br /&gt;                   // in output buffer&lt;br /&gt;   &amp;dwNumTaxis);   // size of data returned&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Make sure that you &lt;code&gt;#define IOCTL_ZOOM_TAXI&lt;/code&gt; in your project as well.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5b.&lt;/b&gt; If you're using eVC, you'll need to configure and export your custom SDK from PB first, then install it.  The standard emulator won't know about your custom control codes.  (I'll write more about custom SDKs later.)  Then add the above code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6.&lt;/b&gt; Make sure to add the &lt;b&gt;WINCEOEM&lt;/b&gt; preprocessor symbol, which includes OEM headers (see kfuncs.h).  On the &lt;b&gt;Project&lt;/b&gt; menu, click &lt;b&gt;Settings&lt;/b&gt;.  On the &lt;b&gt;C++&lt;/b&gt; tab, select the &lt;b&gt;Preprocessor&lt;/b&gt; category and add&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;,WINCEOEM&lt;br /&gt;at the end of the &lt;b&gt;Preprocessor definitions&lt;/b&gt; list.&lt;br /&gt;&lt;br /&gt;In the &lt;b&gt;Additional include directories&lt;/b&gt; field, add these two directories:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(_PROJECTROOT)\cesysgen\oak\inc,$(_TARGETPLATROOT)\inc&lt;br /&gt;&lt;br /&gt;As you can see, it's not very hard to do.  For small things like hardware info and hardware access, it's a lot easier to do than writing a driver.  But be careful how many times you call into the kernel.  KernelIoControl is handled by generating an exception, which the kernel routs to the OAL and to your IOCTL.  The cost of a kernel call in a real-time environment needs to be evaluated in your app.&lt;br /&gt;&lt;br /&gt;By the way, if you're wondering what the heck we're doing with a taxi call in the kernel, uh, we're not.  But someone else &lt;a href="http://groups-beta.google.com/group/comp.sys.palmtops.pilot/msg/5cb2e6a7ade41811?dmode=source"&gt;once did&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Below is the PDF of the MSDN lab:&lt;br /&gt;&lt;table cellspacing=0 cellpadding=2 border=0&gt;&lt;tr align="left" valign="center"&gt;&lt;td&gt;&lt;img src="http://home.ripway.com/2005-3/273114/pdf.gif" width=18 height=18 alt="PDF"&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://home.ripway.com/2005-3/273114/2535B_Lab5.pdf"&gt;MSDN 2535B_Lab5.pdf&lt;/a&gt; (con permiso)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;br /&gt;Microsoft MVP &lt;a href="http://www.embeddedfusion.com/"&gt;Steve Maillet&lt;/a&gt; writes: In Windows CE, "kernel mode" simply means that a thread has access to the virtual address space &lt;code&gt;0x80000000 - 0xFFFFFFFF&lt;/code&gt; without triggering an access violation. That is &lt;b&gt;only&lt;/b&gt; difference between user mode and kernel mode in Windows CE. &lt;b&gt;Any&lt;/b&gt; thread can call &lt;code&gt;SetKMode()&lt;/code&gt; to switch between the modes as long as the process it is running in is trusted (or the trust system is disabled).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111127084391139687?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111127084391139687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111127084391139687' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111127084391139687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111127084391139687'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/writing-kernel-level-code.html' title='Writing Kernel-Level Code'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111094111058366224</id><published>2005-03-15T23:11:00.001-06:00</published><updated>2005-03-19T16:04:36.563-06:00</updated><title type='text'>The New Old Thing</title><content type='html'>Apart from Microsoft &lt;a href="http://www.microsoft.com/presspass/images/features/05-31offc_timeline.gif"&gt;Word and Excel&lt;/a&gt;, I can't think of any applications that made smooth transitions from their previous, powerhouse DOS selves into Windows.  In fact, &lt;b&gt;every&lt;/b&gt; application that I can think of apart from the above two was either more awkward to use or had less features than its DOS counterpart.  This was due to at least a few things:&lt;ul&gt;&lt;li&gt;Writing Windows apps (at the time) was harder&lt;br /&gt;&lt;li&gt;The Windows event model was more restrictive than a comparable (i.e., complete control) DOS app&lt;br /&gt;&lt;li&gt;The companies who produced these apps didn't fire their entire development team and hire Win16-proficient programmers.  There was a natural learning curve as the programmers started learning how to program for Windows.&lt;br /&gt;&lt;li&gt;The shell, which had previously been subservient to the all-powerful application, was now the master.  The applications were learning to accept their new, lesser role.&lt;/ul&gt;The net effect was usually that Application X for Windows, v1, was a buggy, clumsy product.  It was followed a few months later by a less-buggy, clumsy product.  These apps were usually written &lt;a href="http://www.google.com/search?hl=en&amp;q=site%3Awww.cosc.brocku.ca+%22history+of+mfc%22"&gt;pre-MFC 1.0&lt;/a&gt;.  They didn't understand the &lt;a href="http://www.answers.com/topic/multiple-document-interface&amp;method=6"&gt;MDI&lt;/a&gt; interface.  They didn't use standard Windows controls.  Their dialogs tried to control the application instead of vice versa.  And the print system was usually ported by someone who could print in ANSI codes in his sleep but was a novice when it came to device contexts and the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/WDMIntro_ef015643-817a-486f-8416-1c805c680c6a.xml.asp"&gt;Windows driver model&lt;/a&gt;.  I could go on.&lt;br /&gt;&lt;br /&gt;But I digress.  That was just an illustration of the choices that we faced (granted, 10 years later) in moving our embedded app to CE.  We decided to go with a two-pronged approach.  The real-time part would run alongside the kernel and the user interface part would run as a stand-alone application.  We would use some kind of shared memory (we didn't know what yet) to communicate between them.&lt;br /&gt;&lt;br /&gt;The smallest timer resolution in CE is 1ms, but we needed something much more accurate.  We included the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcepb40/html/pbconRemoteCallProfiler.asp"&gt;profiler&lt;/a&gt; and overloaded the profiler interrupt to poll a little faster, like oh about 20,000 times per second.  (Just a few snips here and there in timer.c.)  I know that it's not the &lt;a href="http://www.microsoft.com/whdc/devtools/ddk/default.mspx"&gt;Windows Way&lt;/a&gt;, and now we won't be able to use the profiler.  But hey, this is still DOS2Win, v1.  We're allowed a few of these.&lt;br /&gt;&lt;br /&gt;The CE &lt;a href="http://msdn.microsoft.com/library/en-us/wcedsn40/html/cgconCreatingOEMAdaptationLayer.asp"&gt;OAL&lt;/a&gt; makes it easy to write kernel-level code via &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcedsn40/html/cmrefoemiocontrol.asp"&gt;kernel IO control codes&lt;/a&gt;.  (&lt;a href="http://oswaldproject.blogspot.com/2005/03/msdn-2535.html"&gt;Course 2535&lt;/a&gt;, Lab 5)  Writing code for custom control codes (called IOCTLs) in oemioctl.c compiles the code into the kernel, where you can call it in the application via &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemain4/html/cmrefKernelIoControl.asp"&gt;KernelIOControl&lt;/a&gt; later.&lt;br /&gt;&lt;br /&gt;Figuring out how to run code faster than 1ms and how to run in kernel mode were two big steps to porting our trusty old code to CE.  But we still needed to get the apps to talk to each other, figure out how to control the real-time app from the UI app, and &lt;a href="http://www.google.com/search?q=cache:_at1xGATniMJ:www.ganssle.com/tem/tem107.pdf+testing+site:ganssle.com&amp;hl=en"&gt;test the whole thing&lt;/a&gt; on some hardware to see if it ran fast enough.  All of these were milestones that loomed large on our ever-diminishing horizon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111094111058366224?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111094111058366224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111094111058366224' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111094111058366224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111094111058366224'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/new-old-thing.html' title='The New Old Thing'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111086434658235136</id><published>2005-03-14T22:15:00.000-06:00</published><updated>2005-06-09T13:38:39.386-05:00</updated><title type='text'>Fits and Starts</title><content type='html'>It was becoming quickly apparent, even to lummoxes such as myself, that the timeline was far too agressive.  I put together a quick spreadsheet to show that even with &lt;a href="http://www.answers.com/topic/brooks-law"&gt;another developer&lt;/a&gt; (which we didn't have) we wouldn't be able to finish the project in time.  I held a meeting with Alec and Rutherford.  Rutherford, in classic style, took my two pages of notes and reserved a conference room for the three of us to talk about them.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"So what are you saying?" he asked, finally giving me free reign without asking a leading question.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"I'm recommending that if the date is more important than the product, we should do this in Zinc, then back-port it to Windows CE.  If the product is more important, then let's do it in CE and move the date."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;The mention of Zinc was like offering to kill his dog, but the proposition to move the deadline made him pale in comparison.  He started shaking his head as I was talking, as if to let me know that no matter what I said he wouldn't approve.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"So what you're saying," he attempted to summarize as he walked towards a whiteboard, "is that for a greater chance of success we could do it in Zinc-DOS.  But if we &lt;b&gt;added&lt;/b&gt; a programmer," he emphasized, using my project-won't-be-complete-even-with-additional-help spreadsheet in a way I hadn't intended, "we might be able to finish it on time."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Trying to put it into terms we were all familiar with, he continued.  "So if we do it in Zinc, then move it later, it's like getting a...double.  But if we hire another programmer and do it in CE Microsoft it's like hitting a home run."&lt;br /&gt;&lt;br /&gt;Oh no!  The dreaded appearance of a &lt;a href="http://isd.usc.edu/~karl/Bingo/"&gt;climactic sports term&lt;/a&gt; in an Important Meeting!  I've seen too many important decisions swayed people who casually threw out phrases like "home run," "slam dunk" and "touchdown."  They're great.  They get your blood pumping.  Yeah!  A slam dunk!  Let's see the replay!  Awesome!  Let's go do this, uh, thing!  Uh, what were we talking about?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Yeah," I allowed, cringing.  "We &lt;b&gt;might&lt;/b&gt; hit a home run."&lt;br /&gt;&lt;br /&gt;Alec sided with Rutherford, and so it was decided--as much as it was ever really a decision--to go ahead with CE and hire a contract worker for additional development.  We needed an expert to help show us the ropes.  I recommended the instructor from the course I had just taken.  He was available.  I posted an ad in a CE newsgroup.  We contacted &lt;a href="http://www.bolingconsulting.com/"&gt;Doug Boling&lt;/a&gt;, who was busy on another project.  You would think &lt;a href="http://www.wintellect.com"&gt;these guys&lt;/a&gt; would be perfect--after all, they have the guy who wrote the &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/1572316950/"&gt;definitive MFC book&lt;/a&gt;--but they couldn't get a quote together.&lt;br /&gt;&lt;br /&gt;For my part, it was time to sit down and learn all about app development on &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_wcemfc4/html/aforiguidetomfcforwindowsce.asp"&gt;CE with MFC&lt;/a&gt;.  MFC isn't Microsoft's darling anymore.  That prize goes to &lt;a href="http://msdn.microsoft.com/vcsharp/"&gt;C#&lt;/a&gt; and the .Net Framework these days.  (Don't be surprised if you see a billboard that reads "C# - The official programming language of Microsoft Corp." on that link, although I don't know of any major MS applications written in C#.)  As far as I know, no one has written much about MFC on CE.  Maybe it's a dying breed.  More likely, it's just not cool anymore and it won't sell books.&lt;br /&gt;&lt;br /&gt;Despite the lack of printed matter, the web proved to be an excellent resource.  I saved some of the links that helped me along the way:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CE Architecture&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50origraphicswindowingevents.asp"&gt;GWES&lt;/a&gt; (pronounced "gweeze")&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.developer.com/ws/pc/print.php/3069341"&gt;Memory Efficient CE Applications&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.developer.com/ws/pc/print.php/2248741"&gt;Understanding Shell Behavior&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnembedded/html/embedded11062001.asp"&gt;MSDN Get Embedded Columns&lt;/a&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;MFC/Examples&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.functionx.com/MFCFundamentals/"&gt;MFC Fundamentals&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.highprogrammer.com/alan/windev/visualstudio.html"&gt;Microsoft Visual C++ Tips and Tricks&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.flounder.com/mvp_tips.htm"&gt;MVP Tips, Techniques, and Goodies&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnarvc/html/msdn_mfcfaq50.asp"&gt;Visual C++/MFC Frequently Asked Questions&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://enphilistor.users4.50megs.com/dialog.htm"&gt;Communicating with Modal Dialog Boxes in Windows&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/ce/"&gt;CodeProject: Mobile Devices&lt;/a&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;CE Graphics&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/03/07/CuttingEdge/"&gt;Working with Images&lt;/a&gt; (.Net stuff)&lt;br /&gt;&lt;li&gt;&lt;a href="http://studierstube.org/klimt/index.php"&gt;Klimt, the OSS 3D graphic library&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.codeguru.com/Cpp/W-P/ce/article.php/c3525/"&gt;High-speed graphics library&lt;/a&gt;&lt;/ul&gt;&lt;br /&gt;It was really slow going at first, but I learned in fits and starts.  While I'm usually the kind of guy who thrives in a completely new, sink-or-swim environment, it's always tough learning under the gun.  The &lt;a href="http://groups-beta.google.com/group/microsoft.public.vc.mfc"&gt;microsoft.public.vc.mfc&lt;/a&gt; newsgroup is an excellent resource.  I have a theory that if you want to learn something fast, get yourself to the point where you can answer (some) other people's questions.  Then you'll know that you at least know something.&lt;br /&gt;&lt;br /&gt;Then one week, after almost a month of futzing around with example code, reading books and tutorials, and tinkering with prototypes, it all clicked.  I had just gotten back from vacation, it was shortly before Christmas, and I decided to implement what I knew.  I figured I could always learn more, but I might as well start &lt;b&gt;somewhere&lt;/b&gt;.  That was a great week.  I wasn't even working very much overtime.  I was in the zone.  (It must've been all those home runs and slam dunks.)  I wrote over 2,500 lines of code that week.  And the application started to come alive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111086434658235136?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111086434658235136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111086434658235136' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111086434658235136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111086434658235136'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/fits-and-starts.html' title='Fits and Starts'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111082239593577783</id><published>2005-03-13T17:20:00.000-06:00</published><updated>2005-03-18T21:46:26.363-06:00</updated><title type='text'>MSDN 2540</title><content type='html'>&lt;b&gt;Warning:&lt;/b&gt; boring reading ahead!&lt;br /&gt;&lt;br /&gt;Here are the contents of the MSDN 2540 course:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Embedded Fusion now offers &lt;a href="http://www.embeddedfusion.com/training.htm"&gt;MSDN 2540N&lt;/a&gt; on DVD. It gives you the option of spending $500 for a dry course on DVD rather than $3,000 + expenses for a dry course in person. I don't know if you can place a value on having a good instructor help you through the labs, but $500 is pretty cheap in comparison.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update to the update:&lt;/b&gt; (from a comment on an &lt;a href="http://oswaldproject.blogspot.com/2005/03/beginning-very-good-place-to-start.html"&gt;earlier post&lt;/a&gt;) &lt;i&gt;2540, 2530 and 2535 are the Windows CE .NET V4.x versions of the MS training for Windows CE. MSDDN 2540N is the V5.0 content that was completely re-written for V5.0&lt;/i&gt;  [Ed. note: "completely" might be a bit of a stretch, as in how the Platform Builder 5.0 docs were "completely" rewritten from 4.2.]&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Module 1: Advanced Building of a Windows CE Image&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Directory Structure of Platform Builder&lt;br /&gt;&lt;li&gt;   The Build Process&lt;br /&gt;&lt;li&gt;   Building in the Integrated Development Environment&lt;br /&gt;&lt;li&gt;   Modifying Configuration Files&lt;br /&gt;&lt;li&gt;   Creating a Component&lt;br /&gt;&lt;li&gt;   Modifying CEC Files With the CEC Editor&lt;br /&gt;&lt;li&gt;   Adding a BSP&lt;br /&gt;&lt;li&gt;   Export Wizard&lt;br /&gt;&lt;li&gt;   Lab 1: Advanced Image Customization and Build&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 2: Advanced Debugging&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Using Breakpoints&lt;br /&gt;&lt;li&gt;   The Real World: Debugging Process&lt;br /&gt;&lt;li&gt;   Using Remote Tools&lt;br /&gt;&lt;li&gt;   IDE Debug Commands&lt;br /&gt;&lt;li&gt;   What are Debug Zones?&lt;br /&gt;&lt;li&gt;   Other Debugging Techniques&lt;br /&gt;&lt;li&gt;   eXDI&lt;br /&gt;&lt;li&gt;   Lab 2: Exploring Debugging Features&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 3: Kernel Features&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Definition of Real Time&lt;br /&gt;&lt;li&gt;   Windows CE Kernel Features&lt;br /&gt;&lt;li&gt;   Handling Processes, Threads, and Fibers&lt;br /&gt;&lt;li&gt;   Protecting Applications&lt;br /&gt;&lt;li&gt;   Synchronization Objects&lt;br /&gt;&lt;li&gt;   Memory Model&lt;br /&gt;&lt;li&gt;   Structured Exception Handling&lt;br /&gt;&lt;li&gt;   Optimizing a Windows CE Device&lt;br /&gt;&lt;li&gt;   Lab 3: Kernel Tracking Thread Priorities&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 4: Understanding Device Drivers&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Windows CE Architecture&lt;br /&gt;&lt;li&gt;   Driver Source&lt;br /&gt;&lt;li&gt;   Driver Resource Management&lt;br /&gt;&lt;li&gt;   Resource Manager&lt;br /&gt;&lt;li&gt;   Device Driver Interrupt Handling and the IST Model&lt;br /&gt;&lt;li&gt;   Device Driver Memory Management&lt;br /&gt;&lt;li&gt;   New DMA Routines&lt;br /&gt;&lt;li&gt;   Driver Loading Mechanism&lt;br /&gt;&lt;li&gt;   Service Manager (Service.Exe)&lt;br /&gt;&lt;li&gt;   Device Notification Mechanism for Applications&lt;br /&gt;&lt;li&gt;   Device Power Management&lt;br /&gt;&lt;li&gt;   Common Driver Architectures&lt;br /&gt;&lt;li&gt;   Native Device Drivers&lt;br /&gt;&lt;li&gt;   Stream Interface Drivers&lt;br /&gt;&lt;li&gt;   USB&lt;br /&gt;&lt;li&gt;   NDIS&lt;br /&gt;&lt;li&gt;   FSD&lt;br /&gt;&lt;li&gt;   Emulation Support&lt;br /&gt;&lt;li&gt;   Lab 4: Implementing a Stream Interface Driver&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 5: Networking and Communications&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Web Technologies&lt;br /&gt;&lt;li&gt;   Lab 5.1: Enabling a Web Server&lt;br /&gt;&lt;li&gt;   Networking Options&lt;br /&gt;&lt;li&gt;   Lab 5.2: Implementing Microsoft Message Queuing&lt;br /&gt;&lt;li&gt;   Component Services&lt;br /&gt;&lt;li&gt;   Networking Security&lt;br /&gt;&lt;li&gt;   Real-Time Communications&lt;br /&gt;&lt;li&gt;   Multimedia Communications&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 6: Implementing a Shell&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   What Is a Shell?&lt;br /&gt;&lt;li&gt;   Shell Options&lt;br /&gt;&lt;li&gt;   Components of a Custom Shell&lt;br /&gt;&lt;li&gt;   Required Shell Functionality&lt;br /&gt;&lt;li&gt;   Installing a Custom Shell&lt;br /&gt;&lt;li&gt;   Handling Device UI Rotations&lt;br /&gt;&lt;li&gt;   Customizing the UI&lt;br /&gt;&lt;li&gt;   Lab 6.1: Implementing and Handling Screen Rotation&lt;br /&gt;&lt;li&gt;   Lab 6.2: Windows CE Skin Implementation&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 7: Preparing an Application Development Environment&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Windows CE .NET Application Development&lt;br /&gt;&lt;li&gt;   Native Application Development&lt;br /&gt;&lt;li&gt;   Win32 Programming Primer&lt;br /&gt;&lt;li&gt;   Lab 7A: Exploring Embedded Visual C++ 4.0&lt;br /&gt;&lt;li&gt;   Managed Application Development&lt;br /&gt;&lt;li&gt;   Building, Deploying, and Launching the Application&lt;br /&gt;&lt;li&gt;   Overview of the .NET Compact Framework&lt;br /&gt;&lt;li&gt;   Adding .NET Support to a Windows CE Device&lt;br /&gt;&lt;li&gt;   Lab 7B: Exploring Visual Studio .NET&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111082239593577783?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111082239593577783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111082239593577783' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111082239593577783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111082239593577783'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/msdn-2540.html' title='MSDN 2540'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111081829281915721</id><published>2005-03-13T17:10:00.000-06:00</published><updated>2005-03-14T11:49:43.376-06:00</updated><title type='text'>MSDN 2535</title><content type='html'>&lt;b&gt;Warning:&lt;/b&gt; boring reading ahead!&lt;br /&gt;&lt;br /&gt;Here are the contents of the MSDN 2535 course:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Module 1: Advanced Building of a Windows CE Image&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Directory Structure of Platform Builder&lt;br /&gt;&lt;li&gt;   The Build Process&lt;br /&gt;&lt;li&gt;   Building in the Integrated Development Environment&lt;br /&gt;&lt;li&gt;   Building in the Integrated Development Environment (continued)&lt;br /&gt;&lt;li&gt;   Modifying Configuration Files&lt;br /&gt;&lt;li&gt;   Creating a Component&lt;br /&gt;&lt;li&gt;   Modifying CEC Files With the CEC Editor&lt;br /&gt;&lt;li&gt;   Adding a BSP&lt;br /&gt;&lt;li&gt;   Export Wizard&lt;br /&gt;&lt;li&gt;   Lab 1: Advanced Image Customization and Build&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 2: Advanced Debugging&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Using Breakpoints&lt;br /&gt;&lt;li&gt;   The Real World: Debugging Process&lt;br /&gt;&lt;li&gt;   Using Remote Tools&lt;br /&gt;&lt;li&gt;   IDE Debug Commands&lt;br /&gt;&lt;li&gt;   What are Debug Zones?&lt;br /&gt;&lt;li&gt;   Other Debugging Techniques&lt;br /&gt;&lt;li&gt;   eXDI&lt;br /&gt;&lt;li&gt;   Lab 2: Exploring Debugging Features&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 3: Kernel Features&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Definition of Real Time&lt;br /&gt;&lt;li&gt;   Windows CE Kernel Features&lt;br /&gt;&lt;li&gt;   Handling Processes, Threads, and Fibers&lt;br /&gt;&lt;li&gt;   Protecting Applications&lt;br /&gt;&lt;li&gt;   Synchronization Objects&lt;br /&gt;&lt;li&gt;   Memory Model&lt;br /&gt;&lt;li&gt;   Structured Exception Handling&lt;br /&gt;&lt;li&gt;   Optimizing a Windows CE Device&lt;br /&gt;&lt;li&gt;   Lab 3: Kernel Tracking Thread Priorities&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 4: Implementing a Boot Loader&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Role of the Boot Loader&lt;br /&gt;&lt;li&gt;   Boot Options&lt;br /&gt;&lt;li&gt;   Implementing a Boot Loader&lt;br /&gt;&lt;li&gt;   Sample Boot Loader Requirements&lt;br /&gt;&lt;li&gt;   Building a Boot Loader&lt;br /&gt;&lt;li&gt;   Debugging a Boot Loader&lt;br /&gt;&lt;li&gt;   X86 Boot Options&lt;br /&gt;&lt;li&gt;   Boot Loader in Manufacturing&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 5: OEM Adaptation Layer&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Operating System Boot Sequence&lt;br /&gt;&lt;li&gt;   Developing OAL&lt;br /&gt;&lt;li&gt;   Required OAL Functions&lt;br /&gt;&lt;li&gt;   Optional OAL Functions&lt;br /&gt;&lt;li&gt;   Debugging an OAL&lt;br /&gt;&lt;li&gt;   Building the Windows CE Kernel&lt;br /&gt;&lt;li&gt;   Implementing OAL Registry Functions&lt;br /&gt;&lt;li&gt;   Power Management&lt;br /&gt;&lt;li&gt;   Implementing Certification Model&lt;br /&gt;&lt;li&gt;   Lab 5: Exploring the OAL&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 6: Device Driver Architecture&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Built-In Vs. Installable Drivers&lt;br /&gt;&lt;li&gt;   Device Manager&lt;br /&gt;&lt;li&gt;   ActivateDeviceEx&lt;br /&gt;&lt;li&gt;   Registry Enumerator&lt;br /&gt;&lt;li&gt;   Services&lt;br /&gt;&lt;li&gt;   Bus Drivers&lt;br /&gt;&lt;li&gt;   DMA&lt;br /&gt;&lt;li&gt;   Resource Manager&lt;br /&gt;&lt;li&gt;   Interrupt Model&lt;br /&gt;&lt;li&gt;   Device Driver Power Management&lt;br /&gt;&lt;li&gt;   CETK&lt;br /&gt;&lt;li&gt;   Lab 6: Implementing a Stream Interface Driver&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 7: Device Drivers Examples&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Driver Source&lt;br /&gt;&lt;li&gt;   Arrangement of the Driver Libraries&lt;br /&gt;&lt;li&gt;   Battery and Notification LED Drivers&lt;br /&gt;&lt;li&gt;   PC Card Socket&lt;br /&gt;&lt;li&gt;   Keyboard Device Drivers&lt;br /&gt;&lt;li&gt;   Display Drivers&lt;br /&gt;&lt;li&gt;   DirectDraw&lt;br /&gt;&lt;li&gt;   USB&lt;br /&gt;&lt;li&gt;   1394&lt;br /&gt;&lt;li&gt;   NDIS&lt;br /&gt;&lt;li&gt;   Audio Device Drivers&lt;br /&gt;&lt;li&gt;   File System Driver&lt;br /&gt;&lt;li&gt;   Lab 7: Implementing a File System&lt;br /&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111081829281915721?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111081829281915721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111081829281915721' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111081829281915721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111081829281915721'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/msdn-2535.html' title='MSDN 2535'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111081474140262308</id><published>2005-03-13T17:00:00.000-06:00</published><updated>2005-03-14T10:39:38.690-06:00</updated><title type='text'>MSDN 2530</title><content type='html'>&lt;b&gt;Warning&lt;/b&gt;: boring reading ahead!&lt;br /&gt;&lt;br /&gt;Here are the contents of the MSDN 2530 course:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Module 1: Overview of Windows CE .NET&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Overview of Windows CE .NET&lt;br /&gt;&lt;li&gt;   Core Operating System Architecture&lt;br /&gt;&lt;li&gt;   Advanced Features of Windows CE .NET&lt;br /&gt;&lt;li&gt;   Networking and Communications&lt;br /&gt;&lt;li&gt;   Real-Time Communication&lt;br /&gt;&lt;li&gt;   Multimedia Support and Architecture&lt;br /&gt;&lt;li&gt;   Security Features and Architecture&lt;br /&gt;&lt;li&gt;   Internationalization&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 2: Overview of System Development&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Selecting a Windows Embedded Operating System&lt;br /&gt;&lt;li&gt;   The Windows CE Platform Development Cycle&lt;br /&gt;&lt;li&gt;   The Application Development Options&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 3: Configuring and Building with Platform Builder&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Introduction to Platform Builder&lt;br /&gt;&lt;li&gt;   Platform Development Cycle&lt;br /&gt;&lt;li&gt;   Configuring the Platform&lt;br /&gt;&lt;li&gt;   Building the Platform Image&lt;br /&gt;&lt;li&gt;   Downloading the Image&lt;br /&gt;&lt;li&gt;   Demonstration: Configuring, Building and Downloading&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Module 4: Overview of the Windows CE .NET Debugging Process&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Overview of the Debug Process&lt;br /&gt;&lt;li&gt;   Release Builds and Debug Builds&lt;br /&gt;&lt;li&gt;   Introduction to the Kernel Debugger&lt;br /&gt;&lt;li&gt;   Demonstration: Kernel Debugger Windows&lt;br /&gt;&lt;li&gt;   Understanding Windows CE Remote Tools &lt;br /&gt;&lt;li&gt;   Other Debugging Techniques&lt;br /&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111081474140262308?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111081474140262308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111081474140262308' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111081474140262308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111081474140262308'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/msdn-2530.html' title='MSDN 2530'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111060267000983034</id><published>2005-03-11T21:12:00.000-06:00</published><updated>2005-03-24T13:01:10.640-06:00</updated><title type='text'>The Beginning, A Very Good Place To Start</title><content type='html'>Everything must start at the beginning.  (I think I read this pearl of wisdom somewhere.)  Our beginning involved a lot of speculation about what we could and couldn't do.  The Filipinos have a term for it: &lt;i&gt;pauli uli&lt;/i&gt;, or as we say it in English, running around like a chicken with your head cut off.  &lt;a href="http://www.ganssle.com"&gt;Jack Ganssle&lt;/a&gt; says it better: furious activity is no substitute for understanding.&lt;br /&gt;&lt;br /&gt;Unfortunately, understanding was at a premium, so we made the requisite substitution with a big helping of furious activity.  I filled out the online form for a &lt;a href="http://www.windowsembeddedkit.com/RegPage.aspx"&gt;Windows Embedded Introductory Kit&lt;/a&gt;.  (In hindsight, I strongly recommend &lt;a href="https://www.interactservices.com/WinEmbedded/Products.asp"&gt;ordering the kit&lt;/a&gt; on CD or DVD.  The downloads can take literally hours, even with a high-speed Internet connection.  And what if you have to reinstall...  I did.  Twice.)&lt;br /&gt;&lt;br /&gt;The kit comes with Platform Builder 5.0 and Embedded Visual C++ 4.0 (eVC).  (Visual Studio 2003 will only compile apps for WinCE if you want to use the .Net Framework.)  &lt;a href="http://lab.msdn.microsoft.com/vs2005/"&gt;Whidbey&lt;/a&gt;, the upcoming Visual Studio 2005, will have integrated support for compiling native apps for CE, and eVC will say good-bye.  (eVC is really just a tempermental, stripped-down Visual Studio with Platform Manager support, anyway.)&lt;br /&gt;&lt;br /&gt;We bought a book by &lt;a href="http://www.bolingconsulting.com"&gt;Doug Boling&lt;/a&gt;, &lt;a href="http://www.microsoft.com/MSPress/books/authors/auth6535.asp"&gt;Programming Microsoft Windows CE .Net&lt;/a&gt;.  It's a good book, but it was ironic that we had decided to write the UI app in CE with &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_wcemfc4/html/aforiguidetomfcforwindowsce.asp"&gt;MFC&lt;/a&gt;.  The book proudly states in the introduction: &lt;i&gt;"Since the goal of this book is to teach you how to write programs for Windows CE, the examples avoid using a class library such as MFC [...]"&lt;/i&gt; (!)  It's a good book, and I recommend it despite the pages and pages of cut-and-paste source listings.&lt;br /&gt;&lt;br /&gt;Eventually it was decided that I would attend a CE training session.  There are a few companies that do such training, and only two were offering a session in November: &lt;a href="http://www.ardence.com"&gt;VenturCom&lt;/a&gt; (now Ardence) in Boston and &lt;a href="http://www.bsquare.com"&gt;BSQUARE&lt;/a&gt; in Seattle.  We chose the one on the right coast and off I went for a week of training.  (George didn't go, which was a shame, but he works part time.)&lt;br /&gt;&lt;br /&gt;On the flight to Boston I happened to sit next to a Director of Engineering for General Dynamics.  We talked and I showed her the software spec and our timeline.  A former engineer herself, she was quick to tell me how nuts we were.  In return, I scoffed at their policy that a &lt;a href="http://www.processimpact.com/articles/metrics_primer.html"&gt;productive&lt;/a&gt; &lt;a href="http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&amp;ixPost=146383"&gt;programmer&lt;/a&gt; wrote just 300 lines of code per week, but I started to have my doubts whether our timeline was doable.&lt;br /&gt;&lt;br /&gt;The training was excellent, thanks to the instructor.  The MS docs were out of date (and sometimes plain wrong) and the computers we were working on were less than stellar, but the quality of the teacher more than made up for it.  Remember that &lt;a href="http://www.gospelweb.net/ateachersimpact.htm"&gt;favorite teacher&lt;/a&gt; of yours back in high school?  The one who really loved what he did, was good at it too, and showed a geniune interest in you?  They say that the instructor can make or break the course, and this guy &lt;b&gt;made&lt;/b&gt; it.&lt;br /&gt;&lt;br /&gt;Windows CE training comes in three courses: MSDN 2530, 2535 and 2540.  The meat of the course is in 2540 but the other two are good as well.  I'll post the TOC for all three courses in some upcoming posts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Embedded Fusion now offers &lt;a href="http://www.embeddedfusion.com/training.htm"&gt;MSDN 2540N&lt;/a&gt; on DVD.  It gives you the option of spending $500 for a dry course on DVD rather than $3,000 + expenses for a dry course in person.  I don't know if you can place a value on having a good instructor help you through the labs, but $500 is pretty cheap in comparison.&lt;br /&gt;&lt;br /&gt;With my week-long CE training firmly under my belt I was ready to tackle the world.  I wrote a summary of my trip in an email to family and friends and flew home.&lt;br /&gt;&lt;br /&gt;&lt;table cellspacing=0 cellpadding=2 border=0&gt;&lt;tr align="left" valign="center"&gt;&lt;td&gt;&lt;img src="http://home.ripway.com/2005-3/273114/pdf.gif" width=18 height=18 alt="PDF"&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://home.ripway.com/2005-3/273114/bostonTrip.pdf"&gt;bostonTrip.pdf&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111060267000983034?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111060267000983034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111060267000983034' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111060267000983034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111060267000983034'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/beginning-very-good-place-to-start.html' title='The Beginning, A Very Good Place To Start'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111026044375363211</id><published>2005-03-07T22:50:00.000-06:00</published><updated>2005-06-09T13:34:47.930-05:00</updated><title type='text'>Why Windows CE?</title><content type='html'>It looks like I've gone live, thanks to Mikehall's "&lt;a href="http://blogs.msdn.com/mikehall"&gt;look at Windows CE, Windows XP Embedded (and anything else that's cool or interesting)&lt;/a&gt;." Since this is in the CE category, maybe that means it's not cool or interesting. But hey, I'll take one out of three. I should also mention that I've never written a weblog before. Any tips some of you more experienced posters have would always be appreciated. (Heck, I'll even take grammer tipses.)&lt;br /&gt;&lt;br /&gt;So why did we choose Windows CE? There were a lot of reasons; most of them were good. As I mentioned &lt;a href="http://oswaldproject.blogspot.com/2005/03/good-ole-days.html"&gt;before&lt;/a&gt;, we were using an unsupported platform for development. But we'd used it for ten years, so we knew exactly what we could and couldn't do. But now (this was early August 2004) we were at a crossroads. A major OEM had contacted us and arranged a demo of an as-of-yet uncompleted system for March 2005. Like any company in our shoes, we agreed to the date first and asked the engineers second.&lt;br /&gt;&lt;br /&gt;George and I had come up with a rough DOS/Zinc timeline that was already aggressive. Perhaps "timeline" is the wrong word. It was a deadline with tasks stuffed into it to make them fit, AKA a "&lt;a href="http://www.edwardtufte.com/tufte/books_pp"&gt;Stalin deadline&lt;/a&gt;." ("There's &lt;b&gt;no&lt;/b&gt; line like the deadline," Stalin used to say. OK that sucked I just made it up.) Alec, our new Engineering Manager, was eager to make a good impression with the Director. Alec was a wizard at chip design. He was in his early forties, but his young looks and great hair were betrayed by his considerable paunch. We held a meeting to see how we could cram the timeline into the deadline.&lt;br /&gt;   "Come on, a week to work on fonts?" Alec asked with mock incredularity.&lt;br /&gt;   "Okay, maybe I can do it in 3 days," I allowed.&lt;br /&gt;We hadn't factored an OS change into the mix.&lt;br /&gt;&lt;br /&gt;Looking back, I think our options were fivefold: &lt;ol&gt;&lt;li&gt;&lt;b&gt;Continue using Zinc&lt;/b&gt;&lt;br /&gt;This would've required that we reinstate our licenses for two developers, upgrade to the current shipping version, and buy a high-speed &lt;a href="http://www.metagraphics.com/metawindow/metawindow.htm"&gt;graphics library&lt;/a&gt;.&lt;br /&gt;&lt;li&gt;&lt;b&gt;Zinc's former big brother: &lt;a href="http://www.windriver.com/products/device_technologies/os/vxworks5/"&gt;VxWorks&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Embedded Windows: &lt;a href="http://msdn.microsoft.com/embedded/windowsce/default.aspx"&gt;CE&lt;/a&gt; or XP&lt;/b&gt;&lt;br /&gt;We never really considered XP because of its size.&lt;br /&gt;&lt;li&gt;&lt;b&gt;Linux&lt;/b&gt;&lt;br /&gt;As Donald Rumsfeld was (in)famously &lt;a href="http://news.bbc.co.uk/1/hi/world/americas/3254852.stm"&gt;quoted&lt;/a&gt;, this was a "known unknown." I have some experience with Linux and SunOS, but not in the embedded world. And Linux isn't a real-time kernel without &lt;a href="http://www.fsmlabs.com/products/rtlinuxpro/"&gt;real-time&lt;/a&gt; &lt;a href="http://www.rtai.org/"&gt;extensions&lt;/a&gt;. (Not including projects from sites that end in .edu, which we weren't seriously considering.)&lt;br /&gt;&lt;li&gt;&lt;b&gt;Something else or roll our own: ???&lt;/b&gt; &lt;/li&gt;&lt;/ol&gt;This was a good starting point, and we used it to start looking at prices. WinCE got a boost from the fact that our potential &lt;a href="http://www.answers.com/single%20board%20computer"&gt;SBC&lt;/a&gt; manufacturer provided a &lt;a href="http://www.google.com/search?hl=en&amp;lr=&amp;amp;q=bsp+%22board+support+package%22"&gt;BSP&lt;/a&gt; for its &lt;a href="http://www.advantech.com.tw/products/Model.asp?Category_ID=1-TQNGC&amp;BU=ACG"&gt;PC/104 SBC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Our potential costs looked something like this: &lt;center&gt;&lt;table cellspacing="0" cellpadding="10" width="95%" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Zinc&lt;/td&gt;&lt;td&gt;~$6,000/developer* + royalties**&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VxWorks&lt;/td&gt;&lt;td&gt;~$10,000/developer + annual maintenance + royalties&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WinCE&lt;/td&gt;&lt;td&gt;$995/developer for Platform Builder + $3/device***&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;Linux&lt;/td&gt;&lt;td&gt;If the point of using Linux is that you get a free, open-source kernel, paying big bucks for real-time extensions doesn't seem to make sense. So Linux didn't make the cut.&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt;&lt;br /&gt;* For starters we needed licenses for two developers&lt;br /&gt;** Our current Zinc run-time license didn't include royalties&lt;br /&gt;*** $3 is for the core OS. The Pro version, which includes little niceties like Help, costs $16/device. We thought that we would only need the core OS. Also, &lt;a href="http://msdn.microsoft.com/embedded/getstart/evaluate/default.aspx"&gt;Platform Builder&lt;/a&gt; came with a 120-day evaluation period. (Tip: definitely get the CD or DVD; the download-over-the-web install can take up to 4 hours, even on a T1.)&lt;br /&gt;&lt;br /&gt;By comparison, our current costs were $0/developer and about $25/MS-DOS license. (In case you're wondering, yes, 24 years later Microsoft &lt;a href="http://www.microsoft.com/permission/copyrgt/cop-soft.htm#DOS"&gt;still sells MS-DOS&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;If you read through that table just now like I read through a similar list of options back in October, I think you'll agree that it wasn't much of a choice. There were still some critical questions to answer, though. Could the &lt;a href="http://www.house.gov/"&gt;bulk of a modern OS&lt;/a&gt; run as fast as practically running on &lt;a href="http://www.thewildwest.org/"&gt;bare hardware&lt;/a&gt;? How hard would it be to port 100,000 lines of code over to CE? Would our I/O handling be fast enough?&lt;br /&gt;&lt;br /&gt;One of the biggest problems, which I may post about later, is the bewildering way that Microsoft markets CE. What is Windows CE? Eight years after its release, I'd wager that a lot of people in the embedded industry couldn't give me the right answer. MS has done a great job of confusing the market about CE and Pocket PC. (As a bit of proof I submit: &lt;a href="http://www.microsoft.com/windowsmobile/pocketpc/ppc/default.mspx"&gt;the first MS-owned link from a "Windows CE" Google search&lt;/a&gt;.) And putting the ".Net" moniker in CE 4.2 was about the worst thing they could've done in the emdedded market. MS already has a reputation for &lt;a href="http://www.mdarwin.ca/humour/microsoft-bloatware.phtml"&gt;bloatware&lt;/a&gt;; what self-respecting engineer wants to put .Net--which for all intents and purposes to most people means the .Net Compact Framework--in an embedded controller?&lt;br /&gt;&lt;br /&gt;I found some good articles that helped reassure us about CE:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.windowsfordevices.com/articles/AT6761039286.html"&gt;Real-time determinism in Windows CE&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Straight from the horse's mouth: &lt;a href="http://www.microsoft.com/technet/prodtechnol/wce/plan/realtime.mspx"&gt;Real Time Systems with MS Windows CE&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncenet/html/real-time_netcf.asp"&gt;Real-Time Behavior of the .NET Compact Framework&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The last article, about running .Net managed code and still getting mostly deterministic behavior, reassured us that Win32 code could at least run faster than 50-odd µsecs. Still, without taking the steps to port a good portion of the codebase to run a test, we couldn't measure &lt;strong&gt;how&lt;/strong&gt; fast it would run.&lt;br /&gt;&lt;br /&gt;But something else that was less than reassuring was a high level of confidence in CE by people who had no idea why they were so confident in it. Maybe it's the classic difference between engineers and people who manage engineers. Rutherford, our Director of Engineering, unnerved me with his confidence about switching to CE. Fiftiesh with a graying pompadour and a self-described bureaucrat, Rutherford had a background in steel manufacturing. Maybe he held &lt;a href="http://finance.yahoo.com/q/bc?s=MSFT&amp;t=2y&amp;amp;amp;amp;amp;l=on&amp;z=m&amp;amp;q=l&amp;c="&gt;Microsoft stock&lt;/a&gt;, maybe using a Microsoft product gave him a &lt;a href="http://www.google.com/search?hl=en&amp;amp;lr=&amp;c2coff=1&amp;amp;q=warm+fuzzy+feeling+site%3Aunixwiz.net"&gt;warm and fuzzy feeling&lt;/a&gt;, or maybe it was the fact that we'd recently lost a sale to a competitor whose system ran Windows. (Even though our controller ran theirs into the ground during a week of independent testing, they taunted us with our "old" DOS system. It was wrong, but it stuck, both with our non-customer and back at the office.)&lt;br /&gt;&lt;br /&gt;For watever reason, Rutherford was set on CE. He couldn't remember its name--to this day he calls it "CE Microsoft"--but it got his vote. I remember preparing for a checkpoint meeting early on in the design phase about the control flow of the new UI. Rutherford and I were talking about the switch:&lt;br /&gt;   "That's &lt;b&gt;if&lt;/b&gt; we move to CE," I reminded him, expressing my doubts.&lt;br /&gt;   "We're &lt;b&gt;going&lt;/b&gt; to CE Microsoft," he said pointedly.&lt;br /&gt;&lt;br /&gt;CE 5.0 had just been released, but our vendor was only supplying a BSP for 4.2. Version 5.0 has some great features for developers but there's little incentive from a customer standpoint to want to upgrade. Someone in Korea took the time to put together a really nice PDF that shows a &lt;a href="http://academy.chosun.com/new3/n2board/upload/it_dst/Windows%20CE%205_0_Feature%20by%20Feature%20Comparison.pdf"&gt;comparison of CE 5.0 vs. 4.2&lt;/a&gt;.  (&lt;b&gt;Update:&lt;/b&gt; Found the &lt;a href="http://msdn.microsoft.com/embedded/getstart/compare/wincefea/default.aspx"&gt;original&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;In case you're wondering if I think we made the right decision, I absolutely do. There's no question in my mind that we needed to move away from DOS and start using a more modern RTOS and better toolchain. Whether &lt;b&gt;this project&lt;/b&gt; was the best project to jump into a new OS is what I'm less sure about.&lt;br /&gt;&lt;br /&gt;In Detroit and at other car-makers, a common engineering practice is to change one major system on a new model, but not more than one. For example, BMW might change the engine on their &lt;a href="http://www.bmwusa.com/vehicles/3"&gt;3-Series&lt;/a&gt;, or put it on a new frame, but they don't typically do both in the same year. We were changing everything: new hardware, a new OS, new software and a new toolchain. And we were doing it on a timeline that was so tight it didn't allow for losing even a half-day. It was the classic case of biting off more than we could chew.&lt;br /&gt;&lt;br /&gt;With the decision to use CE locked in place, we were all set to start porting our real-time app and writing the new UI app. The only problem was that none of us had written for CE before, and we didn't know where to &lt;a href="http://msdn.microsoft.com/embedded/getstart/default.aspx"&gt;start&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111026044375363211?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111026044375363211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111026044375363211' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111026044375363211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111026044375363211'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/why-windows-ce.html' title='Why Windows CE?'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111017552976908711</id><published>2005-03-06T23:08:00.000-06:00</published><updated>2005-04-04T13:46:32.990-05:00</updated><title type='text'>Good Ole Days</title><content type='html'>This is all leading up to why we chose Windows CE. It's taken me longer than I thought I would, and I think I should (quickly) explain our previous and current systems before I discuss our Big Decision.&lt;br /&gt;&lt;br /&gt;No engineering company is complete without the folklore of its past, and ours is no exception. We began with the first controller, as most companies do. It practically used vacuum tubes and &lt;a href="http://www.epemag.com/zuse/"&gt;mechanical relays&lt;/a&gt; to accomplish the ridiculously easy task of checking the glue level and sounding an alarm if it got too low. That grew into controllers that were dedicated to looking for some particular pattern of events. They were hardware-only. We even sent our customers manuals with instructions for how to set a row of 8 &lt;a href="http://www.webopedia.com/TERM/D/DIP_switch.html"&gt;DIP switches&lt;/a&gt; to represent binary distances! We quickly left that behind in favor of the enormous, 8-bit power of the &lt;a href="http://www.divelbiss.com/products/controller/bossbear/"&gt;Boss Bear&lt;/a&gt;, which featured a 2-line, 40-character display.&lt;br /&gt;&lt;br /&gt;Unfortunately, the Boss Bear BASIC programs were limited to 32K, which meant that as the program matured we had to strip out features to include others. Sometimes 3 or 4 lines of code were crammed into a single line of text to save space. Variables names were shortened to the minimum, comments were left completely out. That suited George just fine, who would rather not comment anything anyway. George was and is the longest-tenured programmer here. He has a slight build, wears his hair long, and works part time. He lives away from the office but commutes in once or twice a month. He's quirky to work with and at the same time he's one of the most likeable guys in the world. In some ways, he reminds me a lot of &lt;a href="http://www.jargon.net/jargonfile/t/TheStoryofMel.html"&gt;Mel&lt;/a&gt;; the guy could probably write a compiler in 8 lines of code using only pointer arithmetic, preprocessor directives and macro expansion. Uncommented, of course. One day I'll have to write about George, but that's a post for another day.&lt;br /&gt;&lt;br /&gt;Well, the world of Boss Bears came and went, and we pushed into the age of embedded boards running on Intel chips with our next system. It was written in a mixture of C/C++ and ran on a 486 DX2/66 on the &lt;a href="http://www.stdbus.com/"&gt;STD bus&lt;/a&gt;. It used a 10.4" EL display and had a full keypad and dedicated buttons on the front. It was a marvel of its day. The display used to &lt;a href="http://66.102.7.104/search?q=cache:AeqbV4gZD3wJ:www.corning.com/displaytechnologies/ww/en/discovery_center/glossary.aspx+el+display+burn-in&amp;hl=en"&gt;burn in&lt;/a&gt; within weeks, but that was a small price to pay compared to the potential of this 486 powerhouse!&lt;br /&gt;&lt;br /&gt;The program ran on MS-DOS 5, which was overclocked to give us a 50µsec polling loop. It used the &lt;a href="http://www.psa-software.com/zinc.asp"&gt;Zinc Framework&lt;/a&gt;. If you've never heard of Zinc you're not alone. In fact, the &lt;a href="http://groups-beta.google.com/groups?q=zinc+framework"&gt;nine of us&lt;/a&gt; who &lt;b&gt;have&lt;/b&gt; heard of Zinc are the oddballs. Zinc employed a write-once, compile-for-anything idea. It wasn't actually "anything," but they started with compile keys for 3&lt;sup&gt;1&lt;/sup&gt;/&lt;sub&gt;2&lt;/sub&gt; major OSes: DOS, Windows, Unix and OS/2. Zinc was too far ahead of its time. If the tides of history had flowed a little differently, it might have been what Java is today. Unfortunately, the company fell on hard times and was bought by WindRiver. But WindRiver couldn't figure out what to do with it and later sold it to PSA, a group of former Zinc consultants.&lt;br /&gt;&lt;br /&gt;Eventually, though, our customers demanded more and more powerful machines, so the next version was born. We stuck with the STD bus but &lt;a href="http://www.versalogic.com/Products/ProductSelector.asp?CategoryID=1&amp;amp;BusType=3"&gt;upgraded&lt;/a&gt; the processor to a Pentium, sans &lt;a href="http://www.jeffbots.com/bunnypeople.html"&gt;bunny people&lt;/a&gt; and &lt;a href="http://www.intel.com/pressroom/archive/releases/20010215corp.htm"&gt;blue people&lt;/a&gt;, which ran as hot as that SBC form factor would allow. The display was upped to a 12" TFT running at 640x480 but the effective area stayed the same. The right side and bottom were covered with a two-column keypad for data entry and a button strip for commonly-used functions.&lt;br /&gt;&lt;br /&gt;Astute readers have probably noticed a pattern emerging from generation to generation. In each new system, software grew more powerful and took over what had been dedicated hardware before. Previously, for example, for an important toggle button we had a physical pushbutton that was mounted into the face of the controller, and wired into I/O. Now it was done with a screen overlay.&lt;br /&gt;&lt;br /&gt;And the next controller, the Oswald Project, called for zero hardware buttons. Instead, a single 15" display running at 1024x768x16bpp would take care of all controller functions. But we had a problem: Zinc couldn't drive anything higher than 640x480 without a new graphics library. And that library didn't work on the version of Zinc that we had. And the license for the version of Zinc that we had was expired.&lt;br /&gt;&lt;br /&gt;The time was ripe to pick a new development system and toolchain. Up next: our choice of OS (for real this time).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111017552976908711?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111017552976908711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111017552976908711' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111017552976908711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111017552976908711'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/good-ole-days.html' title='Good Ole Days'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111014756136290743</id><published>2005-03-05T14:56:00.000-06:00</published><updated>2005-03-07T16:34:33.980-06:00</updated><title type='text'>The Company</title><content type='html'>If I was a box maker and I wanted to find a bad box that was moving at more than 20 MPH and pull it out of my production line, how would I do it? It turns out that it's a very difficult and unique problem. That question, and others related to carton gluing and detection, are worth about $50 million annually to our tiny niche of the packaging market.&lt;br /&gt;&lt;br /&gt;But our niche solves an important problem. (Every business exists because it solves &lt;b&gt;some&lt;/b&gt; problem. And businesses thrive when they solve the &lt;b&gt;right&lt;/b&gt; problems for the &lt;b&gt;right&lt;/b&gt; people.) We solve a problem that is unique, we solve it very well, and there are big companies that are willing to pay us a lot of money to provide them with our solution.&lt;br /&gt;&lt;br /&gt;In the world of boxes there are two major types: &lt;a href="http://www.indiamart.com/aakriteepackaging/"&gt;corrugated&lt;/a&gt; (the kind of boxes we used to move into our house last summer ) and &lt;a href="http://www.smurfit-stone.com/Content/Products/FoldingCarton/FoldingCarton/"&gt;cartons&lt;/a&gt; (the kind of box that my Cinnamon Life comes in). The corrugated market is a down-and-dirty market. Boxes are cheap, and so is the equipment that runs them. But the folding carton market is a gold vein. Anything that comes in a box--from a tiny tube of Blistex to a big box of Cheerios to a smaller tissue box to a complicated bottle carrier--is produced in the folding carton market. Consumer-oriented companies have one way to get you to buy their product when you're at the store: the look of the packaging that it comes in. So it's in their best interests to produce the best looking cartons that will catch you or your kids' eyes first.&lt;br /&gt;&lt;br /&gt;It's a huge business. The next time you finish your last can of Coke, rip open that Coca-Cola Fridge Pack&amp;#153; (Pepsi countered with its Fridge Mate&amp;#153;--how original) and you'll notice three or four patent numbers printed on one of the flaps. Most people, myself included, would never think that someone would patent something as simple as a box. But if you look at them closer, they're not so simple. A lot of engineering goes into the designs and several Fortune 500 companies are willing to spend a lot of research dollars to preserve their competitive edge.&lt;br /&gt;&lt;br /&gt;Cartons are usually printed on 4- or 6-color presses, then run through a cutter, then loaded onto a &lt;a href="http://www.heidelberg.com/www/pages/content.jsp?contentID=3041"&gt;folder-gluer&lt;/a&gt;. The folder-gluer is a bit of a misnomer: it folds, but it doesn't usually glue. That part is left up to systems like ours, which glue the boxes, and do quality control on them.  Any spoilage on the gluer costs the most.  The most expensive part of the life cycle of a carton is on the gluer. Even worse, a single misfed or skewed carton can jam up the entire line and ruin hundreds of other cartons. The Georgia pine used in the substrate of some cartons, like soft drink 24-packs for example, is so strong that when it jams up it can bend the steel of the machine.&lt;br /&gt;&lt;br /&gt;But it's not just the strength of the cartons that bends the machine, it's the speed that they move at. Some gluers can run upwards of 200,000 cartons per hour (CPH). That's really, really fast. Even 60,000 CPH is so fast that when I look at it it looks like a solid sheet of board moving past.&lt;br /&gt;&lt;br /&gt;Even at those speeds, we produce a system that can lay up to 16 lines of glue on a single carton, monitor that glue (or any other pattern), and pull out a single bad carton from the jet stream of good ones. It's not cheap; a complete system can cost around $80,000. But if you're the guy who just bought a &lt;a href="http://www.bobstgroup.com/Global/Worldwide/en/FoldingCarton/BobstFolder-GluersFC/Equipment/ALPINA_130_II_A.htm"&gt;$500,000 folder-gluer&lt;/a&gt;, we're in business to make sure that you pay a little more to get a great gluing/detection system to go along with it.&lt;br /&gt;&lt;br /&gt;It's taken us a few tries to get it right.  Our current system is the fifth generation of controllers that we make.  This generation is as perfect as it can get, but it's also a maxed out system, and our customers are always clamoring for more features.  So our next generation of controllers will be expandable to 24 patterns, big enough to run even those tricky &lt;a href="http://www.smurfit-stone.com/Content/Products/Paperboard/CoatedBoxboard/ClayCoatedRecycledBoxboard/BeverageCarrierGrades/"&gt;beverage carriers&lt;/a&gt;.  And it will be cheaper.  It'll also run faster.  It will be easier to use, too, thanks to a completely reinvented GUI.  Oh, it'll also solve world hunger.  Enter the Oswald Project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111014756136290743?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111014756136290743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111014756136290743' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111014756136290743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111014756136290743'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/company.html' title='The Company'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11245041.post-111000298769567295</id><published>2005-03-04T22:54:00.000-06:00</published><updated>2005-03-08T11:17:18.643-06:00</updated><title type='text'>Hello, WWWorld</title><content type='html'>Partly at the suggestion of &lt;a href="http://blogs.msdn.com/mikehall"&gt;Mike Hall&lt;/a&gt;, I've decided to start a weblog about a very, very small corner of the universe known as Windows CE. Specifically, this is a blog about a real-world project using CE.&lt;br /&gt;&lt;br /&gt;There are other blogs about WinCE written by &lt;a href="http://msdn.microsoft.com/embedded/community/community/wembblogs/default.aspx"&gt;people&lt;/a&gt; who know &lt;a href="http://blogs.msdn.com/cenet/"&gt;far more&lt;/a&gt; about it than I may ever know.  (I'll link to them as I find them.)  And there are some good &lt;a href="http://www.codeproject.com/ce/"&gt;online tutorials&lt;/a&gt; for getting started with CE.  But as far as I know there are no weblogs about the trials and triumphs of actually working on a corporate CE project.  So I'm starting one today.&lt;br /&gt;&lt;br /&gt;Today is March 4, and this marks the seventh month of the Oswald Project, although in all fairness we've only been doing serious development since Jan. 4 of this year. The finish date for this project was supposed to be March 25, which is a scant 3 weeks away from today. But despite our three month death march, we are still far behind schedule and will badly miss our target date. That day was supposed to be a live demo at one of the most important (potential) customers of my company's 76-year life.&lt;br /&gt;&lt;br /&gt;Speaking of my company, I will try to post everything that I can about this project within the confines of a competitive marketplace. In the ideal world of academics and research I wouldn't have any qualms about posting information relevant to this project. But in the dog-eat-dog marketplace of free enterprise and international espionage, there is a possibility that our work does not go unnoticed by our competition. And our competition has been nipping at our heels as of late...&lt;br /&gt;&lt;br /&gt;So to protect the innocent--and the guilty, of which there are a few--the names and specifics have been changed. I will call this project the Oswald Project. Oswald is an obscure painter.&lt;br /&gt;&lt;br /&gt;Painting aside, this blog will mostly cover the technical details of what it takes to create a brand new Windows CE project and ship it to a customer. But if I start to wax philosophical or wander off into stories of my personal life, please forgive me. I’ll soon get back on course.&lt;br /&gt;&lt;br /&gt;I also have a lot of background to write to get you up to speed. (We'll see how that fits with my 70-hour work weeks.) But eventually, I'll catch up to real life and start posting about what's currently happening. Until then these posts will have a historical bent. Perhaps those are better: with the passing of time, feelings and opinions fall by the wayside and only the facts remain.&lt;br /&gt;&lt;br /&gt;Up next: some background on the company and our reasons for choosing WinCE.&lt;br /&gt;&lt;br /&gt;This blog Copyright &amp;copy; 2005 D. Philippe&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11245041-111000298769567295?l=oswaldproject.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oswaldproject.blogspot.com/feeds/111000298769567295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11245041&amp;postID=111000298769567295' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111000298769567295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11245041/posts/default/111000298769567295'/><link rel='alternate' type='text/html' href='http://oswaldproject.blogspot.com/2005/03/hello-wwworld.html' title='Hello, WWWorld'/><author><name>D. Philippe</name><uri>http://www.blogger.com/profile/08034149006051505672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>
