diff --git a/Firmdata-atmega328.hex b/Firmdata-atmega328.hex deleted file mode 100755 index a5ccbe3..0000000 --- a/Firmdata-atmega328.hex +++ /dev/null @@ -1,488 +0,0 @@ -:100000000C9434000C9451000C9451000C94510049 -:100010000C9451000C9451000C9451000C94640207 -:100020000C9451000C9436020C9451000C94510025 -:100030000C9451000C9451000C9451000C945100FC -:100040000C94D5050C9451000C94BA090C94F40945 -:100050000C9451000C9490000C9451000C9451009D -:100060000C9451000C94510011241FBECFEFD8E026 -:10007000DEBFCDBF11E0A0E0B1E0E0E2FEE102C0F2 -:1000800005900D92AE34B107D9F713E0AEE4B1E0BC -:1000900001C01D92AC35B107E1F70E9414050C9424 -:1000A0000E0F0C942F0480917C00806280937C0062 -:1000B00080917A00836080937A0080917C008064D4 -:1000C00080937C0080917A00806880937A00809190 -:1000D0007A00806480937A0080917A0086FDFCCF5C -:1000E0001092860108951F931FB7F894809186019E -:1000F000882399F080917A0086FD0FC080917A0064 -:10010000877E80937A00809185016091870140917C -:1001100079000E94A107109286011FBF1F910895C8 -:100120001F920F920FB60F9211242F933F934F936C -:100130005F936F937F938F939F93AF93BF93EF934F -:10014000FF930E947300EAE7F0E08081877F80835D -:10015000FF91EF91BF91AF919F918F917F916F919F -:100160005F914F913F912F910F900FBE0F901F9075 -:100170001895FF920F931F93182F062F893018F0B0 -:100180008DE10E94E703FFB6F89480917A0086FF24 -:1001900006C082E20E94E703FFBE80E021C00E9409 -:1001A000730080917C00807F80937C0080917C0034 -:1001B000812B80937C00009385010E945C028093D8 -:1001C000870181E08093860180917A008F7E809301 -:1001D0007A0080917A00886480937A00FFBE81E083 -:1001E0001F910F91FF900895FC01138214821282D7 -:1001F0000895FC013FB7F89494818381981729F4FE -:100200008281882389F0208110C09481838189179D -:1002100030F4908123818481290F281B06C03FBFC1 -:1002200023818481281B02C020E03FBF822F0895D4 -:100230001F93FC0110810E94F900181B812F1F9150 -:1002400008950895EF92FF920F931F93CF93DF933A -:10025000EC01E62EF42E052F1FB7F8949C818B81BC -:10026000981729F48A81882311F41FBF12C08C814A -:100270002981289F90011124275F3F4F2C0F3D1F9C -:1002800049818F2D902FB90150E00E94CD0B1FBFE7 -:1002900081E080934E01882311F4EE20E9F6DF918E -:1002A000CF911F910F91FF90EF9008951F93CF93DF -:1002B000DF93EC011FB7F8949C818B81981729F488 -:1002C0008A81882311F41FBF21C06115710579F05F -:1002D0008C812981289F90011124275F3F4F2C0F8B -:1002E0003D1F4981CB01B90150E00E94CD0B8C81AB -:1002F0008F5F8C838C8168810E94BC0A9C839C8167 -:100300008B81981709F41A821FBF81E0DF91CF918A -:100310001F910895FF920F931F93CF93DF938C014A -:10032000F62EEA01C801BE010E94560180934F01DA -:10033000882311F4FF20B1F7DF91CF911F910F9126 -:10034000FF9008951F93CF93DF93EC011FB7F894AC -:100350009B818C81981731F48A81882319F01FBF03 -:1003600080E022C08B812981289F90011124275F82 -:100370003F4F2C0F3D1F4981C90150E00E94CD0B1A -:100380008B818F5F8B838B8168810E94BC0A9B83EA -:1003900081E08A831FBF8D819E81892B21F0ED81B1 -:1003A000FE81CE01099581E0DF91CF911F910895E3 -:1003B000FF920F931F93CF93DF938C01F62EEA01E8 -:1003C000C801BE010E94A20180935001882311F44C -:1003D000FF20B1F7DF91CF911F910F91FF9008950A -:1003E000EF92FF920F931F93CF93DF93F82EE62E99 -:1003F000689F80011124075F1F4FC8010E94C80A2F -:10040000EC01009719F486E00E94E703CE0160E05A -:1004100070E0A8010E94D60BF882E982CE01DF913C -:10042000CF911F910F91FF90EF900895E1EBF0E0D5 -:100430008081887F808308951092B2000895E1EB57 -:10044000F0E08081887F80831092B2000895E1EB14 -:10045000F0E0808187608083089588E08093B30016 -:10046000E0E7F0E080818360808308951F920F921F -:100470000FB60F9211242F933F934F935F936F9377 -:100480007F938F939F93AF93BF93EF93FF930E94BC -:10049000CF050E94B607FF91EF91BF91AF919F9159 -:1004A0008F917F916F915F914F913F912F910F901D -:1004B0000FBE0F901F901895B89B03C0B8980E946C -:1004C000B6078091B20008951F920F920FB60F9257 -:1004D00011242F933F934F935F936F937F938F9349 -:1004E0009F93AF93BF93EF93FF930E94CF05E3EBEE -:1004F000F0E08081885F80830E940A0878940E94DF -:1005000073000E943508FF91EF91BF91AF919F91C9 -:100510008F917F916F915F914F913F912F910F90AC -:100520000FBE0F901F9018959093890180938801BA -:1005300008950895EF92FF920F931F93182FF62EB0 -:10054000E72E042F473018F084E10E94E70381E092 -:10055000809360011093610122E631E0C9016F2DA3 -:100560007E2D402F50E00E94CD0B0E5F8FE160E0AA -:1005700042E651E042505040202F0E943805882327 -:1005800019F485E10E94E70381E01F910F91FF902C -:10059000EF900895CF92DF92EF92FF920F931F9307 -:1005A000DF93CF9300D000D000D0CDB7DEB77C0171 -:1005B00080915201882371F4C70160E041E551E068 -:1005C0000E948A01882319F486E10E94E70381E0F2 -:1005D00080935201809151018A3009F464C08B30BC -:1005E00070F48230C9F0833020F4813009F0CAC041 -:1005F000CDC08330F9F0843009F0C4C022C08C3003 -:1006000009F457C08C3008F451C08D3009F454C03F -:100610008E3009F0B7C07EC0C70160E043E551E00D -:100620000E948A01882309F4B3C082E063E571E087 -:1006300041E004C083E060E071E046E00E949A027D -:10064000A5C01092570110925601C7010E94F900EF -:10065000863008F49DC0109254011CC0C70160E0B0 -:1006600045E551E00E948A01882319F482E10E9445 -:10067000E703809155012091560130915701280FD1 -:10068000311D3093570120935601809154018F5FA3 -:100690008093540180915401863000F384E066E534 -:1006A00071E042E0CBCF0E94C00770C00E94BB0740 -:1006B0006DC00E94AC076AC0C7010E94F900863075 -:1006C00008F466C08E010F5F1F4F87E0C82ED12C43 -:1006D000CC0EDD1EC70160E0A8010E948A018823BC -:1006E00019F48EE10E94E7030F5F1F4F0C151D05E3 -:1006F00089F75C8140E08B8190E0482B592B3E814B -:1007000020E08D8190E0282B392B89816A810E941D -:1007100090073CC0C7010E94F9008330C8F11092D5 -:1007200059011092580114C0435A5E4FC70160E04E -:100730000E948A01882319F481E20E94E7038091D4 -:100740005801909159010196909359018093580155 -:100750004091580150915901433051052CF390912B -:100760005E0180E060915D0170E0682B792B7093F1 -:100770005C0160935B0180915F0180935A010E944C -:10078000010604C083E10E94E70302C010925201F7 -:1007900026960FB6F894DEBF0FBECDBFCF91DF9186 -:1007A0001F910F91FF90EF90DF90CF90089580916F -:1007B0008801909189010E94F900882331F080918D -:1007C0008801909189010E94CA02089508950F93AB -:1007D0001F93CF93DF93082FF8940E94DB0410E05F -:1007E000C0E9D1E013C00E94CE0484EF91E0FE0185 -:1007F0003197F1F70197D9F70E94C70484EF91E090 -:10080000FE013197F1F70197D9F71F5F153058F3C3 -:1008100080E197E2FE013197F1F70197D9F710E0F7 -:1008200013C00E94CE0480ED97E0FE013197F1F7EE -:100830000197D9F70E94C70488EB9BE0FE0131972E -:10084000F1F70197D9F71F5F101758F380E197E28E -:10085000FE013197F1F70197D9F710E0C4CF1F924D -:100860000F920FB60F9211242F933F934F935F93E4 -:100870006F937F938F939F93AF93BF93EF93FF9368 -:100880000E94CF0589E00E94E703FF91EF91BF919D -:10089000AF919F918F917F916F915F914F913F9118 -:1008A0002F910F900FBE0F901F901895FC01208183 -:1008B00081E090E0062E02C0880F991F0A94E2F7AB -:1008C000809582238083808150E002C0440F551FB1 -:1008D0006A95E2F7842B80830895FC01208140E033 -:1008E00081E090E002C0880F991F6A95E2F730E03E -:1008F000822B932B892B09F041E0842F08950895D2 -:100900001F93162F859719F4E4E2F0E005C085E007 -:100910000E94E703E0E0F0E0808121E030E002C0E7 -:10092000220F331F1A95E2F78223808380811F9163 -:1009300008950F931F93162F042F859719F4E4E25F -:10094000F0E005C085E00E94E703E0E0F0E02081F0 -:1009500081E090E0012E02C0880F991F0A94E2F70F -:100960008095282320832081802F90E002C0880F6B -:10097000991F1A95E2F7282B20831F910F91089554 -:10098000482F85E290E065E00E945604089585E2D4 -:1009900090E065E040E00E945604089585E290E012 -:1009A00065E041E00E945604089585E290E065E02C -:1009B0000E946D04089585E290E065E041E00E94A8 -:1009C000990408950E94FB0583B7816083BF8895D1 -:1009D00083B78E7F83BF08950E94D7030E94A70626 -:1009E000089578940E9427020E94EC040E94E20479 -:1009F000FBCF0E94C9050E947F040E94DB040E9475 -:100A0000E6030E9421010E943A0A0E9453000E94BC -:100A100012060E9423050E9499020E942D020E9444 -:100A20009E080E947E0608950E94F9040E94F10427 -:100A300084E00E94E70380E090E0089590938B01AA -:100A400080938A0108958FEB95E060E070E00E944A -:100A5000DD0B909359038093580387EB95E060E09A -:100A600070E00E94DD0B90935B0380935A0308951E -:100A7000AF92BF92CF92DF92EF92FF920F931F93AC -:100A8000CF93DF93A62EB42EE52E122F082F000F42 -:100A9000000F000F022BC22EDD24183018F080E169 -:100AA0000E94E70300936B01FFB6F89480918A01DE -:100AB00090918B01892B19F48DE00E94E7038091BE -:100AC0008A0190918B010E94180190E0C816D90606 -:100AD0001CF0FFBE80E02EC080918A0190918B01B6 -:100AE00060E04BE651E00E94D801882319F48EE0C3 -:100AF0000E94E70310926C018B2D9E2D9C01E90151 -:100B000013C080918A0190918B0160E0AE010E9438 -:100B1000D801882319F48FE00E94E7032196809181 -:100B20006C018F5F80936C0180916C01811748F399 -:100B3000FFBE81E080936A01882319F4AA2009F09E -:100B4000ACCFDF91CF911F910F91FF90EF90DF908D -:100B5000CF90BF90AF900895809368014093690152 -:100B600080E048E651E022E00E9438050895482FD1 -:100B700082E061E00E94AC0580E090E00895482F9B -:100B800081E061E00E94AC0580E090E0089516BC31 -:100B90000895EEE6F0E0808181608083089585B558 -:100BA000856085BD0E94CE0408951F920F920FB6F6 -:100BB0000F9211242F933F934F935F936F937F93E3 -:100BC0008F939F93AF93BF93EF93FF930E94CF05B3 -:100BD0000E94B107FF91EF91BF91AF919F918F91CB -:100BE0007F916F915F914F913F912F910F900FBE29 -:100BF0000F901F90189585B5887F85BD0E94C7040A -:100C000008959FB7F894813029F470938900609318 -:100C1000880006C0823021F470938B0060938A00B4 -:100C20009FBF08950F931F93E0E8F0E080818068F4 -:100C3000808380818062808301E810E0D8018C91FC -:100C400080618C938081808380E49CE9909387000D -:100C5000809386008CED95E09093890080938800C6 -:100C600090938B0080938A0085E290E061E041E000 -:100C70000E94990485E290E062E041E00E949904BC -:100C8000F8018081826080831F910F910895FC019B -:100C90000484F585E02D808161810E94B90008956A -:100CA00000D000D087E091E0EDB7FEB7928381835A -:100CB00085E191E0948383830E94290C0F900F902B -:100CC0000F900F908FE161E04CE151E021E00E9434 -:100CD000380508950F931F930E94500689E991E00B -:100CE00060E070E041E02FE737E000E010E00E94B4 -:100CF00035090E94C5071F910F91089510928F0129 -:100D000010928C0184E167E00E94F00190938E01C3 -:100D100080938D010E946A0608951F930E941C0211 -:100D20000E941D091FB7F89410928F0180918D01C8 -:100D300090918E010E94F4001FBF8BE060E070E094 -:100D400040E00E949A020E946A061F910895CF9285 -:100D5000DF92EF92FF920F931F93CF93DF93AFC079 -:100D600080916D01833009F44DC0843028F48130C6 -:100D700099F18230B0F50AC0853009F454C085304D -:100D800008F461C0863009F097C051C00E941D0967 -:100D900089E991E060E070E041E024E737E000E0BD -:100DA00010E00E9435090E94C5071FB7F8940E9401 -:100DB0001C020E94C70580918D0190918E010E94B6 -:100DC000F40081E080938F011FBF8AE060E070E053 -:100DD00040E00E949A0273C08DE691E00E948D0669 -:100DE0006EC080918F01882309F469C08FE160E0B3 -:100DF00044E751E021E00E943805882309F05FC0F4 -:100E000087E15BC080918F01882309F458C08FE18E -:100E100060E04BE151E021E00E943805882309F0B1 -:100E20004EC08BE14AC081E080938C0148C0809124 -:100E3000710160E04FE651E022E00E94380588230E -:100E4000F1F58CE13AC086E090E00E94C80AEC011E -:100E5000009719F48FE10E94E70380916E01888367 -:100E600080916F0189838091700120917101D22E50 -:100E7000CC2490E08C299D299B838A8380917101E9 -:100E800020917201F22EEE2490E08E299F299D83FD -:100E90008C838DE060E070E040E00E949A026C81FB -:100EA0007D818A819B8141E027E436E08E010E94AA -:100EB00035090E94C50703C089E10E94E7038091BC -:100EC0008D0190918E0160E04DE651E00E948A0113 -:100ED000882309F045CFDF91CF911F910F91FF90AB -:100EE000EF90DF90CF90089580918C01882321F4BA -:100EF00080E090E00E948D0610928C0108950E947F -:100F000050060895AC0180918D0190918E0160E0B2 -:100F10000E94D801882319F48AE10E94E70308950A -:100F200080931E0160931F01409320015093210183 -:100F300020932201309323018DE191E00E948207EA -:100F4000089560932601409327018093280184E24D -:100F500091E00E94820708958BE291E00E9482074F -:100F6000089582E391E00E948207089589E391E069 -:100F70000E948207089580E491E00E94820708950C -:100F800085E791E00E9482070895282F30E0220F24 -:100F9000331FF90183E0EE0FFF1F8A95E1F7E21B93 -:100FA000F30BE057FE4F81E081830895282F30E056 -:100FB000220F331FF90143E0EE0FFF1F4A95E1F7BF -:100FC000E21BF30BE057FE4F11820895A0E9B1E058 -:100FD000282F30E0220F331FF90193E0EE0FFF1F9F -:100FE0009A95E1F7E21BF30BEA0FFB1F1182282F02 -:100FF00030E0220F331FC90163E0880F991F6A9503 -:10100000E1F7821B930BA80FB91F17961C921E9233 -:101010001697089540E06EE051E022C0469FF0012F -:101020001124E057FE4F81818823C9F08481958186 -:10103000892B31F0848195810197958384830FC03A -:101040008681978101969783868326813781808563 -:1010500091852817390718F05383178216824F5F3E -:101060004032E0F240937E0108951F939FB7F894B9 -:1010700080917C01882341F481E080937C019FBFB3 -:1010800010927D011EE051C09FBF56C0822F90E09C -:10109000880F991FFC0133E0EE0FFF1F3A95E1F72F -:1010A000E81BF90BE057FE4F83818823C9F1822F9B -:1010B00090E0880F991FFC01A3E0EE0FFF1FAA9597 -:1010C000E1F7E81BF90BE057FE4F82859385892BEA -:1010D000B9F0822F90E0880F991FFC0173E0EE0FAA -:1010E000FF1F7A95E1F7E81BF90BE057FE4F0284EA -:1010F000F385E02D219FC001112480579E4F099553 -:1011000080917D0190E0880F991FFC0153E0EE0F64 -:10111000FF1F5A95E1F7E81BF90BE057FE4F1382CA -:1011200080917D018F5F80937D0120917D01203230 -:1011300008F4ACCF10927C011F91089520E931E0B2 -:10114000C90160E070E040EC51E00E94D60B0895C8 -:101150001F93182F90E0880F991FFC01A3E0EE0F5A -:10116000FF1FAA95E1F7E81BF90BE057FE4F8485B6 -:101170009585892B91F0812F90E0880F991FFC01B4 -:1011800063E0EE0FFF1F6A95E1F7E81BF90BE057EC -:10119000FE4F848595850E94750B812F90E0880F06 -:1011A000991FFC0143E0EE0FFF1F4A95E1F7E81B92 -:1011B000F90BE057FE4F1182812F90E0880F991FA5 -:1011C000FC0123E0EE0FFF1F2A95E1F7E81BF90B66 -:1011D000E057FE4F17821682812F90E0880F991FEB -:1011E000FC01A3E0EE0FFF1FAA95E1F7E81BF90B46 -:1011F000E057FE4F1082812F90E0880F991FFC016D -:1012000073E0EE0FFF1F7A95E1F7E81BF90BE0574B -:10121000FE4F13861286812F90E0880F991FFC01E4 -:1012200053E0EE0FFF1F5A95E1F7E81BF90BE0576B -:10123000FE4F158614861F9108951092800110921A -:101240007F010BC00E94A80880917F0190918001CE -:1012500001969093800180937F0180917F0190910E -:1012600080018032910574F308957F928F929F924E -:10127000AF92BF92CF92DF92EF92FF920F931F93A4 -:10128000CF93DF936C017B01742E5901480120E05C -:1012900030E0122FC901880F991FFC0163E0EE0FA7 -:1012A000FF1F6A95E1F7E81BF90BE057FE4F8081BD -:1012B000882331F01F5F2F5F3F4F2032310549F700 -:1012C000C12FD0E0CE01880F991FFC0143E0EE0F43 -:1012D000FF1F4A95E1F7E81BF90BE057FE4F8081AD -:1012E000882319F088E10E94E703CE01880F991F37 -:1012F000DC0123E0AA0FBB1F2A95E1F7A81BB90B5D -:10130000A057BE4F13961C92139781E08C931596AD -:10131000FC92EE9214971996DC92CE921897FE01E9 -:1013200083E0EE0FFF1F8A95E1F7EC1BFD0BEE0F3C -:10133000FF1FEE56FE4F70821B96BC92AE921A971C -:101340001D969C928E921C97812FDF91CF911F91B9 -:101350000F91FF90EF90DF90CF90BF90AF909F9054 -:101360008F907F900895E1ECF0E08081806280832F -:10137000089508951F920F920FB60F9211242F9384 -:101380003F934F935F936F937F938F939F93AF930D -:10139000BF93EF93FF930E94CF050E94730080914B -:1013A000C0008091C6008093810180918801909156 -:1013B000890160E041E851E00E94D801882319F4D6 -:1013C0008BE00E94E703FF91EF91BF91AF919F9156 -:1013D0008F917F916F915F914F913F912F910F90DE -:1013E0000FBE0F901F9018951F920F920FB60F927D -:1013F00011242F933F934F935F936F937F938F931A -:101400009F93AF93BF93EF93FF930E94CF0580917B -:10141000C1008F7D8093C10078940E9473008091F9 -:1014200050039091510360E042E851E00E948A012C -:10143000882321F48091C1008F7D09C08091C00074 -:10144000809182018093C6008091C1008062809368 -:10145000C100FF91EF91BF91AF919F918F917F91CB -:101460006F915F914F913F912F910F900FBE0F9011 -:101470001F9018950F931F938FEF61E00E94F0016A -:10148000909351038093500380E461E00E94F00147 -:101490009093890180938801A0915003B0915103EA -:1014A00083EB99E016969C938E9315971092C50046 -:1014B00082E28093C400E0ECF0E08081826080836F -:1014C00086E08093C20001EC10E088E1F80180839F -:1014D000CD010E941E0580918801909189010E9492 -:1014E0009402F8018081806880831F910F91089594 -:1014F000BF92CF92DF92EF92FF920F931F93CF9301 -:10150000DF93B82E6B01E42E00915003109151032C -:10151000FFB6F894C8010E9418018E1518F4FFBE9A -:1015200080E01AC010928401E60110C0C80160E09A -:10153000AE010E94D801882319F487E00E94E703D6 -:101540002196809184018F5F809384018091840132 -:101550008E1560F3FFBE81E080938301882311F430 -:10156000BB2091F6DF91CF911F910F91FF90EF90EB -:10157000DF90CF90BF900895991B79E004C0991F28 -:10158000961708F0961B881F7A95C9F780950895DD -:10159000CF93DF93BC018230910510F462E070E0DC -:1015A000A0915403B0915503ED01E0E0F0E040E07C -:1015B00050E021C0888199818617970769F48A8154 -:1015C0009B81309719F09383828304C090935503D5 -:1015D00080935403FE0134C06817790738F441152D -:1015E000510519F08417950708F4AC01FE018A81B2 -:1015F0009B819C01E9012097E9F641155105A9F16C -:10160000CA01861B970B049708F4BA01E0E0F0E0EA -:101610002AC08D919C91119784179507F9F464174E -:10162000750781F412968D919C911397309719F05C -:101630009383828304C09093550380935403FD01E8 -:1016400032964FC0CA01861B970BFD01E80FF91FA8 -:101650006193719302978D939C9343C0FD018281A6 -:1016600093819C01D9011097A1F68091520390912A -:101670005303892B41F48091490190914A01909341 -:1016800053038093520340914B0150914C014115FB -:10169000510541F44DB75EB78091470190914801E3 -:1016A000481B590B209152033091530324173507DF -:1016B000B0F4CA01821B930B8617970780F0AB0129 -:1016C0004E5F5F4F8417950750F0420F531F5093A2 -:1016D000530340935203F9016193719302C0E0E018 -:1016E000F0E0CF01DF91CF910895CF93DF93009782 -:1016F00009F450C0EC0122971B821A82A091540376 -:10170000B0915503109709F140E050E0AC17BD07C8 -:1017100008F1BB83AA83FE0121913191E20FF31FEF -:10172000AE17BF0779F48D919C911197280F391F3F -:101730002E5F3F4F3983288312968D919C9113978A -:101740009B838A834115510571F4D0935503C0934F -:10175000540320C012968D919C911397AD01009770 -:1017600011F0DC01D3CFFA01D383C28321913191EF -:10177000E20FF31FCE17DF0769F488819981280FE4 -:10178000391F2E5F3F4FFA01318320838A819B816D -:1017900093838283DF91CF910895FB01DC0102C026 -:1017A00001900D9241505040D8F70895DC0101C0DE -:1017B0006D9341505040E0F708950F931F93CF93DE -:1017C000DF938C01EB01009731F46115710519F479 -:1017D00020E030E038C081E090E06EE070E00E94F0 -:1017E0001B0EFC019C01009771F180E88383209718 -:1017F00071F0D387C28781E88383809156039091EB -:101800005703892B21F4F0935703E09356030115F6 -:101810001105C9F0118700878381826083838091DD -:10182000580390915903892B71F4F0935903E09375 -:10183000580380915A0390915B03892B21F4F09314 -:101840005B03E0935A03C901DF91CF911F910F9180 -:101850000895A0E0B0E0EFE2FCE00C94E70EFE019A -:101860003596619171918091580390915903AF0120 -:101870000E943E0C2096E2E00C94030FABE0B0E037 -:10188000E4E4FCE00C94D70E3C012B015A01FC016E -:1018900017821682838181FD03C06FEF7FEFC6C17F -:1018A0009AE0892E1E010894211C311CF30123812A -:1018B000F20123FD859123FF81912F01882309F4F3 -:1018C000B2C1853239F423FD859123FF81912F0127 -:1018D000853229F490E0B3010E944D0EE7CF982F96 -:1018E000FF24EE249924FFE1FF15D0F09B3269F02C -:1018F0009C3228F4903259F0933291F40EC09D320C -:1019000049F0903369F441E024C052E0F52A84E0C4 -:10191000F82A28C098E0F92A25C0E0E1FE2A22C072 -:10192000F7FC29C0892F80538A3070F4F6FE05C079 -:10193000989C902C1124980E15C0E89CE02C112442 -:10194000E80EF0E2FF2A0EC09E3229F4F6FC6BC1CD -:1019500040E4F42A07C09C3619F450E8F52A02C086 -:10196000983649F4F20123FD959123FF91912F01BF -:10197000992309F0B8CF892F8554833018F080520D -:10198000833038F444E050E0A40EB51E5FE3598381 -:101990000FC0933631F0933779F0933509F056C084 -:1019A00020C0F5018081898342E050E0A40EB51E7D -:1019B000610101E010E012C0F501C080D180F6FCA9 -:1019C00003C06FEF7FEF02C0692D70E042E050E08E -:1019D000A40EB51EC6010E94420E8C015FE7F522DF -:1019E00014C0F501C080D180F6FC03C06FEF7FEF1B -:1019F00002C0692D70E042E050E0A40EB51EC601A1 -:101A00000E94370E8C0150E8F52AF3FE07C01AC079 -:101A100080E290E0B3010E944D0EEA948E2D90E09A -:101A200008171907A8F30EC0F601F7FC8591F7FE19 -:101A300081916F0190E0B3010E944D0EE110EA9494 -:101A4000015010400115110579F7EAC0943611F0E4 -:101A5000993669F5F7FE08C0F50120813181428190 -:101A6000538184E090E00AC0F501808191819C015E -:101A7000442737FD4095542F82E090E0A80EB91E10 -:101A80009FE6F92257FF09C0509540953095219562 -:101A90003F4F4F4F5F4FE0E8FE2ACA01B901A10155 -:101AA0002AE030E00E94790ED82ED21840C0953737 -:101AB00029F41F2D1F7E2AE030E01DC01F2D197F45 -:101AC0009F3661F0903720F4983509F0ACC00FC014 -:101AD000903739F0983709F0A6C004C028E030E00C -:101AE0000AC0106114FD146020E130E004C014FD50 -:101AF000166020E132E017FF08C0F50160817181B6 -:101B00008281938144E050E008C0F5018081918199 -:101B1000BC0180E090E042E050E0A40EB51EA101BF -:101B20000E94790ED82ED2188FE7F82EF122F6FEF9 -:101B30000BC05EEFF522D91438F4F4FE07C0F2FCB6 -:101B400005C08FEEF82202C01D2D01C0192DF4FE34 -:101B50000DC0FE01ED0DF11D8081803319F499EE69 -:101B6000F92208C01F5FF2FE05C003C08F2D8678E2 -:101B700009F01F5F0F2DF3FC14C0F0FE0FC01E15FF -:101B800010F09D2C0BC09D2C9E0C911A1E2D06C092 -:101B900080E290E0B3010E944D0E1F5F1E15C0F35E -:101BA00004C01E1510F4E11A01C0EE2404FF0FC09A -:101BB00080E390E0B3010E944D0E02FF1DC001FDC5 -:101BC00003C088E790E00EC088E590E00BC0802F4E -:101BD000867891F001FF02C08BE201C080E2F7FC41 -:101BE0008DE290E0B3010E944D0E06C080E390E0CC -:101BF000B3010E944D0E9A94D914C0F3DA94F10106 -:101C0000ED0DF11D808190E0B3010E944D0EDD20AD -:101C1000A9F706C080E290E0B3010E944D0EEA945D -:101C2000EE20C1F743CEF30166817781CB012B967D -:101C3000E2E10C94F30E0F931F93CF93DF93689F11 -:101C40008001699F100D789F100D1124C8010E941A -:101C5000C80AEC01009729F060E070E0A8010E943A -:101C6000D60BCE01DF91CF911F910F910895FC010A -:101C70000590615070400110D8F7809590958E0FB7 -:101C80009F1F0895FC016150704001900110D8F72A -:101C9000809590958E0F9F1F08950F931F93CF935C -:101CA000DF938C01EB018B8181FF1BC082FF0DC094 -:101CB0002E813F818C819D812817390764F4E8814A -:101CC000F9810193F983E88306C0E885F985802FBF -:101CD0000995892B31F48E819F8101969F838E8394 -:101CE00002C00FEF1FEFC801DF91CF911F910F913D -:101CF0000895FA01AA27283051F1203181F1E894A2 -:101D00006F936E7F6E5F7F4F8F4F9F4FAF4FB1E0EE -:101D10003ED0B4E03CD0670F781F891F9A1FA11DE9 -:101D2000680F791F8A1F911DA11D6A0F711D811DEA -:101D3000911DA11D20D009F468943F912AE0269FAF -:101D400011243019305D3193DEF6CF010895462F0E -:101D50004770405D4193B3E00FD0C9F7F6CF462FEF -:101D60004F70405D4A3318F0495D31FD4052419358 -:101D700002D0A9F7EACFB4E0A69597958795779515 -:101D80006795BA95C9F700976105710508959B019C -:101D9000AC010A2E06945795479537952795BA9525 -:101DA000C9F7620F731F841F951FA01D08952F92FE -:101DB0003F924F925F926F927F928F929F92AF92DB -:101DC000BF92CF92DF92EF92FF920F931F93CF9328 -:101DD000DF93CDB7DEB7CA1BDB0B0FB6F894DEBFBF -:101DE0000FBECDBF09942A88398848885F846E84E5 -:101DF0007D848C849B84AA84B984C884DF80EE802F -:101E0000FD800C811B81AA81B981CE0FD11D0FB637 -:101E1000F894DEBF0FBECDBFED010895F894FFCF5B -:101E2000616D33323870004669726D64617461208F -:101E30007625732000302E302E310003020400007E -:101E40000000000006000000000000050000000087 -:101E5000000003000000000000020000000000007D -:0E1E60000100000000000020005C03000000F4 -:00000001FF diff --git a/README.md b/README.md index 4e3b258..1f5280f 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,35 @@ The following features remain to be implemented: would be very good. * Get faster, better, stronger IO channels running such as Ethernet. + + +INSTALL + +Uploading to Arduino Uno on MacOSX + * avrdude -F -V -c arduino -p ATMEGA328P -P /dev/cu.usbmodem641 -b 115200 -U flash:w:Firmdata-atmega328p.hex + +Uploading to Arduino Duemilanove on Windows + * avrdude -pm328p -cstk500v1 -Pcom3 -b57600 -Uflash:w:Firmdata-atmega328p.hex:a + +COMPILE + +The Firmware is built using the avr-gcc/avr-libc integration for Eclipse. To compile the software outside of Eclipse follow this guide: -Uploading to Arduino Uno on MacOSX: +Install the following required GNU tools as detailed at http://www.nongnu.org/avr-libc/user-manual/install_tools.html + + * GNU Binutils + * GCC + * AVR LibC + * AVRDUDE + +There should be a Makefile but there isn't right now so once all the tools are installed do something like this: - avrdude -F -V -c arduino -p ATMEGA328P -P /dev/cu.usbmodem641 -b 115200 -U flash:w:Firmdata-atmega328p.hex +avr-gcc -DF_CPU=16000000UL -mmcu=atmega328p -Wall -g2 -gstabs -Os \ +-fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields \ +-Wl,-Map,Firmdata-atmega328p.map -o "Firmdata-atmega328p.elf" *.c + +avr-objcopy -j .text -j .data -O ihex Firmdata-atmega328p.elf Firmdata-atmega328p.hex + +Then upload the Firmdata-atmega328p.elf file to the Arduino using the INSTALL instructions above. + + diff --git a/RPM.pm b/RPM.pm index 950f665..4f3af6b 100755 --- a/RPM.pm +++ b/RPM.pm @@ -81,21 +81,23 @@ sub got_magnetometer { $self->outside_pole($when); $self->currentPole(undef); } - } else { - if ($value > 135) { - $self->currentPole('s'); - $self->inside_pole($when); - - } elsif ($value < 122) { - $self->currentPole('n'); - $self->inside_pole($when); - } + } + + #a single reading may both indicate that a pole is no longer present + #and that a new one has been detected so this should not be in an else + #block with the logic above that clears out the current pole + if ($value > 135) { + $self->currentPole('s'); + $self->inside_pole($when); + } elsif ($value < 122) { + $self->currentPole('n'); + $self->inside_pole($when); } } sub inside_pole { my ($self, $when) = @_; - + #this is where north poles could be counted } #counting a turn when a pole is left instead of when it is entered @@ -119,6 +121,8 @@ sub outside_pole { sub got_knob { my ($self, $when, $value) = @_; + + warn "Knob at $when"; } return "RPMController"; \ No newline at end of file diff --git a/lib/Device/Firmdata.pm b/lib/Device/Firmdata.pm index 83617d7..14aaf0e 100755 --- a/lib/Device/Firmdata.pm +++ b/lib/Device/Firmdata.pm @@ -44,7 +44,7 @@ sub build_io { if ($^O eq 'MSWin32') { $ioRole = 'Device::Firmdata::Role::IO::Win32Serial'; } else { - $ioRole = 'Device::Firmdata::Role::IO::DeviceSerial'; + $ioRole = 'Device::Firmdata::Role::IO::Serial'; } unless(defined($portName)) { @@ -58,6 +58,20 @@ sub build_io { return $metaclass->new_object(portName => $portName); } +sub build_session { + my ($self) = @_; + my $sessionFile = $self->config->{sessionFile}; + my $sessionClass; + + if (defined($sessionFile)) { + $sessionClass = require $sessionFile; + } else { + $sessionClass = 'Device::Firmdata::Session'; + } + + return $sessionClass->new(host => $self); +} + sub run { my ($self) = @_; @@ -178,6 +192,7 @@ sub handleSystemMessage_beacon { $self->session(Device::Firmdata::Session->new(host => $self)); + $self->session($self->build_session); $self->session->sessionOpen; } diff --git a/lib/Device/Firmdata/Role/IO.pm b/lib/Device/Firmdata/Role/IO.pm index b323c3c..91be2a6 100755 --- a/lib/Device/Firmdata/Role/IO.pm +++ b/lib/Device/Firmdata/Role/IO.pm @@ -18,7 +18,7 @@ use constant HEADER_LENGTH => 1; sub getHeader { my ($self) = @_; - my $headerByte = $self->read(1); + my $headerByte = $self->read(HEADER_LENGTH); my $headerValue = unpack('C', $headerByte); my $channel = ($headerValue & HEADER_CHANNEL_MASK) >> HEADER_CHANNEL_SHIFT; my $length = $headerValue & HEADER_SIZE_MASK; @@ -29,9 +29,11 @@ sub getHeader { sub getMessage { my ($self) = @_; my ($channel, $length) = $self->getHeader; - my $content = $self->read($length); + my $content = $self->read($length) if $length > 0; my $bytesRead = $length + HEADER_LENGTH; + $content = '' unless defined $content; + $self->bytesRead->add($bytesRead); return ($channel, $content, $bytesRead); diff --git a/lib/Device/Firmdata/Role/IO/DeviceSerial.pm b/lib/Device/Firmdata/Role/IO/DeviceSerial.pm index 7bc806e..659420e 100644 --- a/lib/Device/Firmdata/Role/IO/DeviceSerial.pm +++ b/lib/Device/Firmdata/Role/IO/DeviceSerial.pm @@ -1,94 +1,84 @@ -package Device::Firmdata::Role::IO::DeviceSerial; - -use Moose::Role; -use Device::SerialPort; -use Symbol qw(gensym); - -with 'Device::Firmdata::Role::IO'; - -has driver => ( is => 'ro', isa => 'Device::SerialPort', required => 1, builder => 'build_driver', lazy => 1 ); - -sub build_portName { - my ($self) = @_; - - opendir my $dir, "/dev" or die $!; - my @modems = grep /^cu\.usbmodem/, readdir $dir; - - die "Can't find a modem in /dev ...\n" if @modems < 1; - die "Don't know which modem to use: @modems\n" if @modems > 1; - - return "/dev/$modems[0]"; -} - - -sub build_driver { - my ($self) = @_; - - my $driver = Device::SerialPort->new($self->portName()); - $driver->debug(1); - - #$driver->datatype("raw"); - $driver->baudrate(57600) or die "Could not set baud: $^E"; - $driver->databits(8); - $driver->parity('none') or die "Could not set parity: $^E"; - $driver->stopbits(1) or die "Could not set stopbits: $^E"; - - $driver->stty_echo(0); - - # Block indefinitely. - $driver->read_const_time(0); - $driver->read_char_time(0); - - $driver->write_settings(); - - return $driver; -} - -sub read { - my ($self, $bytes) = @_; - - # Device::SerialPort is often returning short strings, and I'm not - # sure why. It was more expedient to work around that here. - - my $done_buf = ""; - - my $done = 0; - while ($done < $bytes) { - my ($bytesRead, $buf) = $self->driver->read($bytes - $done); - die "Could not read: $!" if $bytesRead < 0; - - if ($done + $bytesRead > $bytes) { - die "Device::SerialPort is a bastard ($done + $bytesRead > $bytes)"; - } - - $done_buf .= $buf; - $done += $bytesRead; - } - - if (0) { - use bytes; - my $ascii = $done_buf; - $ascii =~ s/([^ -~])/sprintf '\x{%02x}', ord($1)/eg; - warn "<<< $done ($ascii)\n"; - } - - return $done_buf; -} - -sub write { - my ($self, $content) = @_; - - use bytes; - my $length = length($content); - my $written; - - $written = $self->driver->write($content); - - if ($written != $length) { - die "tried to write $length bytes but only wrote $written: $!"; - } - - return; -} - +package Device::Firmdata::Role::IO::DeviceSerial; + +use Moose::Role; +use Device::SerialPort; +use Symbol qw(gensym); + +with 'Device::Firmdata::Role::IO'; + +has driver => ( is => 'ro', isa => 'Device::SerialPort', required => 1, builder => 'build_driver', lazy => 1 ); + +sub build_portName { + my ($self) = @_; + + opendir my $dir, "/dev" or die $!; + my @modems = grep /^cu\.usbmodem/, readdir $dir; + + die "Can't find a modem in /dev ...\n" if @modems < 1; + die "Don't know which modem to use: @modems\n" if @modems > 1; + + return "/dev/$modems[0]"; +} + + +sub build_driver { + my ($self) = @_; + + my $driver = Device::SerialPort->new($self->portName()); + $driver->debug(1); + + #$driver->datatype("raw"); + $driver->baudrate(57600) or die "Could not set baud: $^E"; + $driver->databits(8); + $driver->parity('none') or die "Could not set parity: $^E"; + $driver->stopbits(1) or die "Could not set stopbits: $^E"; + + $driver->stty_echo(0); + + $driver->read_const_time(10000); + $driver->read_char_time(0); + + $driver->write_settings(); + + return $driver; +} + +sub read { + my ($self, $bytes) = @_; + my $buf; + + while(1) { + my ($bytesRead); + + ($bytesRead, $buf) = $self->driver->read($bytes); + + next if $bytesRead == 0; + + if ($bytesRead != $bytes) { + die "Tried to read $bytes bytes but only got $bytesRead"; + } + + last; + } + + return $buf; + +} + +sub write { + my ($self, $content) = @_; + + use bytes; + my $length = length($content); + my $written; + + $written = $self->driver->write($content); + + if ($written != $length) { + die "tried to write $length bytes but only wrote $written: $!"; + } + + return; +} + 1; diff --git a/lib/Device/Firmdata/Role/IO/Serial.pm b/lib/Device/Firmdata/Role/IO/Serial.pm new file mode 100755 index 0000000..a2d9bb9 --- /dev/null +++ b/lib/Device/Firmdata/Role/IO/Serial.pm @@ -0,0 +1,63 @@ +package Device::Firmdata::Role::IO::Serial; + +use Moose::Role; + +with 'Device::Firmdata::Role::IO'; + +has fh => ( is => 'ro', isa => 'GlobRef', required => 1, lazy => 1, builder => 'build_fh' ); + +sub build_fh { + my ($self) = @_; + my $path = $self->portName; + my $fh; + + die "Could not open $path for read/write" unless open($fh, '+>', $path); + + return $fh; +} + +sub read { + my ($self, $wantBytes) = @_; + my $bytesLeft = $wantBytes; + my $readBytes = 0; + my $outputBuf; + + while($bytesLeft > 0) { + my $readBuf; + my $bytesRead = sysread($self->fh, $readBuf, $bytesLeft); + + if ($bytesRead == -1) { + die "Could not read from fh: $!"; + } + + $bytesLeft -= $bytesRead; + + $outputBuf .= $readBuf; + } + + if ($bytesLeft < 0) { + die "read too much data"; + } + + return $outputBuf; +} + +sub write { + my ($self, $content) = @_; + my $length = length($content); + my $bytesLeft = length($content); + + while($bytesLeft > 0) { + my $bytesSent = syswrite($self->fh, $content, $bytesLeft, $length - $bytesLeft); + + if ($bytesSent == -1) { + die "could not write to fh: $!"; + } + + $bytesLeft -= $bytesSent; + } + + return; +} + +1; diff --git a/work.pl b/work.pl index 3f67170..d7058c8 100755 --- a/work.pl +++ b/work.pl @@ -8,4 +8,4 @@ my $firmdata = Device::Firmdata->new(config => { @ARGV } ); -$firmdata->run; \ No newline at end of file +$firmdata->run;