esm.logic.net latest entrieshttp://esm.logic.net/2011-12-15T18:16:25+00:00Ed Marshallesm+blog@logic.nethttp://esm.logic.net/A personal weblogGoogle Chromebook
2011-12-15T18:16:25+00:00http://esm.logic.net/2011/12/15/google-chromebook/<p>I recently flew with <a href="http://www.virginamerica.com/">Virgin America</a>, and had an opportunity to check out a <a href="http://www.google.com/chromebook/">Chromebook</a> for the flight. Since the flight was delayed 2.5 hours because of weather in Chicago, I was actually able to give this thing a pretty good workout. At the end of the trip, they asked me to fill out a feedback form; since I spent the time typing it out, I figured I might as well make a blog post out of it.</p>
<blockquote>
<p>Overall, not great, but not terrible. I had one of the white Samsung models.</p>
<p>A few comments (mostly critical, and very long; sorry for that):</p>
<ul>
<li>THANK YOU for CTRL-ALT-T. Being able to ssh is a big deal for my line of work; I spent a good amount of time looking for browser-based solutions, and finding none (that worked), found a post talking about the text terminals.</li>
<li>In that vein: no java support? :-( (My first stab at this was an applet-driven ssh client.)</li>
<li>No support at all for my company's VPN (in this case, it's a Juniper SSL VPN solution). This is a deal-breaker for any kind of travel use for me or any of the professionals I work with, which is a shame, since we do damn near everything online (google apps for email/docs/etc, confluence/jira for wiki and bug tracking, reviewboard for code reviews, remote machines for development; almost nothing runs locally).</li>
<li>As a current Mac user, the touchpad was jarring; two-finger touch worked, but continuous/intertial scrolling wasn't there. Acceleration in general didn't seem to map well. So, kind of "uncanny valley" in that respect; close, but different enough to feel really weird. (Also, it's been a while since I used a non-Mac keyboard layout; it's really weird that the flower key, which used to grate on me constantly, has become something I miss now.)</li>
<li>As a current Linux desktop user, I saw a problem that grates on me there as well: terrible font rendering. After using recent Windows and OSX releases, and Linux desktops that have been manually brought into the modern age of typography, it's really rough seeing that kind of rendering on the screen. :-P You're Google, you should be able to cross-license what you need to make this suck less.</li>
<li>Constant crashing. Had to have happened at least 5-10 times over the course of my flight (plus a 2.5-hour delay). To it's credit, the browser was able to mostly recover my session (although I ended up having to locate my position again in the PDF book I was reading each time this happened). Also, text terminals survived, so I was happy about that. :-)</li>
<li>Speaking of books: I didn't see anything obvious that suggested that an ebook reader was available...given the competition you have in the tablet and ebook reader space, maybe an opportunity to point out another device people wouldn't have to carry if they had one of these? :-)</li>
<li>About that 2.5-hour delay: the battery held up wonderfully. I picked it up at around 12:30 PST, and used it constantly the entire time. I closed it for the trip at around 7:15 PST or so, and there appeared to be plenty of life left. Awesome!</li>
<li>Hardware fit-and-finish: love the big touchpad (but you really should make tap-to-click the default!), the keyboard layout was mostly good (although I kept fat-fingering the arrow keys, and the spacebar was sprung VERY tightly), but the laptop itself was starting to flex considerably (lots of creaking, could actually twist it laterally) and the screen hinge was pretty loose. I assume it's because of the heavy use on these flights, but I have a pretty good idea of what the hardware will be like after a year or so of use.</li>
<li>Separate bullet point for the screen: :-( The brightness controls were basically a large hammer rather than a fine adjustment, and without adjustable contrast, there was basically only one or two usable settings. Viewing angles were pretty bad as well, and because I'm a big guy, I generally can't look at a screen straight-on when I'm on an airplane without tilting the whole thing at an odd angle (fine for movies, bad for actual work).</li>
<li>Caps lock by pressing both shift keys? Yeah, discovered that one by accidentally hitting them both, then had no clue how to turn it off (I figured it out, but "Aunt Tillie" would have had no clue). "Search key" instead of caps lock? Seriously? DO NOT WANT.</li>
<li>Wasn't able to do a proper sync with my google apps account, every time I clicked on "customize" under sync prefs, it looked like there was a quick page refresh (to chrome:///settings/syncSetup) and then bam, back at the same screen again; I assume it's because that was disabled in these models? Would have been nice to have my bookmarks and preferences (I'm a heavy Chrome user on my regular machines).</li>
<li>Missed the ability to have multiple things on the screen at once. I started suffering from tab-switching fatigue by the end of the flight. ;-)</li>
<li>Performance was noticeably bad. This is one I have a hard time forgiving: with only a few tabs open (gmail and twitter, specifically), Angry Birds was almost unplayable (it screams on my laptop and older desktop machine) with jittery animation and generally stutters in activity. I noticed this on-and-off in regular use; the mouse would be responsive, but the UI would queue up input, and not respond for several seconds. Frustrating.</li>
</ul>
<p>So, at the end of the day: not going to pay over $400 for one of these, even for a non-technical family member (who I think a device like this might eventually be good for). At that price, I can get them a nicely-configured Android or iOS tablet with a dock and bluetooth keyboard, or even a decent fully-functional netbook. It was interesting, but felt like prototype hardware and software, not something you'd actually expect someone to buy.</p>
<hr />
<p>This all sounds very critical, but I'd like to put one thing in perspective: I'm an ops and software dev guy, well outside what I'd expect to be your target audience, and I managed to use this thing the entire flight without once pulling out my MacBook Pro. I worked on code, read part of a book, listened to a bit of music, trolled on Reddit, and kept up with multiple email and Twitter accounts. Of all the points above, only one was a real deal-breaker (the inability to connect to our VPN); the rest are almost all software issues that can be solved over time, with a few fit-and-finish points for your manufacturers.</p>
<p>I expected to play with this as a toy for an hour or so, then pull out my real laptop and get some work done. Instead, I went the entire flight with the MacBook unopened. That's fairly impressive, at least to me.</p>
</blockquote>
@esm is moving
2011-05-30T04:19:24+00:00http://esm.logic.net/2011/05/30/emarshal-moving/<p>
An old friend of mine told my wife I needed to update my blog with the stuff that's been happening lately. So, here we go: a mega-post of stuff that's been happening.
</p>
<p>
Bad news first. Hal, Erica's dad, passed away this month; he was laid to rest to the sound of guns firing at Abraham Lincoln National Cemetery on May 18, 2011. You can read <a href="http://legacy.suntimes.com/obituaries/chicagosuntimes/obituary.aspx?page=lifestory&pid=151005733">his online obituary</a> if you'd like, and leave comments for the family. Rest in peace, Hal; you're going to be missed by a lot of people.
</p>
<p>
In less sombre news, I had a marathon sprint of car repairs. First, I finished the brakes on the Jeep. (Never sign yourself up for replacing the factory hard brake lines on a car. It's a huge pain in the ass.) Next, I got the Laser running again (obtained a good 14b turbo, and slapped it all back together). Next up was the Evo: putting all the emissions equipment I'd removed back on the car, and putting a few other parts back to stock so the car will pass CA emissions. Then, for the next three days, I turned my attention to the Eclipse. I managed to get the suspension back on the car, the brakes installed and bled, the rear diff and beefy new rear axles in, the engine/trans/clutch bolted back together and dropped into the car, some of the interior reinstalled, and a ton of other little items. It sat on the ground just long enough for me to realize I'd screwed up the right front trailing arm; fixed that, and then it went up on a flatbed for shipping.
</p>
<p>
Shipping? Yeah, that's the other big thing that's been going on. The same day, we loaded up most of our house (aside from the stuff Erica's going to need for the next year) into a semi, and sent it on it's way to the San Francisco Bay Area. Erica and I enjoyed a great last day together (for the next couple of months), and I loaded up the last of my belongings in the Evo and drove 2100 miles over the next three days.
</p>
<p>
Erica won't be able to join me for a year; she still has two semesters of her <a href="http://www.jjc.edu/">vet tech program</a> to complete, although there's a possibility she might be able to move out earlier if she can land an externship out here (and we're able to come up with a home for the dogs in the interim). We'll be doing the long-distance thing, with the occasional flight one way or the other every few months.
</p>
<p>
I drove out here with only a rough idea of what I was going to do; I didn't have a storage unit for my stuff lined up, and I didn't have an apartment. While this approach maximizes the level of stress in my life, winging it has been a pretty successful strategy for me in the past, and it seems to have worked out well this time too. On the second day of looking, I landed a great apartment in the middle of Alameda; covered parking for the car, tons of room, and a rent that's significantly better than I thought I'd be paying out here. I also managed to get a storage space in the facility I wanted; this proved to be harder than planned, since every storage facility I spoke to out here won't let you store inoperable vehicles unless they're registered as such here in CA, but <i>you can't register a car for the first time here unless it runs</i> so that it can pass the initial inspection. Basically, the DMV doesn't want to register it until I'm ready to put it on the road (likely never; it's a race car), but the storage facilities wouldn't store it unless it was registered. I managed to get a regional manager for my facility to see how silly that was, and viola, problem solved.
</p>
<p>
So, why the move? I accepted a position with <a href="http://twitter.com/">Twitter</a> as an Operations Engineer. As much of a mess as this move makes out of my personal life, my professional alter-ego is completely stoked about this. The guys I talked to there are sharp, they're working on incredibly cool stuff, and I'm excited that I managed to hoodwink them into thinking that <a href="http://en.wikipedia.org/wiki/Impostor_syndrome">I know what I'm doing</a>. :) I start on the 6th.
</p>
<p>
(And if you <a href="http://twitter.com/esm">followed me on Twitter</a>, you'd have known all of this already. ;) I'm hoping I'll have a little spare time, now that I'm out here with no social life, to finish the changes I've been working on for this site so that it pulls in my microblogging activity automatically along with some other stuff I post here and there; I'll finally have my online identity aggregated in one place that I control. Sorry, Facebook; you do the job, but you do it poorly.)
</p>
On searching
2011-04-08T15:35:45+00:00http://esm.logic.net/2011/04/08/searching/<p>
I've been using <a href="http://duckduckgo.com/">DuckDuckGo</a> as my default search engine for about a month now, both at work and at home. It's been enlightening, as it's focused my thoughts about how I use search engines in my day-to-day use of the Internet.
</p>
<p>
I lean on search <em>a lot</em>. I'm a generalist in my day-to-day work, which means being able to recall a lot of specific information about a lot of disparate topics rapidly and accurately. The human brain just isn't built for that, beyond a certain point (you have the details of what you've most recently been working with readily at hand, but it's unrealistic to expect that you'll have the details of everything you've ever worked with in your hot cache, unless <a href="http://worldmemorychampionships.com/">remembering things</a> is what you do for a living).
</p>
<p>
Luckily, I have nearly the entire corpus of human knowledge at my fingertips, assuming I can convince the gatekeepers (search engines) to offer it up to me. I had always thought about search as a fairly nebulous thing; I want to know something, so I search for it. Since switching my default search engine, I've realised that, depending on what it is I'm trying to accomplish with a search, the mechanics needed to satisfy it seem to be radically different.
</p>
<p>
First, I use search as knowledge augmentation: I know the domain I'm searching within, and am using search as instant recall for specifics. This is typically the case when I'm programming or dealing with system administration tasks: I know that the algorithm, API, or command argument I'm searching for exists, I probably know a few details about it, but I need to know a specific item (that I've likely seen before).
</p>
<p>
DDG is incredible for this type of activity; it's pre-seeded with structured information that informs searches of this type, from their bang syntax, to the zero-click box at the top of the screen. They also seem to filter aggressively on the results, so you typically get a very limited set of answers, all relevant. So far, this has been a huge productivity win for me when I'm looking for information like this.
</p>
<p>
The second way I use search is exploratory: learning about a new field, refreshing my memory on a skill I haven't used in a long time, or seeing what others have done when I'm trying something new. Sometimes, this ends up looking a lot like the first style; it might be "new to me", but not at all new to the rest of the world. However, the more obscure my interest becomes, the less appropriate curated and filtered results become. These tend to be deep dives into a topic, requiring a significant investment of time.
</p>
<p>
I'm looking for "long tail" results here; an obscure post on a Chinese blog about a particular microcontroller that I have to feed through Google Translate, a mailing list post about a performance experiment someone ran with an old piece of hardware, that kind of thing. Sometimes, I'm happy to simply find someone I can contact and ask directly. It's these long-tail results that Google is simply unmatched on, in my experience, and you can't take shortcuts to get here: you have to do the hard work of scouring everything you can find, no matter how useless it might seem, and indexing it effectively.
</p>
<p>
This revelation has actually improved my productivity significantly: when I become aware that I'm researching, rather than augmenting, I scroll to the top of the DDG screen and stick a "!g" at the beginning of the search phrase (which redirects me to Google). Since using search for rapid augmentation (with knowledge that DDG seems to have solid coverage of) is my typical use case, leaving DDG as my primary makes sense for me.
</p>
<p>
Going a bit further, it clearly indicates to me that there's room for competition in this space. These are just two workflows that fell out naturally for me without putting much thought into it; I suspect there's plenty of opportunity to further differentiate here, targeting the unique ways people interact with search, rather than trying to "<a href="http://ycombinator.com/howtoapply.html#f2n">be the next Google</a>".
</p>
IPv6
2011-02-02T01:45:45+00:00http://esm.logic.net/2011/02/02/ipv6/<p>In honor of <a href="https://secure.wikimedia.org/wikipedia/en/wiki/IPv4_address_exhaustion">the last IPv4 blocks</a> being assigned to the RIRs today, I've finally gotten around to setting up IPv6 tunnelling for the server running this website, and the AAAA records are live.</p>
<p>Tunnelling was necessary, because neither <a href="http://www.slicehost.com/">Slicehost</a>, who I currently host with, nor <a href="http://www.linode.com/">Linode</a>, the company I'm moving to soonish, support native IPv6 transport, nor dual-stack. So thanks, <a href="http://www.tunnelbroker.net/">Hurricane Electric</a>, for offering a disturbingly easy service to bolt up to, for free.</p>
Instructabliss
2011-01-11T18:06:02+00:00http://esm.logic.net/2011/01/11/instructabliss/<p>If you visit <a href="http://www.instructables.com/">Instructables</a> with any regularity, you're probably painfully aware of how viewer-unfriendly the layout is. Hence, <a href="http://daid.mine.nu/instructabliss/">Instructabliss</a>, a single-page crap-free version of the content you'd normally view at Instructables.</p>
<p>So, in the spirit of making the Internet better for everyone (except, perhaps, Instructables), I give you a <a href="javascript:void(x = document.location.toString().split('/')); if (x[2] == "www.instructables.com") { open('http://daid.mine.nu/instructabliss/?url=http://www.instructables.com/id/' + x[4] + '/').focus(); } else { alert('Must be a page on www.instructables.com.'); };">bookmarklet</a> that you can drag to your bookmarks bar that redirects you to the Instructabliss version of an Instructables article whenever you happen across one.</p>
SH2 Disassembler
2009-10-15T19:56:48+00:00http://esm.logic.net/2009/10/15/sh2-disassembler/<p>My non-geek friends should probably just tune out now. My geek friends who don't care about my car hobby probably won't care too much about this either. ;)</p>
<p>I've written a rudimentary, but automated, SH2 disassembler in <a href="http://www.python.org/">Python</a>. It's licensed under the GNU General Public License (Version 3), and can be downloaded from here:</p>
<p><a href="http://dev.logic.net/hg/sh2dis/file/">http://dev.logic.net/hg/sh2dis/file/</a></p>
<p>(You'll need all files from that folder ending in <kbd>.py</kbd>, or just click on "zip" in the left-hand sidebar to download a zipped version of the whole project.)</p>
<p>This is not an <a href="http://www.hex-rays.com/idapro/">IDA Pro</a> replacement. That being said, my motivation was not having to point folks who are interested in ECU development toward a $1000 code analysis package that they'll only end up using 1% of. And let's be honest: those people I pointed at IDA probably just ended up pirating it. :(</p>
<p>As of now it has no user interface at all, simply a demo application (<kbd>dis.py</kbd>) that, given a ROM image from an Evo VIII or IX (and probably most other 7052- or 7055-based platforms, such as the Hayabusa ECU), tries to perform an automatic disassembly by following interrupt vectors.</p>
<p>Segment handling is modeled after IDA, and I've tried not to torpedo the possibility of implementing other processors (specifically, H8/500, HC11, and HC16, all of which I have a personal interest in), but I just haven't had the time to think about that yet. The output doesn't currently include IDA's comment-based cross-references, although that information is tracked and could be added pretty easily. It automatically labels "known" (ie. from the platform docs) vectors and registers, and can follow most branches; it's not smart enough to recognize a few known jsr/jmp table patterns, but it's on the to-do list. Branch handling is done by doing very basic register assignment tracking, and there's a ton of room for improvement here (but it seems to be good enough for "in the wild" Evo ROMs right now).</p>
<p>It requires Python 2.6. Python 2.5 and 3.0 will not work, period, full-stop. I'm not interested in porting to Py3k just yet (it needs a little wider adoption first), and I'm making pretty heavy use of 2.6/3.0 string formatting, making it a PITA to make it compatible with 2.5 at this point.</p>
<p>In case it's not completely obvious yet: this is NOT end-user software. The target audience for this is other Evo developers right now, and probably only those with a solid working knowledge of both IDA and python. Knowing SH2 assembly wouldn't hurt, either. ;)</p>
<p>Performance is not quite where I'd like it to be right now; it takes about 30 seconds on my old dev machine (Dual PIII 1GHz, Linux) to run through a complete disassembly and output, which feels a bit slower than IDA's automated analysis. I'll be very honest, I'm not worrying much about that just yet, since there's so much additional work to be done elsewhere. (If anyone reading this feels like tackling the main bottleneck, it's in <kbd>sh2.py</kbd>, in <kbd>disasm_single()</kbd>; a short-circuiting instruction matching scheme in there, perhaps along with better opcode storage in sh2opcodes.py, would probably cut runtime by more than half.)</p>
<p>It's probably extremely buggy, and the source is certainly a mess as it sits right now. Bug reports and patches are welcome.</p>
Linux administration tip: Bash history retention
2010-09-17T19:17:50+00:00http://esm.logic.net/2010/09/17/linux-administration-tip-bash-history-retention/<p>A quick random Linux administration tip: add the following three lines to <kbd>root</kbd>'s <kbd>.bashrc</kbd>:</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span>[ ! -d $HOME/.history ] && mkdir $HOME/.history
set -- `/usr/bin/who -m`
HISTFILE="$HOME/.history/`/bin/date +%Y-%m-%d.%T`.`/bin/hostname -s`.$$.$1"
</pre></div></td></tr></table></div>
<p>Once you do, future login sessions as root will be saved in a directory named <kbd>.history</kbd> in <kbd>root</kbd>'s home directory, in the pattern:</p>
<pre>2010-09-17.13:53:27.foohost.14379.foouser</pre>
<p>Why would you want to do something like this? First, each shell/session is stored to it's own file, rather than interleaving into a single file in whatever order you might have exited them. Second, it tells you both when you started the session (by the filename) and when you ended it (by the timestamp on the file). Third, for systems administered by multiple people, it tells you who was <kbd>su</kbd>'d to <kbd>root</kbd> when the session occurred (or just displays <kbd>root</kbd> for console logins), so you know which admin "owned" that session.</p>
<p>The main downside here is that you lose the ability to see multiple sessions' worth of history in your history buffer, but for systems with multiple admins, I haven't missed it (as getting someone else's history when scrolling back has proven more annoying than helpful for me), but if you lean hard on your history, this might not be a net win for you.</p>
<p>Also, I'd suggest resisting the urge to treat this as an "audit log" of any kind; it's trivially bypassed, meaning that this is for teams that trust each other. Use it instead as a way of recreating the how and why of a change after (occasionally <em>long</em> after) it was made.</p>
Synaptics touchpads and middle-clicking
2010-08-04T21:34:34+00:00http://esm.logic.net/2010/08/04/synaptics-touchpads-and-middle-clicking/<p>I don't usually blog Windows tips, but since I've been spending a bit of time with Erica's new subnotebook (MSI U230), I've been fighting with Windows more than usual. Apparently, <a href="http://www.synaptics.com/">Synaptics</a> is waging a war against physical buttons; pressing both mouse buttons to simulate a middle-click is a pretty standard thing, but there's no obvious way to enable it on one of their touchpads with a recent driver release.</p>
<p>But, it does actually support the behavior, via an undocumented feature (presumably reserved for OEM use). Fire up <kbd>regedit</kbd>, navigate to <kbd>HKEY_LOCAL_MACHINE\Software\Synaptics\SynTP\Defaults</kbd>, right-click and create a new DWORD value named <kbd>HasBothButtonFeature</kbd>, and set the value to <kbd>1</kbd>. Log out and back in again (or reboot), and clicking both touchpad buttons at the same time will result in a middle-click. From there, you can now use Synaptics' software to reassign that action to whatever you'd like.</p>
TFTP and SELinux
2010-08-02T17:54:24+00:00http://esm.logic.net/2010/08/02/tftp-and-selinux/<p>A quick post in case someone else runs into this: by default, RHEL's <kbd>tftp-server</kbd> package creates <kbd>/tftpboot</kbd> with an SELinux context of <kbd>system_u:object_r:tftpdir_t</kbd>. That works great, until you need to actually upload something. To enable uploading, you have to change the context to <kbd>system_u:object_r:tftpdir_rw_t</kbd>. To do so, run the following command as root:</p>
<blockquote><kbd>chcon -R system_u:object_r:tftpdir_rw_t /tftpboot</kbd></blockquote>
<p>As far as I can tell, this is completely undocumented.</p>
Your advertising makes me think you hate me.
2010-07-08T17:00:00+00:00http://esm.logic.net/2010/07/08/advertising-and-respect/<p>Dear ad-supported website owner: the promise of content is what brought me to your site, but your advertising does it's level best to attract my attention <em>away</em> from that content. Which leads me to wonder: did you actually have something to say, or were you just trolling for eyeballs?</p>
<p>This thought came to me while I was reading <a href="http://news.ycombinator.com/item?id=1493762">yet another discussion</a> about the merits and evils of ad-blocking. I've found myself unable to tolerate more than brief exposure to many websites without an ad-blocker over the last few years, so I find the responses on the pro-advertising side of the argument to be quaint in how they fail to completely miss the other side's point.</p>
<p>Most of us who use ad-blockers aren't going to change our behavior because someone makes an emotional appeal about the families of businesses supported by ad revenue, or because of a guilt-laden rant about how we're stealing under some ridiculous implied contract between content owners and readers. We simply don't care anymore. This is our last-ditch effort at making a medium usable for us, before we finally turn away from it. We're trying very hard to hide from sight the distinct lack of respect many content creators show their readers; it's a strained attempt to see the Internet as we'd like it to be.</p>
<p>I don't read the newspaper anymore, because of the ads strewn throughout the content, and an intentional "choose your own adventure" style of breaking up content that maximizes advertising exposure. Magazines are in a similar boat. (Although, I find European magazines to be far less obnoxious in this regard than American publications.) I rarely watch television anymore, because of the advertising in and around the shows. I only listen to the radio long enough to hear the weather forecast, because of ads that have ranged from annoying to enraging. (Blaring the sound of emergency vehicles or screeching tires in an ad, when much of your target audience is driving? Seriously?)</p>
<p>The unstated goal of any piece of advertising is to rip the reader's attention away from what they were really interested in, and focus it for a moment on something they likely don't give a damn about. It belies a complete lack of respect for the reader or viewer, and suggests that their sole reason for producing content is to ambush the consumer with unrelated garbage: it's nothing but <a href="http://www.mahalo.com/" rel="nofollow">Mahalo</a> or a typo-squatter, a tawdry bait-and-switch that leaves the user feeling, well, used.</p>
<p>So, <a href="http://safariadblock.com/">I</a> <a href="http://adblockplus.org/">block</a> <a href="http://chromeadblock.com/">ads</a> or <a href="http://lab.arc90.com/experiments/readability/">manipulate</a> <a href="http://blog.arc90.com/2010/06/07/safari-5-another-step-towards-better-reading-on-the-web/">content</a> <a href="https://chrome.google.com/extensions/detail/mopngoefggcibgpnefgiojkehfmdfcjn">layout</a> in my browser, because I have a hard time caring about the business model of someone who shows such contempt for me as a visitor. I feel a small twinge of sadness for businesses who use targeted advertising that carefully compliments their content - rather than distracting from it - who become caught up in this, but it is a case where the majority have ruined the situation for everyone. And, if this kind of thing continues, I'll tune out, just like I've done with other mediums when I reached the edge of what I could tolerate.</p>
<p>So, to those who say "the only way we'll have online content is through distracting advertising," I say: the only way I'll consume online media is without it.</p>
H8/500 assembler
2010-06-18T16:58:13+00:00http://esm.logic.net/2010/06/18/h8500-assembler/<p>Just a note for anyone else trying to do this: building a development environment for a Hitachi's (nee <a href="http://www.renesas.com/">Renesas</a>) H8/500 platform these days can be moderately difficult. You'll need <a href="http://sourceware.org/binutils/">binutils</a> 2.16.1, which is the last release to support H8/500 as a target. Build with <kbd>./configure --target=h8500-hms --prefix=/x/y/z</kbd> (where <var>/x/y/z</var> is the location you want to install to), and it <em>should</em> go smoothly (at least, it did so on Fedora 13 x86_64, using gcc 4.4.4; I'd seen <a href="http://uhde.com/index.php?id=28">other reports</a> that an older version was needed).</p>
<p>Sadly, GCC is proving to be a dead-end for me. No released versions of GCC that I can find ever shipped with support for H8/500 (although <a href="http://uhde.com/index.php?id=23">one report</a> suggests that a development build of 2.96/pre-3.0 ended up working, although I think he's referring to the GNUPro-96q3 release), although I've found <a href="http://cygwin.ru/ml/crossgcc/2001-07/msg00090.html">several</a> <a href="http://cygwin.ru/ml/crossgcc/2001-07/msg00112.html">suggestions</a> that Cygnus' GNUPro shipped with support for it, at least once upon a time. If anyone has chased this particular item down, I'd love to hear it.</p>
<p>(Why would anyone care about a dead embedded platform? It's the CPU used in late DSM ECUs: 98-99 Eclipses, in particular.)</p>
Switching from svn to hg
2010-03-18T16:21:52+00:00http://esm.logic.net/2010/03/18/switching-svn-hg/<p>Well, I finally did it: I converted my personal Subversion repository to Mercurial. Looking at <kbd>svn log</kbd>, I created the original repository back in late 2002, and since I was tracking svn trunk at the time, I would have been on some intermediary version of the 0.14.4 alpha. Ye ghods, that seems like a long time ago. I still remember how happy I was that svn had stabilized to the point where I was comfortable switching from CVS (at the time, I just dumped my old CVS repository history and imported everything as it sat on disk). I can't count the number of times I've had to do an <kbd>svnadmin dump</kbd>/<kbd>svnadmin load</kbd> cycle on that repository since creating it, either because of format changes, bugs, or because I did something stupid; it always felt a little like <a href="http://www.postgresql.org/">PostgreSQL</a> upgrades in that respect. ;) It's served me very well for eight years (well, longer than that, but prior use was mostly as a toy), but the lure of distributed repositories and easy merges beckoned.</p>
<p>So, it's done. Turns out that <kbd>hg convert</kbd> works pretty damn well; it appears to have retained all history without any problems, and dropping a clone of the hg repo in place of my existing checkouts was basically a non-event. <a href="http://trac.edgewall.org/">Trac</a> bolted up to the converted repository without a hitch with the Mercurial repository module, and hgwebdir means I finally have a consolidated web and native interface to the repository again (when I moved to <a href="http://www.lighttpd.net/">lighttpd</a>, I lost mod_dav_svn, and ended up resorting to <kbd>svnserve</kbd> to provide a public read-only interface). Overall, conversion was a snap.</p>
<p>If anyone is curious about the configuration details, I'm running hgwebdir under lighttpd with <a href="http://www.fastcgi.com/">FastCGI</a>. The lighttpd configuration looks like this:</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span></pre></div></td><td class="code"><div><pre><span></span>fastcgi.server += (
"/hg" => (
"hg" => (
"socket" => "/path/to/hgwebdir.sock",
"bin-path" => "/path/to/hgwebdir.fcgi",
"check-local" => "disable",
"disable-time" => 1,
"min-procs" => 1,
"max-procs" => 1,
),
),
)
$HTTP["request-method"] !~ "^(GET|HEAD)" {
auth.require = (
"/hg" => (
"method" => "digest",
"realm" => "admin",
"require" => "valid-user"
),
)
}
</pre></div></td></tr></table></div>
<p><var>hgwebdir.fcgi</var> is just a modified version (paths changed) of the script that ships with Mercurial. From the above, I'm just serving all things Mercurial up as <a href="http://dev.logic.net/hg/">/hg/</a>, and requiring authentication for anything other that GET or HEAD requests, so visitors can browse it read-only, but authenticated users can push changes. <var>hgweb.config</var> just contains:</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span></pre></div></td><td class="code"><div><pre><span></span><span class="syntax_o">[</span><span class="syntax_n">web</span><span class="syntax_o">]</span>
<span class="syntax_n">baseurl</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_o">/</span><span class="syntax_n">hg</span>
<span class="syntax_n">allow_push</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_o">*</span>
<span class="syntax_o">[</span><span class="syntax_n">collections</span><span class="syntax_o">]</span>
<span class="syntax_o">/</span><span class="syntax_k">path</span><span class="syntax_o">/</span><span class="syntax_k">to</span><span class="syntax_o">/</span><span class="syntax_n">hg</span><span class="syntax_o">/</span><span class="syntax_n">repo</span><span class="syntax_o">/</span><span class="syntax_n">parent</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_o">/</span><span class="syntax_k">path</span><span class="syntax_o">/</span><span class="syntax_k">to</span><span class="syntax_o">/</span><span class="syntax_n">hg</span><span class="syntax_o">/</span><span class="syntax_n">repo</span><span class="syntax_o">/</span><span class="syntax_n">parent</span>
</pre></div></td></tr></table></div>
<p>That's it. (But, unless you're familiar with every layer sitting on top of your repository, I'd probably suggest changing <var>allow_push</var> to something more restrictive.)</p>
WRX BCS solenoid connector part number
2010-03-07T01:16:20+00:00http://esm.logic.net/2010/03/07/wrx-bcs-solenoid-connector-part-number/<p>Continuing in my "useless information you never knew you didn't need" series of automotive documentation, I just spent an hour making my eyes bleed staring at Sumitomo's connector inventory to try and track down the plug used by the WRX boost control solenoid. I'm pretty sure at this point that it's the <em>the exact opposite</em> part as the Evo BCS connector: M(6188-0266) for the male connector (the part that's molded into the solenoid itself), and F(6189-0249) for the female plug (attached to the car's wiring harness).</p>
<p>The only difference between this plug and the Evo version is that the little notch (key) is on the left side of the bottom of the plug, rather than the right side. Annoying little gratuitous differences like this are why I hate automakers. :p</p>
Arduinos and temperature sensing
2010-02-01T03:20:00+00:00http://esm.logic.net/2010/02/01/arduinos-and-temperature-sensing/<p>I was one of the lucky ones, and got in on the <a href="http://www.sparkfun.com/">SparkFun</a> "free day"; basically, they gave away $100 off of any order (with no minimum, so you could literally just order $100 of stuff) to anyone lucky enough to be able to submit an order during the ordering period, which was pretty tricky given how badly their servers melted under the load. :-)</p>
<p>Anyway, one of the things I picked up was an <a href="http://www.arduino.cc/">Arduino</a> starter kit; an Arduino Duemilanove (the guts of the system), along with a bunch of small sensors, LEDs, and other widgets to help you build stuff with it. Learning a new toy like this always requires that I give myself a real project to tackle with it; if I don't actually "scratch an itch" with it, it ends up getting relegated to "cute toy" status pretty quickly.</p>
<p>As luck would have it, a project presents itself: my wife hates our "programmable" (and I use the term loosely) thermostat, and I'm not prepared to pay a king's ransom for what is basically a small microcontroller and about $15 in parts. So, tonight's project was diving into reading a simple 10K thermistor, and producing some kind of useful output. Turns out, it was much easier than expected. I borrowed a bit of code from both a <a href="http://www.arduino.cc/en/Tutorial/DimmingLEDs">tri-color LED example</a>, and some <a href="http://www.arduino.cc/playground/ComponentLib/Thermistor2">example thermistor code</a>, and produced the following sketch that displays green when the temperature is comfortable (by my definition, anyway), red when it's hot, blue when it's cold, and gradiants in-between leading up to the extremes.</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal"> 10</span>
<span class="normal"> 11</span>
<span class="normal"> 12</span>
<span class="normal"> 13</span>
<span class="normal"> 14</span>
<span class="normal"> 15</span>
<span class="normal"> 16</span>
<span class="normal"> 17</span>
<span class="normal"> 18</span>
<span class="normal"> 19</span>
<span class="normal"> 20</span>
<span class="normal"> 21</span>
<span class="normal"> 22</span>
<span class="normal"> 23</span>
<span class="normal"> 24</span>
<span class="normal"> 25</span>
<span class="normal"> 26</span>
<span class="normal"> 27</span>
<span class="normal"> 28</span>
<span class="normal"> 29</span>
<span class="normal"> 30</span>
<span class="normal"> 31</span>
<span class="normal"> 32</span>
<span class="normal"> 33</span>
<span class="normal"> 34</span>
<span class="normal"> 35</span>
<span class="normal"> 36</span>
<span class="normal"> 37</span>
<span class="normal"> 38</span>
<span class="normal"> 39</span>
<span class="normal"> 40</span>
<span class="normal"> 41</span>
<span class="normal"> 42</span>
<span class="normal"> 43</span>
<span class="normal"> 44</span>
<span class="normal"> 45</span>
<span class="normal"> 46</span>
<span class="normal"> 47</span>
<span class="normal"> 48</span>
<span class="normal"> 49</span>
<span class="normal"> 50</span>
<span class="normal"> 51</span>
<span class="normal"> 52</span>
<span class="normal"> 53</span>
<span class="normal"> 54</span>
<span class="normal"> 55</span>
<span class="normal"> 56</span>
<span class="normal"> 57</span>
<span class="normal"> 58</span>
<span class="normal"> 59</span>
<span class="normal"> 60</span>
<span class="normal"> 61</span>
<span class="normal"> 62</span>
<span class="normal"> 63</span>
<span class="normal"> 64</span>
<span class="normal"> 65</span>
<span class="normal"> 66</span>
<span class="normal"> 67</span>
<span class="normal"> 68</span>
<span class="normal"> 69</span>
<span class="normal"> 70</span>
<span class="normal"> 71</span>
<span class="normal"> 72</span>
<span class="normal"> 73</span>
<span class="normal"> 74</span>
<span class="normal"> 75</span>
<span class="normal"> 76</span>
<span class="normal"> 77</span>
<span class="normal"> 78</span>
<span class="normal"> 79</span>
<span class="normal"> 80</span>
<span class="normal"> 81</span>
<span class="normal"> 82</span>
<span class="normal"> 83</span>
<span class="normal"> 84</span>
<span class="normal"> 85</span>
<span class="normal"> 86</span>
<span class="normal"> 87</span>
<span class="normal"> 88</span>
<span class="normal"> 89</span>
<span class="normal"> 90</span>
<span class="normal"> 91</span>
<span class="normal"> 92</span>
<span class="normal"> 93</span>
<span class="normal"> 94</span>
<span class="normal"> 95</span>
<span class="normal"> 96</span>
<span class="normal"> 97</span>
<span class="normal"> 98</span>
<span class="normal"> 99</span>
<span class="normal">100</span>
<span class="normal">101</span>
<span class="normal">102</span>
<span class="normal">103</span>
<span class="normal">104</span>
<span class="normal">105</span>
<span class="normal">106</span>
<span class="normal">107</span></pre></div></td><td class="code"><div><pre><span></span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Fading</span><span class="syntax_w"> </span><span class="syntax_n">LED</span><span class="syntax_w"> </span><span class="syntax_n">colors</span><span class="syntax_w"> </span><span class="syntax_n">based</span><span class="syntax_w"> </span><span class="syntax_n">on</span><span class="syntax_w"> </span><span class="syntax_n">temperature</span><span class="syntax_o">.</span>
<span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Ed</span><span class="syntax_w"> </span><span class="syntax_n">Marshall</span><span class="syntax_w"> </span><span class="syntax_o"><</span><span class="syntax_n">esm</span><span class="syntax_err">@</span><span class="syntax_n">logic</span><span class="syntax_o">.</span><span class="syntax_n">net</span><span class="syntax_o">></span>
<span class="syntax_c1">#include <math.h></span>
<span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_w"> </span><span class="syntax_n">redPin</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">9</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Red</span><span class="syntax_w"> </span><span class="syntax_n">LED</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">connected</span><span class="syntax_w"> </span><span class="syntax_n">to</span><span class="syntax_w"> </span><span class="syntax_n">digital</span><span class="syntax_w"> </span><span class="syntax_n">pin</span><span class="syntax_w"> </span><span class="syntax_mi">9</span>
<span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_w"> </span><span class="syntax_n">greenPin</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">10</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Green</span><span class="syntax_w"> </span><span class="syntax_n">LED</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">connected</span><span class="syntax_w"> </span><span class="syntax_n">to</span><span class="syntax_w"> </span><span class="syntax_n">digital</span><span class="syntax_w"> </span><span class="syntax_n">pin</span><span class="syntax_w"> </span><span class="syntax_mi">10</span>
<span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_w"> </span><span class="syntax_n">bluePin</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">11</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Blue</span><span class="syntax_w"> </span><span class="syntax_n">LED</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">connected</span><span class="syntax_w"> </span><span class="syntax_n">to</span><span class="syntax_w"> </span><span class="syntax_n">digital</span><span class="syntax_w"> </span><span class="syntax_n">pin</span><span class="syntax_w"> </span><span class="syntax_mi">11</span>
<span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_w"> </span><span class="syntax_n">wait</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">50</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_mi">50</span><span class="syntax_n">ms</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_o">.</span><span class="syntax_mi">05</span><span class="syntax_w"> </span><span class="syntax_n">second</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_n">delay</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_n">shorten</span><span class="syntax_w"> </span><span class="syntax_k">for</span><span class="syntax_w"> </span><span class="syntax_n">faster</span><span class="syntax_w"> </span><span class="syntax_n">fades</span>
<span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_w"> </span><span class="syntax_n">DEBUG</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">0</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">DEBUG</span><span class="syntax_w"> </span><span class="syntax_n">counter</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_k">if</span><span class="syntax_w"> </span><span class="syntax_n">set</span><span class="syntax_w"> </span><span class="syntax_n">to</span><span class="syntax_w"> </span><span class="syntax_mi">1</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">will</span><span class="syntax_w"> </span><span class="syntax_n">write</span><span class="syntax_w"> </span><span class="syntax_n">values</span><span class="syntax_w"> </span><span class="syntax_n">back</span><span class="syntax_w"> </span><span class="syntax_n">via</span><span class="syntax_w"> </span><span class="syntax_n">serial</span>
<span class="syntax_nb syntax_nb-Type">void</span><span class="syntax_w"> </span><span class="syntax_n">printDouble</span><span class="syntax_p">(</span><span class="syntax_n">double</span><span class="syntax_w"> </span><span class="syntax_n">val</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">byte</span><span class="syntax_w"> </span><span class="syntax_n">precision</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_nb">prints</span><span class="syntax_w"> </span><span class="syntax_n">val</span><span class="syntax_w"> </span><span class="syntax_n">with</span><span class="syntax_w"> </span><span class="syntax_n">number</span><span class="syntax_w"> </span><span class="syntax_n">of</span><span class="syntax_w"> </span><span class="syntax_n">decimal</span><span class="syntax_w"> </span><span class="syntax_n">places</span><span class="syntax_w"> </span><span class="syntax_n">determine</span><span class="syntax_w"> </span><span class="syntax_n">by</span><span class="syntax_w"> </span><span class="syntax_n">precision</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">precision</span><span class="syntax_w"> </span><span class="syntax_k">is</span><span class="syntax_w"> </span><span class="syntax_n">a</span><span class="syntax_w"> </span><span class="syntax_n">number</span><span class="syntax_w"> </span><span class="syntax_n">from</span><span class="syntax_w"> </span><span class="syntax_mi">0</span><span class="syntax_w"> </span><span class="syntax_n">to</span><span class="syntax_w"> </span><span class="syntax_mi">6</span><span class="syntax_w"> </span><span class="syntax_n">indicating</span><span class="syntax_w"> </span><span class="syntax_n">the</span><span class="syntax_w"> </span><span class="syntax_n">desired</span><span class="syntax_w"> </span><span class="syntax_n">decimal</span><span class="syntax_w"> </span><span class="syntax_n">places</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">example</span><span class="syntax_p">:</span><span class="syntax_w"> </span><span class="syntax_n">printDouble</span><span class="syntax_p">(</span><span class="syntax_mf">3.1415</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_mi">2</span><span class="syntax_p">);</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_nb">prints</span><span class="syntax_w"> </span><span class="syntax_mf">3.14</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">two</span><span class="syntax_w"> </span><span class="syntax_n">decimal</span><span class="syntax_w"> </span><span class="syntax_n">places</span><span class="syntax_p">)</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_p">(</span><span class="syntax_n">val</span><span class="syntax_p">));</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_nb">prints</span><span class="syntax_w"> </span><span class="syntax_n">the</span><span class="syntax_w"> </span><span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_w"> </span><span class="syntax_n">part</span>
<span class="syntax_w"> </span><span class="syntax_k">if</span><span class="syntax_p">(</span><span class="syntax_w"> </span><span class="syntax_n">precision</span><span class="syntax_w"> </span><span class="syntax_o">></span><span class="syntax_w"> </span><span class="syntax_mi">0</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_p">(</span><span class="syntax_s2">"."</span><span class="syntax_p">);</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_nb">print</span><span class="syntax_w"> </span><span class="syntax_n">the</span><span class="syntax_w"> </span><span class="syntax_n">decimal</span><span class="syntax_w"> </span><span class="syntax_n">point</span>
<span class="syntax_w"> </span><span class="syntax_n">unsigned</span><span class="syntax_w"> </span><span class="syntax_n">long</span><span class="syntax_w"> </span><span class="syntax_n">frac</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">mult</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">1</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">byte</span><span class="syntax_w"> </span><span class="syntax_n">padding</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_n">precision</span><span class="syntax_w"> </span><span class="syntax_o">-</span><span class="syntax_mi">1</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_k">while</span><span class="syntax_p">(</span><span class="syntax_n">precision</span><span class="syntax_o">--</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_n">mult</span><span class="syntax_w"> </span><span class="syntax_o">*=</span><span class="syntax_mi">10</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_k">if</span><span class="syntax_p">(</span><span class="syntax_n">val</span><span class="syntax_w"> </span><span class="syntax_o">>=</span><span class="syntax_w"> </span><span class="syntax_mi">0</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_n">frac</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">val</span><span class="syntax_w"> </span><span class="syntax_o">-</span><span class="syntax_w"> </span><span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_p">(</span><span class="syntax_n">val</span><span class="syntax_p">))</span><span class="syntax_w"> </span><span class="syntax_o">*</span><span class="syntax_w"> </span><span class="syntax_n">mult</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_k">else</span><span class="syntax_w"> </span><span class="syntax_n">frac</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_p">(</span><span class="syntax_n">val</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_o">-</span><span class="syntax_w"> </span><span class="syntax_n">val</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_o">*</span><span class="syntax_w"> </span><span class="syntax_n">mult</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">unsigned</span><span class="syntax_w"> </span><span class="syntax_n">long</span><span class="syntax_w"> </span><span class="syntax_n">frac1</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_n">frac</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_k">while</span><span class="syntax_p">(</span><span class="syntax_n">frac1</span><span class="syntax_w"> </span><span class="syntax_o">/=</span><span class="syntax_w"> </span><span class="syntax_mi">10</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_n">padding</span><span class="syntax_o">--</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_k">while</span><span class="syntax_p">(</span><span class="syntax_n">padding</span><span class="syntax_o">--</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_p">(</span><span class="syntax_s2">"0"</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_p">(</span><span class="syntax_n">frac</span><span class="syntax_p">,</span><span class="syntax_n">DEC</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_p">}</span>
<span class="syntax_p">}</span>
<span class="syntax_n">double</span><span class="syntax_w"> </span><span class="syntax_n">Thermistor</span><span class="syntax_p">(</span><span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_w"> </span><span class="syntax_n">RawADC</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Inputs</span><span class="syntax_w"> </span><span class="syntax_n">ADC</span><span class="syntax_w"> </span><span class="syntax_n">Value</span><span class="syntax_w"> </span><span class="syntax_n">from</span><span class="syntax_w"> </span><span class="syntax_n">Thermistor</span><span class="syntax_w"> </span><span class="syntax_ow">and</span><span class="syntax_w"> </span><span class="syntax_n">outputs</span><span class="syntax_w"> </span><span class="syntax_n">Temperature</span><span class="syntax_w"> </span><span class="syntax_ow">in</span><span class="syntax_w"> </span><span class="syntax_n">Celsius</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">requires</span><span class="syntax_p">:</span><span class="syntax_w"> </span><span class="syntax_n">include</span><span class="syntax_w"> </span><span class="syntax_o"><</span><span class="syntax_n">math</span><span class="syntax_o">.</span><span class="syntax_n">h</span><span class="syntax_o">></span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Utilizes</span><span class="syntax_w"> </span><span class="syntax_n">the</span><span class="syntax_w"> </span><span class="syntax_n">Steinhart</span><span class="syntax_o">-</span><span class="syntax_n">Hart</span><span class="syntax_w"> </span><span class="syntax_n">Thermistor</span><span class="syntax_w"> </span><span class="syntax_n">Equation</span><span class="syntax_p">:</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Temperature</span><span class="syntax_w"> </span><span class="syntax_ow">in</span><span class="syntax_w"> </span><span class="syntax_n">Kelvin</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">1</span><span class="syntax_w"> </span><span class="syntax_o">/</span><span class="syntax_w"> </span><span class="syntax_p">{</span><span class="syntax_n">A</span><span class="syntax_w"> </span><span class="syntax_o">+</span><span class="syntax_w"> </span><span class="syntax_n">B</span><span class="syntax_p">[</span><span class="syntax_n">ln</span><span class="syntax_p">(</span><span class="syntax_n">R</span><span class="syntax_p">)]</span><span class="syntax_w"> </span><span class="syntax_o">+</span><span class="syntax_w"> </span><span class="syntax_n">C</span><span class="syntax_p">[</span><span class="syntax_n">ln</span><span class="syntax_p">(</span><span class="syntax_n">R</span><span class="syntax_p">)]</span><span class="syntax_o">^</span><span class="syntax_mi">3</span><span class="syntax_p">}</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">where</span><span class="syntax_w"> </span><span class="syntax_n">A</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mf">0.001129148</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">B</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mf">0.000234125</span><span class="syntax_w"> </span><span class="syntax_ow">and</span><span class="syntax_w"> </span><span class="syntax_n">C</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mf">8.76741E-08</span>
<span class="syntax_w"> </span><span class="syntax_n">long</span><span class="syntax_w"> </span><span class="syntax_n">Resistance</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_n">double</span><span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Dual</span><span class="syntax_o">-</span><span class="syntax_n">Purpose</span><span class="syntax_w"> </span><span class="syntax_n">variable</span><span class="syntax_w"> </span><span class="syntax_n">to</span><span class="syntax_w"> </span><span class="syntax_n">save</span><span class="syntax_w"> </span><span class="syntax_n">space</span><span class="syntax_o">.</span>
<span class="syntax_w"> </span><span class="syntax_n">Resistance</span><span class="syntax_o">=</span><span class="syntax_p">((</span><span class="syntax_mi">10240000</span><span class="syntax_o">/</span><span class="syntax_n">RawADC</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_o">-</span><span class="syntax_w"> </span><span class="syntax_mi">10000</span><span class="syntax_p">);</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Assuming</span><span class="syntax_w"> </span><span class="syntax_n">a</span><span class="syntax_w"> </span><span class="syntax_mi">10</span><span class="syntax_n">k</span><span class="syntax_w"> </span><span class="syntax_n">Thermistor</span><span class="syntax_o">.</span><span class="syntax_w"> </span><span class="syntax_n">Calculation</span><span class="syntax_w"> </span><span class="syntax_k">is</span><span class="syntax_w"> </span><span class="syntax_n">actually</span><span class="syntax_p">:</span><span class="syntax_w"> </span><span class="syntax_n">Resistance</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_mi">1024</span><span class="syntax_o">/</span><span class="syntax_n">ADC</span><span class="syntax_p">)</span>
<span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_nb">log</span><span class="syntax_p">(</span><span class="syntax_n">Resistance</span><span class="syntax_p">);</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Saving</span><span class="syntax_w"> </span><span class="syntax_n">the</span><span class="syntax_w"> </span><span class="syntax_n">Log</span><span class="syntax_p">(</span><span class="syntax_n">resistance</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_n">so</span><span class="syntax_w"> </span><span class="syntax_ow">not</span><span class="syntax_w"> </span><span class="syntax_n">to</span><span class="syntax_w"> </span><span class="syntax_n">calculate</span><span class="syntax_w"> </span><span class="syntax_n">it</span><span class="syntax_w"> </span><span class="syntax_mi">4</span><span class="syntax_w"> </span><span class="syntax_n">times</span><span class="syntax_w"> </span><span class="syntax_n">later</span><span class="syntax_o">.</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_s2">"Temp"</span><span class="syntax_w"> </span><span class="syntax_n">means</span><span class="syntax_w"> </span><span class="syntax_s2">"Temporary"</span><span class="syntax_w"> </span><span class="syntax_n">on</span><span class="syntax_w"> </span><span class="syntax_n">this</span><span class="syntax_w"> </span><span class="syntax_n">line</span><span class="syntax_o">.</span>
<span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">1</span><span class="syntax_w"> </span><span class="syntax_o">/</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_mf">0.001129148</span><span class="syntax_w"> </span><span class="syntax_o">+</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_mf">0.000234125</span><span class="syntax_w"> </span><span class="syntax_o">*</span><span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_o">+</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_mf">0.0000000876741</span><span class="syntax_w"> </span><span class="syntax_o">*</span><span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_w"> </span><span class="syntax_o">*</span><span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_w"> </span><span class="syntax_o">*</span><span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_p">));</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Now</span><span class="syntax_w"> </span><span class="syntax_n">it</span><span class="syntax_w"> </span><span class="syntax_n">means</span><span class="syntax_w"> </span><span class="syntax_n">both</span><span class="syntax_w"> </span><span class="syntax_s2">"Temporary"</span><span class="syntax_w"> </span><span class="syntax_ow">and</span><span class="syntax_w"> </span><span class="syntax_s2">"Temperature"</span>
<span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_w"> </span><span class="syntax_o">-</span><span class="syntax_w"> </span><span class="syntax_mf">273.15</span><span class="syntax_p">;</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Convert</span><span class="syntax_w"> </span><span class="syntax_n">Kelvin</span><span class="syntax_w"> </span><span class="syntax_n">to</span><span class="syntax_w"> </span><span class="syntax_n">Celsius</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Now</span><span class="syntax_w"> </span><span class="syntax_n">it</span><span class="syntax_w"> </span><span class="syntax_n">only</span><span class="syntax_w"> </span><span class="syntax_n">means</span><span class="syntax_w"> </span><span class="syntax_s2">"Temperature"</span>
<span class="syntax_w"> </span><span class="syntax_k">return</span><span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_p">;</span>
<span class="syntax_p">}</span>
<span class="syntax_nb syntax_nb-Type">void</span><span class="syntax_w"> </span><span class="syntax_n">setup</span><span class="syntax_p">()</span>
<span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_n">pinMode</span><span class="syntax_p">(</span><span class="syntax_n">redPin</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">OUTPUT</span><span class="syntax_p">);</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">sets</span><span class="syntax_w"> </span><span class="syntax_n">the</span><span class="syntax_w"> </span><span class="syntax_n">pins</span><span class="syntax_w"> </span><span class="syntax_k">as</span><span class="syntax_w"> </span><span class="syntax_n">output</span>
<span class="syntax_w"> </span><span class="syntax_n">pinMode</span><span class="syntax_p">(</span><span class="syntax_n">greenPin</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">OUTPUT</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">pinMode</span><span class="syntax_p">(</span><span class="syntax_n">bluePin</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">OUTPUT</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_k">if</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">DEBUG</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">{</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">If</span><span class="syntax_w"> </span><span class="syntax_n">we</span><span class="syntax_w"> </span><span class="syntax_n">want</span><span class="syntax_w"> </span><span class="syntax_n">to</span><span class="syntax_w"> </span><span class="syntax_n">see</span><span class="syntax_w"> </span><span class="syntax_n">the</span><span class="syntax_w"> </span><span class="syntax_n">pin</span><span class="syntax_w"> </span><span class="syntax_n">values</span><span class="syntax_w"> </span><span class="syntax_k">for</span><span class="syntax_w"> </span><span class="syntax_n">debugging</span><span class="syntax_o">...</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">begin</span><span class="syntax_p">(</span><span class="syntax_mi">9600</span><span class="syntax_p">);</span><span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_o">...</span><span class="syntax_n">set</span><span class="syntax_w"> </span><span class="syntax_n">up</span><span class="syntax_w"> </span><span class="syntax_n">the</span><span class="syntax_w"> </span><span class="syntax_n">serial</span><span class="syntax_w"> </span><span class="syntax_n">ouput</span><span class="syntax_w"> </span><span class="syntax_n">on</span><span class="syntax_w"> </span><span class="syntax_mi">0004</span><span class="syntax_w"> </span><span class="syntax_n">style</span>
<span class="syntax_w"> </span><span class="syntax_p">}</span>
<span class="syntax_p">}</span>
<span class="syntax_nb syntax_nb-Type">void</span><span class="syntax_w"> </span><span class="syntax_n">loop</span><span class="syntax_p">()</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_n">double</span><span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">double</span><span class="syntax_w"> </span><span class="syntax_n">TempCalc</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_nb syntax_nb-Type">int</span><span class="syntax_w"> </span><span class="syntax_n">TempScaled</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">RedLED</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">GreenLED</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">BlueLED</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">Temp</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_n">Thermistor</span><span class="syntax_p">(</span><span class="syntax_n">analogRead</span><span class="syntax_p">(</span><span class="syntax_mi">0</span><span class="syntax_p">));</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">We</span><span class="syntax_s1">'ll say that 15C - 30C is our "comfortable" range.</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_o"><</span><span class="syntax_w"> </span><span class="syntax_mi">15</span><span class="syntax_w"> </span><span class="syntax_k">is</span><span class="syntax_w"> </span><span class="syntax_n">very</span><span class="syntax_w"> </span><span class="syntax_n">cold</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">solid</span><span class="syntax_w"> </span><span class="syntax_n">blue</span><span class="syntax_p">),</span><span class="syntax_w"> </span><span class="syntax_o">></span><span class="syntax_w"> </span><span class="syntax_mi">30</span><span class="syntax_w"> </span><span class="syntax_k">is</span><span class="syntax_w"> </span><span class="syntax_n">very</span><span class="syntax_w"> </span><span class="syntax_n">hot</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">solid</span><span class="syntax_w"> </span><span class="syntax_n">red</span><span class="syntax_p">)</span><span class="syntax_o">.</span>
<span class="syntax_w"> </span><span class="syntax_n">TempCalc</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">Temp</span><span class="syntax_w"> </span><span class="syntax_o">-</span><span class="syntax_w"> </span><span class="syntax_mi">15</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_o">/</span><span class="syntax_w"> </span><span class="syntax_mi">15</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_k">if</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">TempCalc</span><span class="syntax_w"> </span><span class="syntax_o"><</span><span class="syntax_w"> </span><span class="syntax_mi">0</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_n">TempCalc</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">0</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_p">}</span><span class="syntax_w"> </span><span class="syntax_k">else</span><span class="syntax_w"> </span><span class="syntax_k">if</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">TempCalc</span><span class="syntax_w"> </span><span class="syntax_o">></span><span class="syntax_w"> </span><span class="syntax_mi">1</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_n">TempCalc</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">1</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_p">}</span>
<span class="syntax_w"> </span><span class="syntax_n">TempScaled</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">TempCalc</span><span class="syntax_w"> </span><span class="syntax_o">*</span><span class="syntax_w"> </span><span class="syntax_mi">512</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_o">-</span><span class="syntax_w"> </span><span class="syntax_mi">1</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_k">if</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">TempScaled</span><span class="syntax_w"> </span><span class="syntax_o">></span><span class="syntax_w"> </span><span class="syntax_mi">255</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_n">TempScaled</span><span class="syntax_w"> </span><span class="syntax_o">-=</span><span class="syntax_w"> </span><span class="syntax_mi">256</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">BlueLED</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">0</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">GreenLED</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">255</span><span class="syntax_w"> </span><span class="syntax_o">-</span><span class="syntax_w"> </span><span class="syntax_n">TempScaled</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">RedLED</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_n">TempScaled</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_p">}</span><span class="syntax_w"> </span><span class="syntax_k">else</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_n">BlueLED</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">255</span><span class="syntax_w"> </span><span class="syntax_o">-</span><span class="syntax_w"> </span><span class="syntax_n">TempScaled</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">GreenLED</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_n">TempScaled</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">RedLED</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">0</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_p">}</span>
<span class="syntax_w"> </span><span class="syntax_k">if</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">DEBUG</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_n">DEBUG</span><span class="syntax_w"> </span><span class="syntax_o">+=</span><span class="syntax_w"> </span><span class="syntax_mi">1</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_o">//</span><span class="syntax_w"> </span><span class="syntax_n">Only</span><span class="syntax_w"> </span><span class="syntax_n">perform</span><span class="syntax_w"> </span><span class="syntax_n">debugging</span><span class="syntax_w"> </span><span class="syntax_n">output</span><span class="syntax_w"> </span><span class="syntax_n">every</span><span class="syntax_w"> </span><span class="syntax_mi">10</span><span class="syntax_w"> </span><span class="syntax_n">loop</span><span class="syntax_w"> </span><span class="syntax_n">iterations</span><span class="syntax_o">.</span>
<span class="syntax_w"> </span><span class="syntax_k">if</span><span class="syntax_w"> </span><span class="syntax_p">(</span><span class="syntax_n">DEBUG</span><span class="syntax_w"> </span><span class="syntax_o">></span><span class="syntax_w"> </span><span class="syntax_mi">10</span><span class="syntax_p">)</span><span class="syntax_w"> </span><span class="syntax_p">{</span>
<span class="syntax_w"> </span><span class="syntax_n">DEBUG</span><span class="syntax_w"> </span><span class="syntax_o">=</span><span class="syntax_w"> </span><span class="syntax_mi">1</span><span class="syntax_p">;</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_p">(</span><span class="syntax_s2">"Temperature: "</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">printDouble</span><span class="syntax_p">(</span><span class="syntax_n">Temp</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_mi">3</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">println</span><span class="syntax_p">(</span><span class="syntax_s2">"C"</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_p">(</span><span class="syntax_s2">"Red: "</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_p">(</span><span class="syntax_n">RedLED</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_p">(</span><span class="syntax_s2">"</span><span class="syntax_se">\t</span><span class="syntax_s2">Green: "</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_p">(</span><span class="syntax_n">GreenLED</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">print</span><span class="syntax_p">(</span><span class="syntax_s2">"</span><span class="syntax_se">\t</span><span class="syntax_s2">Blue: "</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">println</span><span class="syntax_p">(</span><span class="syntax_n">BlueLED</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">Serial</span><span class="syntax_o">.</span><span class="syntax_n">println</span><span class="syntax_p">();</span>
<span class="syntax_w"> </span><span class="syntax_p">}</span>
<span class="syntax_w"> </span><span class="syntax_p">}</span>
<span class="syntax_w"> </span><span class="syntax_n">analogWrite</span><span class="syntax_p">(</span><span class="syntax_n">redPin</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">RedLED</span><span class="syntax_p">);</span>
<span class="syntax_w"> </span><span class="syntax_n">analogWrite</span><span class="syntax_p">(</span><span class="syntax_n">greenPin</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">GreenLED</span><span class="syntax_p">);</span><span class="syntax_w"> </span>
<span class="syntax_w"> </span><span class="syntax_n">analogWrite</span><span class="syntax_p">(</span><span class="syntax_n">bluePin</span><span class="syntax_p">,</span><span class="syntax_w"> </span><span class="syntax_n">BlueLED</span><span class="syntax_p">);</span><span class="syntax_w"> </span>
<span class="syntax_w"> </span><span class="syntax_n">delay</span><span class="syntax_p">(</span><span class="syntax_n">wait</span><span class="syntax_p">);</span>
<span class="syntax_p">}</span>
</pre></div></td></tr></table></div>
10.3mm ID copper crush washers
2009-12-30T20:07:00+00:00http://esm.logic.net/2009/12/30/103mm-id-copper-crush-washers/<p>I hate the internet. No really, you all suck. I ask Google where to find 10mm ID (well, 10.3mm, to be exact) copper crush washers locally, and I get back a million hits leading to forums where dozens of people are asking the exact same question, with a lot of "uh, I dunno, it was at my local [insert auto parts store here], the guy behind the counter found them for me". Why would you want them? Most Mitsubishi brake line banjo fittings require them, as do Mitsu and Subaru turbo oil feed banjo fittings.</p>
<p>The answer is NAPA, and the part number is <a href="http://www.napaonline.com/Catalog/CatalogItemDetail.aspx?R=UBP24951_0350814826">UP 24951</a>: "Washer - Sealing", in their brake parts lineup. To the next guy on the Internet searching for them, there you go. :)</p>