{"id":490,"date":"2009-06-11T23:26:00","date_gmt":"2009-06-12T03:26:00","guid":{"rendered":"http:\/\/johncohn.org\/base\/2009\/06\/11\/thrusday-night-open-source-open-sores\/"},"modified":"2009-06-11T23:26:00","modified_gmt":"2009-06-12T03:26:00","slug":"thrusday-night-open-source-open-sores","status":"publish","type":"post","link":"http:\/\/johncohn.org\/base\/2009\/06\/11\/thrusday-night-open-source-open-sores\/","title":{"rendered":"Thrusday night &#8211; open source \/ open sores"},"content":{"rendered":"<div id=\"pBlogBody_494311326\" class=\"blogContent\">\n<div id=\"sl_svn5_1\">Got home so late last night after that long but productive trip to NY.. I paid for it today.. I am home with a virus of some sort.. I&#8217;m fevery and achy&#8230; and I have open sores on my tongue&#8230; yuck !\u00a0 .. <br \/>\u00a0\u00a0 It dodn&#8217;t slow me down though. I had a very productive day just working from home. I&#8217;m spending lots of time on the phone talking to new folks abotu soem ideas I have.. it&#8217;s fun meeting these new folks. Speaking of new folks and open sores&#8230;\u00a0 A chance meeting aI had at makerfaire has turned out to be pretty productive. I was wearign the\u00a0 LED color changing halo that I often wear at events&#8230; I ran into a guy , Xander H. at one of the booths who recognized the chips that I was using in my halo.. and asked me how I&#8217;d figured them out. . Readers of this blog may recall that I struggled mightely to figure out the inner workigns of those chips back before christmas as I was maign headbands for both boys.\u00a0\u00a0\u00a0 Anyway.. Xander had been struggling with the same horrible chineese documentation that I&#8217;d had to work through.. We exchenged busness cards.. then email.. and finally source doe.. and the result is a cool new opensource librbary Xander wrote for driving these strips. I love that this chance meeting at th Faire led to a contribution to geek culture..\u00a0\u00a0 It really is world 2.0 <\/p>\n<p>.r{}* LEDStrip &#8211; Arduino driver for HL1606-based LED strips<\/div>\n<div id=\"sl_svn5_3\">\u00a0* Thanks to: John M Cohn<\/div>\n<div id=\"sl_svn5_4\">\u00a0* Copyright (c) 2009, Synoptic Labs<\/div>\n<div id=\"sl_svn5_5\">\u00a0* All rights reserved.<\/div>\n<div id=\"sl_svn5_6\">\u00a0* <\/div>\n<div id=\"sl_svn5_7\">\u00a0* Redistribution and use in source and binary forms, with or without<\/div>\n<div id=\"sl_svn5_8\">\u00a0* modification, are permitted provided that the following conditions are met:<\/div>\n<div id=\"sl_svn5_9\">\u00a0* \u00a0 * Redistributions of source code must retain the above copyright<\/div>\n<div id=\"sl_svn5_10\">\u00a0* \u00a0 \u00a0 notice, this list of conditions and the following disclaimer.<\/div>\n<div id=\"sl_svn5_11\">\u00a0* \u00a0 * Redistributions in binary form must reproduce the above copyright<\/div>\n<div id=\"sl_svn5_12\">\u00a0* \u00a0 \u00a0 notice, this list of conditions and the following disclaimer in the<\/div>\n<div id=\"sl_svn5_13\">\u00a0* \u00a0 \u00a0 documentation and\/or other materials provided with the distribution.<\/div>\n<div id=\"sl_svn5_14\">\u00a0* \u00a0 * Neither the name of the .. nor the<\/div>\n<div id=\"sl_svn5_15\">\u00a0* \u00a0 \u00a0 names of its contributors may be used to endorse or promote products<\/div>\n<div id=\"sl_svn5_16\">\u00a0* \u00a0 \u00a0 derived from this software without specific prior written permission.<\/div>\n<div id=\"sl_svn5_17\">\u00a0*<\/div>\n<div id=\"sl_svn5_18\">\u00a0* THIS SOFTWARE IS PROVIDED BY SYNOPTIC LABS &#8221;AS IS&#8221; AND ANY<\/div>\n<div id=\"sl_svn5_19\">\u00a0* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED<\/div>\n<div id=\"sl_svn5_20\">\u00a0* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE<\/div>\n<div id=\"sl_svn5_21\">\u00a0* DISCLAIMED. IN NO EVENT SHALL SYNOPTIC LABS BE LIABLE FOR ANY<\/div>\n<div id=\"sl_svn5_22\">\u00a0* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES<\/div>\n<div id=\"sl_svn5_23\">\u00a0* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;<\/div>\n<div id=\"sl_svn5_24\">\u00a0* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND<\/div>\n<div id=\"sl_svn5_25\">\u00a0* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<\/div>\n<div id=\"sl_svn5_26\">\u00a0* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS<\/div>\n<div id=\"sl_svn5_27\">\u00a0* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<\/div>\n<div id=\"sl_svn5_28\">*\/<\/div>\n<div id=\"sl_svn5_29\"><\/div>\n<div id=\"sl_svn5_30\">&#035;include &#8220;WConstants.h&#8221;<\/div>\n<div id=\"sl_svn5_31\">&#035;include &#8220;LEDStrip.h&#8221;<\/div>\n<div id=\"sl_svn5_32\"><\/div>\n<div id=\"sl_svn5_33\">LEDStrip::LEDStrip(int dPin, int sPin, int latchPin, int clkPin) <\/div>\n<div id=\"sl_svn5_34\">{<\/div>\n<div id=\"sl_svn5_35\">\u00a0 _dPin = dPin;<\/div>\n<div id=\"sl_svn5_36\">\u00a0 _sPin = sPin;<\/div>\n<div id=\"sl_svn5_37\">\u00a0 _latchPin = latchPin;<\/div>\n<div id=\"sl_svn5_38\">\u00a0 _clkPin = clkPin;<\/div>\n<div id=\"sl_svn5_39\">\u00a0 _faderEnabled = 0;<\/div>\n<div id=\"sl_svn5_40\">\u00a0 <\/div>\n<div id=\"sl_svn5_41\">\u00a0 digitalWrite(_dPin, LOW);<\/div>\n<div id=\"sl_svn5_42\">\u00a0 pinMode(_dPin, OUTPUT);<\/div>\n<div id=\"sl_svn5_43\">\u00a0 digitalWrite(_sPin, LOW);<\/div>\n<div id=\"sl_svn5_44\">\u00a0 pinMode(_sPin, OUTPUT);<\/div>\n<div id=\"sl_svn5_45\">\u00a0 digitalWrite(_latchPin, LOW);<\/div>\n<div id=\"sl_svn5_46\">\u00a0 pinMode(_latchPin, OUTPUT);<\/div>\n<div id=\"sl_svn5_47\">\u00a0 digitalWrite(_clkPin, LOW);<\/div>\n<div id=\"sl_svn5_48\">\u00a0 pinMode(_clkPin, OUTPUT);<\/div>\n<div id=\"sl_svn5_49\">}<\/div>\n<div id=\"sl_svn5_50\"><\/div>\n<div id=\"sl_svn5_51\">void LEDStrip::faderCrank()<\/div>\n<div id=\"sl_svn5_52\">{<\/div>\n<div id=\"sl_svn5_53\">\u00a0 unsigned long mymillis;<\/div>\n<div id=\"sl_svn5_54\">\u00a0 <\/div>\n<div id=\"sl_svn5_55\">\u00a0 if (!_faderEnabled) return;<\/div>\n<div id=\"sl_svn5_56\"><\/div>\n<div id=\"sl_svn5_57\">\u00a0 mymillis = millis();<\/div>\n<div id=\"sl_svn5_58\"><\/div>\n<div id=\"sl_svn5_59\">\u00a0 \/\/ Give us 250ms slop in case we don&#8217;t exactly catch our edge.<\/div>\n<div id=\"sl_svn5_60\">\u00a0 if (mymillis &gt;= _faderPulseNextEdge &#038;&#038; mymillis &lt; _faderPulseNextEdge + 250) {<\/div>\n<div id=\"sl_svn5_61\">\u00a0 \u00a0 if (digitalRead(_sPin) == HIGH) {<\/div>\n<div id=\"sl_svn5_62\">\u00a0 \u00a0 \u00a0 digitalWrite(_sPin, LOW);<\/div>\n<div id=\"sl_svn5_63\">\u00a0 \u00a0 } else {<\/div>\n<div id=\"sl_svn5_64\">\u00a0 \u00a0 \u00a0 \/\/ only load new value of _faderPulseHalfWidth on rising edge<\/div>\n<div id=\"sl_svn5_65\">\u00a0 \u00a0 \u00a0 digitalWrite(_sPin, HIGH);<\/div>\n<div id=\"sl_svn5_66\">\u00a0 \u00a0 \u00a0 _faderPulseHalfWidth = _faderPulseNewHalfWidth;<\/div>\n<div id=\"sl_svn5_67\">\u00a0 \u00a0 }<\/div>\n<div id=\"sl_svn5_68\"><\/div>\n<div id=\"sl_svn5_69\">\u00a0 \u00a0 _faderPulseNextEdge = mymillis + _faderPulseHalfWidth;<\/div>\n<div id=\"sl_svn5_70\">\u00a0 }<\/div>\n<div id=\"sl_svn5_71\">}<\/div>\n<div id=\"sl_svn5_72\"><\/div>\n<div id=\"sl_svn5_73\">unsigned int LEDStrip::faderSpeedGet()<\/div>\n<div id=\"sl_svn5_74\">{<\/div>\n<div id=\"sl_svn5_75\">\u00a0 return _faderPulseHalfWidth;<\/div>\n<div id=\"sl_svn5_76\">}<\/div>\n<div id=\"sl_svn5_77\"><\/div>\n<div id=\"sl_svn5_78\">void LEDStrip::faderSpeedSet(unsigned int halfWidthms)<\/div>\n<div id=\"sl_svn5_79\">{<\/div>\n<div id=\"sl_svn5_80\">\u00a0 if (halfWidthms == 0) {<\/div>\n<div id=\"sl_svn5_81\">\u00a0 \u00a0 _faderEnabled = 0;<\/div>\n<div id=\"sl_svn5_82\">\u00a0 \u00a0 _faderPulseHalfWidth = 0;<\/div>\n<div id=\"sl_svn5_83\">\u00a0 \u00a0 _faderPulseNewHalfWidth = 0;<\/div>\n<div id=\"sl_svn5_84\">\u00a0 \u00a0 digitalWrite(_sPin, LOW);<\/div>\n<div id=\"sl_svn5_85\">\u00a0 \u00a0 return; \u00a0 <\/div>\n<div id=\"sl_svn5_86\">\u00a0 }<\/div>\n<div id=\"sl_svn5_87\"><\/div>\n<div id=\"sl_svn5_88\">\u00a0 _faderPulseNewHalfWidth = halfWidthms;<\/div>\n<div id=\"sl_svn5_89\">\u00a0 <\/div>\n<div id=\"sl_svn5_90\">\u00a0 \/\/ if we&#8217;re already running, don&#8217;t re-init _faderPulseNextEdge<\/div>\n<div id=\"sl_svn5_91\">\u00a0 if (_faderEnabled != 1) { \u00a0\/\/ starting from non-running state, <\/div>\n<div id=\"sl_svn5_92\">\u00a0 \u00a0 _faderEnabled = 1;<\/div>\n<div id=\"sl_svn5_93\"><\/div>\n<div id=\"sl_svn5_94\">\u00a0 \u00a0 digitalWrite(_sPin, HIGH);<\/div>\n<div id=\"sl_svn5_95\">\u00a0 \u00a0 _faderPulseHalfWidth = halfWidthms;<\/div>\n<div id=\"sl_svn5_96\">\u00a0 \u00a0 _faderPulseNextEdge = millis() + _faderPulseHalfWidth;<\/div>\n<div id=\"sl_svn5_97\">\u00a0 }<\/div>\n<div id=\"sl_svn5_98\">}<\/div>\n<div id=\"sl_svn5_99\"><\/div>\n<div id=\"sl_svn5_100\">.r{}* word consisting of 8 bits. \u00a0Command word is clocked out MSB first (i.e. D8<\/div>\n<div id=\"sl_svn5_102\">\u00a0* is first bit sent)<\/div>\n<div id=\"sl_svn5_103\">\u00a0*<\/div>\n<div id=\"sl_svn5_104\">\u00a0* Format of command word (using conventions in datasheet):<\/div>\n<div id=\"sl_svn5_105\">\u00a0* \u00a0 ________________________________________________________________________<\/div>\n<div id=\"sl_svn5_106\">\u00a0* \u00a0| \u00a0 D1 \u00a0 | \u00a0 D2 \u00a0 | \u00a0 D3 \u00a0 | \u00a0 D4 \u00a0 | \u00a0 D5 \u00a0 | \u00a0 D6 \u00a0 | \u00a0 D7 \u00a0 | \u00a0 \u00a0D8 \u00a0 |<\/div>\n<div id=\"sl_svn5_107\">\u00a0* \u00a0 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div id=\"sl_svn5_108\">\u00a0* \u00a0 ________________________________________________________________________<\/div>\n<div id=\"sl_svn5_109\">\u00a0* \u00a0| \u00a0 \u00a0 LED1 CMD \u00a0 \u00a0| \u00a0 \u00a0LED2 CMD \u00a0 \u00a0 | \u00a0 \u00a0LED3 CMD \u00a0 \u00a0 | \u00a0 2X \u00a0 | LatchOK |<\/div>\n<div id=\"sl_svn5_110\">\u00a0* \u00a0 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div id=\"sl_svn5_111\">\u00a0*<\/div>\n<div id=\"sl_svn5_112\">\u00a0* \u00a0 LED{1,2,3} CMD &#8211;<\/div>\n<div id=\"sl_svn5_113\">\u00a0* \u00a0 \u00a0 \u00a0 00 &#8211; LED off<\/div>\n<div id=\"sl_svn5_114\">\u00a0* \u00a0 \u00a0 \u00a0 01 &#8211; LED on (max bright)<\/div>\n<div id=\"sl_svn5_115\">\u00a0* \u00a0 \u00a0 \u00a0 10 &#8211; LED fade up \u00a0 (start at min bright)<\/div>\n<div id=\"sl_svn5_116\">\u00a0* \u00a0 \u00a0 \u00a0 11 &#8211; LED fade down (start at max bright)<\/div>\n<div id=\"sl_svn5_117\">\u00a0*<\/div>\n<div id=\"sl_svn5_118\">\u00a0* \u00a0 2X &#8211; Double fade speed<\/div>\n<div id=\"sl_svn5_119\">\u00a0* \u00a0 \u00a0 \u00a0 0 &#8211; 1X fade speed, each pulse on SI line steps brightness by 1\/128th.<\/div>\n<div id=\"sl_svn5_120\">\u00a0* \u00a0 \u00a0 \u00a0 1 &#8211; 2X fade speed, each pulse on SI line steps brightness by 1\/64th. \u00a0 \u00a0<\/div>\n<div id=\"sl_svn5_121\">\u00a0*<\/div>\n<div id=\"sl_svn5_122\">\u00a0* \u00a0 LatchOK &#8211; Enable latch. \u00a0Set to 0 to insert &#8216;white space&#8217; in the serial<\/div>\n<div id=\"sl_svn5_123\">\u00a0* \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 chain. \u00a0If set to 0, the entire CMD is ignored.<\/div>\n<div id=\"sl_svn5_124\">\u00a0* \u00a0 \u00a0 \u00a0 0 &#8211; Do not latch this CMD when Latch is thrown.<\/div>\n<div id=\"sl_svn5_125\">\u00a0* \u00a0 \u00a0 \u00a0 1 &#8211; Latch CMD as normal when Latch is thrown.<\/div>\n<div id=\"sl_svn5_126\">\u00a0*<\/div>\n<div id=\"sl_svn5_127\">*\/<\/div>\n<div id=\"sl_svn5_128\"><\/div>\n<div id=\"sl_svn5_129\">\/\/ Push a color value down the strip, setting the latch-enable flag.<\/div>\n<div id=\"sl_svn5_130\">void LEDStrip::rgbPush(uint8_t redcmd, uint8_t greencmd, uint8_t bluecmd)<\/div>\n<div id=\"sl_svn5_131\">{<\/div>\n<div id=\"sl_svn5_132\">\u00a0 uint8_t cmd = 0;<\/div>\n<div id=\"sl_svn5_133\">\u00a0 uint8_t flags = LATCH;<\/div>\n<div id=\"sl_svn5_134\"><\/div>\n<div id=\"sl_svn5_135\">\u00a0 if (redcmd &gt;= NONCMD || bluecmd &gt;= NONCMD || greencmd &gt;= NONCMD) return;<\/div>\n<div id=\"sl_svn5_136\"><\/div>\n<div id=\"sl_svn5_137\">\u00a0 cmd |= (greencmd &lt;&lt; 4) &#038; (_BV(5) | _BV(4));<\/div>\n<div id=\"sl_svn5_138\">\u00a0 cmd |= (redcmd &lt;&lt; 2) &#038; (_BV(3) | _BV(2));<\/div>\n<div id=\"sl_svn5_139\">\u00a0 cmd |= (bluecmd) &#038; (_BV(1) | _BV(0));<\/div>\n<div id=\"sl_svn5_140\">\u00a0 cmd |= flags &#038; (_BV(6) | _BV(7)); <\/div>\n<div id=\"sl_svn5_141\"><\/div>\n<div id=\"sl_svn5_142\">\u00a0 pushCmd(cmd);<\/div>\n<div id=\"sl_svn5_143\">}<\/div>\n<div id=\"sl_svn5_144\"><\/div>\n<div id=\"sl_svn5_145\">void LEDStrip::rgbPush2X(uint8_t redcmd, uint8_t greencmd, uint8_t bluecmd)<\/div>\n<div id=\"sl_svn5_146\">{<\/div>\n<div id=\"sl_svn5_147\">\u00a0 uint8_t cmd = 0;<\/div>\n<div id=\"sl_svn5_148\">\u00a0 uint8_t flags = LATCH | SPEED2X;<\/div>\n<div id=\"sl_svn5_149\"><\/div>\n<div id=\"sl_svn5_150\">\u00a0 if (redcmd &gt;= NONCMD || bluecmd &gt;= NONCMD || greencmd &gt;= NONCMD) return;<\/div>\n<div id=\"sl_svn5_151\"><\/div>\n<div id=\"sl_svn5_152\">\u00a0 cmd |= (greencmd &lt;&lt; 4) &#038; (_BV(5) | _BV(4));<\/div>\n<div id=\"sl_svn5_153\">\u00a0 cmd |= (redcmd &lt;&lt; 2) &#038; (_BV(3) | _BV(2));<\/div>\n<div id=\"sl_svn5_154\">\u00a0 cmd |= (bluecmd) &#038; (_BV(1) | _BV(0));<\/div>\n<div id=\"sl_svn5_155\">\u00a0 cmd |= flags &#038; (_BV(6) | _BV(7)); <\/div>\n<div id=\"sl_svn5_156\"><\/div>\n<div id=\"sl_svn5_157\">\u00a0 pushCmd(cmd);<\/div>\n<div id=\"sl_svn5_158\">}<\/div>\n<div id=\"sl_svn5_159\"><\/div>\n<div id=\"sl_svn5_160\">void LEDStrip::sPulse()<\/div>\n<div id=\"sl_svn5_161\">{<\/div>\n<div id=\"sl_svn5_162\">\u00a0 if (digitalRead(_sPin) == HIGH) {<\/div>\n<div id=\"sl_svn5_163\">\u00a0 \u00a0 \/\/delay(1);<\/div>\n<div id=\"sl_svn5_164\">\u00a0 \u00a0 digitalWrite(_sPin, LOW);<\/div>\n<div id=\"sl_svn5_165\">\u00a0 \u00a0 delayMicroseconds(1000);<\/div>\n<div id=\"sl_svn5_166\">\u00a0 \u00a0 digitalWrite(_sPin, HIGH);<\/div>\n<div id=\"sl_svn5_167\">\u00a0 \u00a0 delayMicroseconds(1000);<\/div>\n<div id=\"sl_svn5_168\">\u00a0 } else {<\/div>\n<div id=\"sl_svn5_169\">\u00a0 \u00a0 \/\/delay(1);<\/div>\n<div id=\"sl_svn5_170\">\u00a0 \u00a0 digitalWrite(_sPin, HIGH);<\/div>\n<div id=\"sl_svn5_171\">\u00a0 \u00a0 delayMicroseconds(1000);<\/div>\n<div id=\"sl_svn5_172\">\u00a0 \u00a0 digitalWrite(_sPin, LOW);<\/div>\n<div id=\"sl_svn5_173\">\u00a0 \u00a0 delayMicroseconds(1000);<\/div>\n<div id=\"sl_svn5_174\">\u00a0 }<\/div>\n<div id=\"sl_svn5_175\"><\/div>\n<div id=\"sl_svn5_176\">}<\/div>\n<div id=\"sl_svn5_177\"><\/div>\n<div id=\"sl_svn5_178\">\/\/ Push a blank value down the strip, not setting latch-enable flag. \u00a0<\/div>\n<div id=\"sl_svn5_179\">\/\/ Does not affect the status of a particular LED when latched. \u00a0It&#8217;s<\/div>\n<div id=\"sl_svn5_180\">\/\/ like using whitespace.<\/div>\n<div id=\"sl_svn5_181\">void LEDStrip::blankPush()<\/div>\n<div id=\"sl_svn5_182\">{<\/div>\n<div id=\"sl_svn5_183\">\u00a0 pushCmd(0); <\/div>\n<div id=\"sl_svn5_184\">}<\/div>\n<div id=\"sl_svn5_185\"><\/div>\n<div id=\"sl_svn5_186\">void LEDStrip::pushCmd(uint8_t cmd)<\/div>\n<div id=\"sl_svn5_187\">{<\/div>\n<div id=\"sl_svn5_188\">\u00a0 shiftOut(_dPin, _clkPin, MSBFIRST, cmd);<\/div>\n<div id=\"sl_svn5_189\">}<\/div>\n<div id=\"sl_svn5_190\"><\/div>\n<div id=\"sl_svn5_191\">void LEDStrip::latch()<\/div>\n<div id=\"sl_svn5_192\">{<\/div>\n<div id=\"sl_svn5_193\">\u00a0 digitalWrite(_latchPin, HIGH);<\/div>\n<div id=\"sl_svn5_194\">\u00a0 delayMicroseconds(1); \u00a0\/\/ spec sheet specifies minimum latch pulse of 1us<\/div>\n<div id=\"sl_svn5_195\">\u00a0 digitalWrite(_latchPin, LOW);<br \/>}<\/p>\n<\/div>\n<p>OK&#8230; I still feel yucky. Early to bed for me.. nte folks.. Nite Sam<br \/>-me<\/p>\n<p>ps. I just got an IM from my freind carl. He&#8217;s on a boat in the middle of the baltic ocean.. 1AM and still sunny there&#8230; technology is wonderful<\/p>\n<div class=\"hostedBy\" style=\"margin-top: -20px;\">\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Got home so late last night after that long but productive trip to NY.. I paid for it today.. I am home with a virus of some sort.. I&#8217;m fevery and achy&#8230; and I have open sores on my tongue&#8230; yuck !\u00a0 .. \u00a0\u00a0 It dodn&#8217;t slow me down though. I had a very productive &hellip; <a href=\"http:\/\/johncohn.org\/base\/2009\/06\/11\/thrusday-night-open-source-open-sores\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Thrusday night &#8211; open source \/ open sores<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":["post-490","post","type-post","status-publish","format-standard","hentry"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/johncohn.org\/base\/wp-json\/wp\/v2\/posts\/490","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/johncohn.org\/base\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/johncohn.org\/base\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/johncohn.org\/base\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/johncohn.org\/base\/wp-json\/wp\/v2\/comments?post=490"}],"version-history":[{"count":0,"href":"http:\/\/johncohn.org\/base\/wp-json\/wp\/v2\/posts\/490\/revisions"}],"wp:attachment":[{"href":"http:\/\/johncohn.org\/base\/wp-json\/wp\/v2\/media?parent=490"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/johncohn.org\/base\/wp-json\/wp\/v2\/categories?post=490"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/johncohn.org\/base\/wp-json\/wp\/v2\/tags?post=490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}