diff --git a/app/firmwares/aiot.hex b/app/firmwares/aiot.hex new file mode 100644 index 0000000000..959feb7273 --- /dev/null +++ b/app/firmwares/aiot.hex @@ -0,0 +1,930 @@ +:100000000C9464000C948C000C948C000C946A0981 +:100010000C946A090C946A090C948C000C94B60830 +:100020000C948C000C948C000C948C000C945B0B46 +:100030000C948C000C948C000C948C000C948C0010 +:100040000C94A10C0C948C000C9438090C9412099B +:100050000C948C000C948C000C948C000C948C00F0 +:100060000C942D0A0C948C00020000000024002740 +:10007000002A00000000080002010000030407003D +:100080000000000000000000000000250028002BF8 +:100090000004040404040404040202020202020331 +:1000A000030303030301020408102040800102043B +:1000B0000810200102040810200000000023002680 +:1000C00000290000E717991811241FBECFEFD8E0D0 +:1000D000DEBFCDBF11E0A0E0B1E0E8E6F9E302C089 +:1000E00005900D92A239B107D9F724E0A2E9B1E059 +:1000F00001C01D92AE38B207E1F710E0C3E6D0E0D0 +:1001000004C02197FE010E94741BC236D107C9F7B3 +:100110000E94300D0C94A71C0C940000CF92DF922B +:10012000EF92FF92CF93DF93B0919F03882311F05A +:10013000AB2F01C0A0E08091A00390E0880F991F31 +:1001400087549F4FC090A503D090A603E090A703CB +:10015000F090A80320E030E0FC01C591D491E88143 +:10016000EB23A90160E070E0EA130CC02F5F3F4F62 +:100170004C155D056E057F0578F33FEF2FEF8FEF90 +:100180009FEF03C0322F252FCB01632F722FDF91FA +:10019000CF91FF90EF90DF90CF900895FC0185E420 +:1001A00091E0918380838091230290912402E8174B +:1001B000F90759F4A389B4899C918589809589238D +:1001C0008C931092240210922302089530917502AC +:1001D000313208F04BC0809151028111FCCF9091D7 +:1001E000740222E02093510221E0209350022FEF6D +:1001F00020934F0210924E0230934D02E4E5F2E05C +:10020000ADE2B2E020E0321721F041914D932F5F33 +:10021000FACF10922C0220912C02990F922B9093DE +:100220002C0290912B02913061F410922B0290914C +:100230002C029093BB009091BC0093FDF8CF95ECFD +:1002400001C095EE9093BC00909151029230E1F381 +:1002500090914F029F3F79F080914F02803241F0A0 +:1002600080914F02803331F084E005C081E003C00B +:1002700082E001C083E01092530210927502109246 +:100280005202089540E061E084E493E00E94100A85 +:100290008BE39FE10197F1F70895CF93DF93CDB7FB +:1002A000DEB728970FB6F894DEBF0FBECDBF98E03B +:1002B000E9E3F1E0DE01119601900D929A95E1F7E4 +:1002C00090914C03961710F46FEF690FFE01319671 +:1002D000E60FF11DE60FF11D6081680F606840E0D8 +:1002E00084E493E028960FB6F894DEBF0FBECDBF2E +:1002F000DF91CF910C94100A0F931F93CF93DF934C +:100300008B01877098E0899FB0011124606440E000 +:1003100084E493E00E94100AE801085F1F4F69918E +:1003200084E493E00E94270AC017D107C1F7DF9148 +:10033000CF911F910F9108950F931F93CF93DF9348 +:10034000CDB7DEB729970FB6F894DEBF0FBECDBF8D +:100350000E94700C0091BA031091BB032091BC0362 +:100360003091BD03DC01CB01801B910BA20BB30BC1 +:100370008C329140A105B10558F3F8948091AF03F8 +:100380009091B0039A838983E091B403F091B5030F +:10039000DF011196808189879091AB03E091BE03C4 +:1003A000F091BF038091C003992309F42EC090817E +:1003B000982B98879081809589238F838F818C8358 +:1003C00088E08B8358856F8149853B812C818981A9 +:1003D0009A81508347FD252F3A952083262F39F0A7 +:1003E000441F00C000006083000000C0F2CF38E06E +:1003F0004D9160830000019761F7F093BF03E09394 +:10040000BE0349873B832C8338C09081982B988703 +:100410009081809589238F838F818E8388E08D835F +:1004200058856F8149853D812E8189819A815083CC +:1004300047FD252F00C000C0208300C000C000C0C1 +:1004400000C000C060830000262F3A9541F0441F91 +:10045000000000C000C000C000C000C0E8CF38E00D +:100460004D9100C0608300C0019709F7F093BF036E +:10047000E093BE0349873D832E839A8389837894D2 +:100480000E94700C6093BA037093BB038093BC030B +:100490009093BD0329960FB6F894DEBF0FBECDBF73 +:1004A000DF91CF911F910F910895E091AD03F091ED +:1004B000AE038E179F07F0F53091B303332361F03D +:1004C000639FB0011124672F349FA0011124452F91 +:1004D000329F90011124232F3091B9035091B6031C +:1004E000E091B403F091B503351308C0DC01AA0F05 +:1004F000BB1F8A0F9B1F8E0F9F1F0AC0880F991F5B +:10050000880F991F8E0F9F1FFC01E30FF11D1082B2 +:100510003091B603FC01E30FF11D60833091B70306 +:10052000FC01E30FF11D40833091B803FC01E30FA0 +:10053000F11D20830895E0E5F3E020E030E08191B3 +:100540009191280F391F83E0EC38F807C1F740E09C +:1005500050E050918C0380918E0390918F03840F13 +:10056000951F2817390779F4809150039091510312 +:100570008234910541F481E020915203309153037C +:100580002D34310509F080E00895833081F028F49E +:10059000813099F08230A1F008958730A9F0883039 +:1005A000B9F08430D1F4809180008F7D03C08091B8 +:1005B00080008F7780938000089584B58F7702C084 +:1005C00084B58F7D84BD08958091B0008F7703C07E +:1005D0008091B0008F7D8093B00008951F93CF93DA +:1005E000DF93282F30E0F901ED58FF4F8491F90196 +:1005F000EB55FF4FD491F901EF56FF4FC491CC2337 +:10060000C1F0162F81110E94C502EC2FF0E0EE0F11 +:10061000FF1FE957FF4FA591B4919FB7F8941111AF +:1006200004C08C91D095D82302C0EC91DE2BDC93D2 +:100630009FBFDF91CF911F91089510922A021092CF +:10064000290210925302109275021092510281E019 +:100650008093500210922B0261E082E10E94EE0230 +:1006600061E083E10E94EE02E9EBF0E080818E7FA1 +:10067000808380818D7F808388E48093B80085E4C7 +:100680008093BC008CEF97E0909328028093270220 +:100690008DEF97E090932602809325020895CF93E3 +:1006A000DF9390E0FC01EB55FF4F2491FC01EF56E6 +:1006B000FF4F8491882361F190E0880F991FFC011E +:1006C000E759FF4FC591D491FC01E957FF4FA59120 +:1006D000B491611109C09FB7F89488812095822355 +:1006E0008883EC912E230BC0623061F49FB7F8949D +:1006F0008881322F309583238883EC912E2B2C9385 +:100700009FBF06C08FB7F894E8812E2B28838FBF38 +:10071000DF91CF9108958F929F92AF92BF92CF9227 +:10072000DF92EF92FF926B017C010E94700C4B01F3 +:100730005C01C114D104E104F104F1F00E94700CD9 +:10074000DC01CB0188199909AA09BB09883E9340AD +:10075000A105B10570F321E0C21AD108E108F10842 +:1007600088EE880E83E0981EA11CB11CC114D10430 +:10077000E104F10419F7DDCFFF90EF90DF90CF9007 +:10078000BF90AF909F908F900895CF92DF92EF929D +:10079000FF920F931F93CF93DF93CDB7DEB7C05473 +:1007A000D1400FB6F894DEBF0FBECDBF0E94950CAE +:1007B0000091A1031091A2032091A3033091A403FF +:1007C0006B017C01C01AD10AE20AF30A40EDC4169B +:1007D00047E0D406E104F10418F48091A903CAC0EB +:1007E0006093A1037093A2038093A3039093A40347 +:1007F00010929C0310929B0310929A0310929903FB +:100800001092980362E080919D030E944F0361E083 +:1008100070E080E090E00E948B0361E080919D0396 +:100820000E944F0360E080919D030E94EE02809140 +:100830009E038551823028F48BE291E10197F1F714 +:1008400006C064E170E080E090E00E948B0362E00B +:1008500080919D030E944F038091AA0390E0823013 +:10086000910538F0880F991F880F991F05970197F8 +:10087000F1F7F89480E00E948E006F3F7F4F8F4F1A +:100880009F4F21F41092A903789441C081E00E9407 +:100890008E006F3F7F4F8F4F9F4FA1F38E010F5FF1 +:1008A0001F4F6E012FEBC21A2EEFD20A780180E0A3 +:1008B0000E948E00F701608371838283938381E0BD +:1008C0000E948E00F7016483758386839783F8E026 +:1008D000EF0EF11CEC14FD0451F7789420E030E0A9 +:1008E000F801C080D180E280F38044815581668127 +:1008F0007781FFEFCF16DF06EF06FF0631F04F3F9F +:100900008FEF58076807780721F41092A90380E059 +:1009100031C0F90183E0F595E7958A95E1F7E8564E +:10092000FC4F8081880FC416D506E606F70608F44A +:10093000816080832F5F3F4F085F1F4F2832310552 +:1009400079F620919C0330E04091980380919903BF +:1009500090E0840F911D40919A03840F911D409166 +:100960009B03840F911D99272817390771F681E0A1 +:100970008093A903C05CDE4F0FB6F894DEBF0FBEB4 +:10098000CDBFDF91CF911F910F91FF90EF90DF903E +:10099000CF900895CF92DF92EF92FF920F931F9323 +:1009A000CF93DF93CDB7DEB76F970FB6F894DEBF66 +:1009B0000FBECDBF0091920310919303E09090037E +:1009C000F0909103DE2C1C821B8288EE93E0A0E065 +:1009D000B0E08D839E83AF83B88785E491E09A83EE +:1009E0008983188E1F8A1A8E198E1C8E1B8E1E8E5E +:1009F0001D8E6F8D6E7F6D7F6F8F6695617081E04C +:100A00006827802F0E94EE0261E0802F0E944F0332 +:100A10001127F801EB55FF4FE491E98BF801EF56F0 +:100A2000FF4FE491F0E0EE0FFF1FE957FF4F859174 +:100A300094919B8B8A8B60E08E2D0E944F038F8D4B +:100A400081FD04C061E08E2D0E94EE02ED869701CB +:100A50003327F901EB55FF4FE491EE87F901EF568B +:100A6000FF4FE491F0E0EE0FFF1FE754FF4F859139 +:100A70009491988B8F871C8E1B8E1A8E198E188ED0 +:100A80001F8A8DE991E09E8F8D8F85E18D1508F489 +:100A90004FC08DEB90E0988F8F8B8BE991E09A8F10 +:100AA000898F8CE291E09C8F8B8F50916800E7E0FA +:100AB000ED1560F441E0FDE0FD1508F040E091E047 +:100AC000892F01C0880F4A95EAF701C084E0852B81 +:100AD0008093680087E08D1530F4EDE0ED1530F47B +:100AE0008CE690E005C08DE690E002C08BE690E0D9 +:100AF0009D8B8C8BF7E0FD1530F081E001C0880FF5 +:100B00002A95EAF710C08DE079018D1520F0E8E014 +:100B1000EE1AF10803C0FEE0EF1AF10881E001C00F +:100B2000880FEA94EAF78E8B8DE991E00197F1F74F +:100B30008B8D9C8D892B21F1E0912302F091240271 +:100B40009E012F5F3F4F2E173F07D1F0309739F0AE +:100B5000A389B4899C918589809589238C938F8DF5 +:100B60008E7F8F8F109222021092210230932402E6 +:100B700020932302EC89FD8990818E89892B8083C3 +:100B80000E94950C60939403709395038093960351 +:100B90009093970300E513E07801F7011192119209 +:100BA0007F0161E070E080E090E00E948B03F0E95B +:100BB000EF16F3E0FF0689F70E94950CC0909403AE +:100BC000D0909503E0909603F0909703DC01CB0161 +:100BD0008C199D09AE09BF0988389341A105B1055B +:100BE000C0F4CE0101960E949107892B29F3CE0112 +:100BF00001960E94A907F801819391938F0161E00A +:100C000070E080E090E00E948B03F3E000391F0762 +:100C100071F7CE0101960E94CE006F960FB6F89440 +:100C2000DEBF0FBECDBFDF91CF911F910F91FF901F +:100C3000EF90DF90CF900895CF92DF92EF92FF92E6 +:100C40000F931F93CF93DF936C017A018B01C0E068 +:100C5000D0E0CE15DF0581F0D8016D918D01D60170 +:100C6000ED91FC910190F081E02DC6010995892B51 +:100C700011F02196EECF7E01C701DF91CF911F9138 +:100C80000F91FF90EF90DF90CF900895FC01538D6E +:100C9000448D252F30E0842F90E0821B930B541756 +:100CA00010F0CF96089501970895FC01918D828DE3 +:100CB000981761F0828DDF01A80FB11D5D968C91B0 +:100CC000928D9F5F9F73928F90E008958FEF9FEFBB +:100CD0000895FC01918D828D981731F0828DE80F77 +:100CE000F11D858D90E008958FEF9FEF0895FC0131 +:100CF000918D228D892F90E0805C9F4F821B9109FE +:100D00008F739927089586E792E00E94770621E085 +:100D1000892B09F420E0822F0895FC01848DDF01E6 +:100D2000A80FB11DA35ABF4F2C91848D90E001965E +:100D30008F739927848FA689B7892C93A089B1894D +:100D40008C91837080648C93938D848D981306C0EE +:100D50000288F389E02D80818F7D80830895EF9252 +:100D6000FF920F931F93CF93DF93EC0181E0888F65 +:100D70009B8D8C8D981305C0E889F989808185FD4C +:100D800026C0F62E0B8D10E00F5F1F4F0F7311273B +:100D9000E02E8C8DE8120CC00FB607FCFACFE88964 +:100DA000F989808185FFF5CFCE010E948D06F1CFB4 +:100DB0008B8DFE01E80FF11DE35AFF4FF0829FB7C4 +:100DC000F8940B8FEA89FB89808180620AC09FB703 +:100DD000F894EE89FF896083E889F98980818370BE +:100DE000806480839FBF81E090E0DF91CF911F916D +:100DF0000F91FF90EF900895CF93DF93EC01888DD2 +:100E00008823C9F0EA89FB89808185FD05C0A8890E +:100E1000B9898C9186FD0FC00FB607FCF5CF808194 +:100E200085FFF2CFA889B9898C9185FFEDCFCE01DE +:100E30000E948D06E7CFDF91CF91089580E090E08A +:100E4000892B29F00E94830681110C9400000895DB +:100E500020912302309124022817390771F49091D0 +:100E6000210280912202981741F0E0912102F0E0E6 +:100E7000EF5BFB4F808190E008958FEF9FEF089527 +:100E800008951F93CF93DF93DC015C968D919C9125 +:100E90005D97009739F421E030E013963C932E9350 +:100EA00012973BC05196ED91FC91529750962C9120 +:100EB0005097322F30951FB75E964C915E97742FE6 +:100EC000727041FD6095F8944081772311F0422BB8 +:100ED00001C043234083EC012197F1F748E05081A2 +:100EE00060FF02C0522B01C053235083EC012197B5 +:100EF000F1F76695415099F78081772319F08323A4 +:100F0000808302C0282B20831FBF5C968D919C910B +:100F10005D970197F1F781E090E0DF91CF911F910C +:100F2000089520912302309124022817390771F483 +:100F3000809122022091210290E0805C9F4F821BD1 +:100F4000910960E470E00E94451B089580E090E004 +:100F50000895209123023091240228173907B9F40B +:100F60009091210280912202981789F0E09121024C +:100F7000F0E0EF5BFB4F80812091210230E02F5F9A +:100F80003F4F2F7333272093210290E008958FEF76 +:100F90009FEF089585ED8093BC008091BC0084FD97 +:100FA000FCCF10925102089540911E04262F30E08C +:100FB000240F311D21323105DCF4209151022430FF +:100FC000C9F4FC0180E090E0861758F430911E04CB +:100FD0002191DC01A250BC4FA30FB11D2C930196AF +:100FE000F3CF80911E04680F60931E0480E0089583 +:100FF00081E0089582E0089508950895E0912A021D +:1010000080912902E81730F4F0E0E252FC4F808131 +:1010100090E008958FEF9FEF089590912A028091BC +:101020002902981750F4E92FF0E0E252FC4F20819A +:1010300030E09F5F90932A0202C02FEF3FEFC9017B +:1010400008958091290290E020912A02821B910943 +:101050000895CF92DF92EF92FF920F931F93CF9359 +:10106000DF937C01CB018A0120915202222389F077 +:10107000EB016B01C40ED51ECC15DD0569F069913D +:10108000D701ED91FC910190F081E02DC701099508 +:10109000F3CF642F0E94D407C801DF91CF911F9135 +:1010A0000F91FF90EF90DF90CF900895CF93DF9353 +:1010B0001F92CDB7DEB76983209152022223D1F06F +:1010C00020917502203240F021E030E0FC013383B2 +:1010D000228380E090E015C080915302E82FF0E079 +:1010E000EC5AFD4F998190838F5F809353028093D8 +:1010F000750205C061E0CE0101960E94D40781E02F +:1011000090E00F90DF91CF910895089580E090E0F6 +:1011100008950E949B1C90910001891324C0E8E669 +:10112000F0E0E4919FEF90930001E130B9F098F086 +:10113000E230C9F4909170009D7F9093700091E02F +:101140009093B0009091B100987F94609093B1001B +:101150001092B30008C010926E0005C090916F000D +:101160009D7F90936F0060E00C94EE021F920F92AF +:101170000FB60F9211242F933F934F935F936F936A +:101180007F938F939F93AF93BF93EF93FF93809140 +:10119000950190919601A0919701B0919801892BAA +:1011A0008A2B8B2B51F190919201E0919301F09158 +:1011B0009401808189278083809195019091960187 +:1011C000A0919701B0919801181619061A061B06EE +:1011D000C4F48091950190919601A0919701B091EE +:1011E00098010197A109B109809395019093960107 +:1011F000A0939701B093980104C0809100010E94D0 +:101200008B08FF91EF91BF91AF919F918F917F914B +:101210006F915F914F913F912F910F900FBE0F9063 +:101220001F9018951F920F920FB60F9211242F93B3 +:101230003F934F935F936F937F938F939F93AF935E +:10124000BF93EF93FF9386E792E00E948D06FF9194 +:10125000EF91BF91AF919F918F917F916F915F912E +:101260004F913F912F910F900FBE0F901F901895A7 +:101270001F920F920FB60F9211242F938F939F936B +:10128000EF93FF93E0918602F09187028081E091D5 +:101290008C02F0918D0282FD12C0908180918F02AC +:1012A0008F5F8F7320919002821751F0E0918F022F +:1012B000F0E0EA58FD4F958F80938F0201C0808146 +:1012C000FF91EF919F918F912F910F900FBE0F90F3 +:1012D0001F9018951F920F920FB60F9211242F9303 +:1012E0003F934F935F936F937F938F939F93AF93AE +:1012F000BF93EF93FF93E0912302F0912402309784 +:1013000009F451C0968DA685B785858591FF04C0E7 +:101310009C91892329F447C09C91892309F043C0FB +:10132000A389B4899C918589809589238C9386892A +:1013300097890197F1F7608D718DA685B7855585E1 +:1013400038E020E0CB010197F1F7822F90E09595EE +:101350008795282F4C91452309F02068315091F74B +:10136000868D81FD20958091220290E001968F73F9 +:10137000992730912102381749F0A0912202B0E05C +:10138000AF5BBB4F2C938093220203C0868D81609C +:10139000868F828D938D0197F1F7A389B4899C91F3 +:1013A0008589892B8C93FF91EF91BF91AF919F918C +:1013B0008F917F916F915F914F913F912F910F90FE +:1013C0000FBE0F901F901895FC01248131E03093DF +:1013D0005202209374021092530210927502838578 +:1013E000682B83E193E00E9456080C94E6000F936B +:1013F0001F93CF938C01C62F0E94E4096C2F646069 +:10140000C8010E94E4096C2F6B7FC8010E94E409A7 +:1014100083EC90E00197F1F7CF911F910F91089520 +:101420000F931F93CF93DF938C01C62FD42F607F30 +:10143000642B0E94F70980E1C89FB00111246D2B35 +:10144000C801DF91CF911F910F910C94F70941E0F2 +:101450000E94100A81E090E008951F920F920FB64B +:101460000F9211242F933F934F935F936F937F932A +:101470008F939F93AF93BF93EF93FF938091B900A6 +:10148000887F803609F49CC068F5883209F45BC017 +:1014900090F4803109F454C038F4882309F4F6C07C +:1014A000883009F44DC0F6C0883109F44CC0803250 +:1014B00009F45DC0EFC0803409F468C048F480339B +:1014C00009F455C0883309F0E5C080934F02D8C0B5 +:1014D000803509F44FC0883509F45DC0883409F0BF +:1014E000D9C0D6C0883909F4C7C0A8F4883709F430 +:1014F00067C038F4883609F463C0803709F460C0E7 +:10150000C9C0883809F4B8C0803909F45FC0803890 +:1015100009F0C0C05BC0803B09F486C038F4803A53 +:1015200009F466C0883A09F47FC0B4C0803C09F46D +:10153000A7C0883C09F4A4C0883B09F48AC0AAC0AB +:1015400080912C0210C090914E0280914D0298170C +:1015500070F5E0914E0281E08E0F80934E02F0E034 +:10156000E35DFD4F80818093BB0085EC86C0809356 +:101570004F028EC0E0914E0281E08E0F80934E02AA +:101580008091BB00F0E0E35DFD4F808390914E02BF +:1015900080914D026EC0E0914E0281E08E0F8093EB +:1015A0004E028091BB00F0E0E35DFD4F80838091AF +:1015B000500281116DC081E080932B0284EA61C0EA +:1015C00083E08093510210924004CFCF8091400479 +:1015D000803208F051C0E091400481E08E0F80938A +:1015E00040048091BB00F0E0E05EFB4F8083BDCF04 +:1015F00085EC8093BC0010925102809140048032AF +:1016000030F4E0914004F0E0E05EFB4F1082609126 +:10161000400470E0E0912502F091260280E294E01F +:1016200009951092400436C084E0809351021092D4 +:101630001F0410921E04E0912702F09128020995E0 +:1016400080911E04811105C081E080931E041092D8 +:10165000FE03E0911F0481E08E0F80931F04F0E0F1 +:10166000E250FC4F80818093BB0090911F048091D9 +:101670001E04981708F479CF85E88093BC000AC04F +:1016800085EC8093BC001092510204C010924F026E +:101690000E94CA07FF91EF91BF91AF919F918F91E7 +:1016A0007F916F915F914F913F912F910F900FBE5E +:1016B0000F901F9018951F920F920FB60F92112442 +:1016C0002F933F934F935F936F937F938F939F934A +:1016D000AF93BF93EF93FF938091DD0387FF05C026 +:1016E00010928500109284001BC02091DD03022E11 +:1016F000000C330B8091430390E02817390784F4E2 +:101700008091DD03082E000C990BFC01EE0FFF1FEA +:101710008E0F9F1FFC01E15EFC4F808186FD15C08E +:101720008091DD038F5F8093DD032091DD03022E26 +:10173000000C330B8091430390E028173907C4F461 +:101740008091DD038C3064F113C08091DD03082E9D +:10175000000C990BFC01EE0FFF1F8E0F9F1FFC0169 +:10176000E15EFC4F808160E08F730E94EE02D8CF73 +:101770008091840090918500049680349C4918F4EF +:1017800080E49CE905C080918400909185000496D6 +:1017900090938900809388008FEF8093DD033BC096 +:1017A00020918400309185008091DD03082E000C8B +:1017B000990BFC01EE0FFF1F8E0F9F1FFC01E15ED6 +:1017C000FC4F81819281820F931F909389008093B7 +:1017D00088008091DD03082E000C990BFC01EE0FB0 +:1017E000FF1F8E0F9F1FFC01E15EFC4F808186FF73 +:1017F00012C08091DD03082E000C990BFC01EE0F46 +:10180000FF1F8E0F9F1FFC01E15EFC4F808161E096 +:101810008F730E94EE02FF91EF91BF91AF919F9164 +:101820008F917F916F915F914F913F912F910F9089 +:101830000FBE0F901F901895FC01EE0FFF1FE7568B +:10184000FE4F20813181232B39F421E030E03183B8 +:10185000208361E00C944F030895682F86E792E09F +:101860000C94AF06EF92FF920F931F93CF93DF93E9 +:10187000162FE72EF82E092F82E00E942D0CC9EDBD +:10188000D3E0812F9E2DAF2DB02F88839983AA831B +:10189000BB830E942D0C89810E942D0C8A810E949D +:1018A0002D0C8B81DF91CF911F910F91FF90EF90C5 +:1018B0000C942D0C42E050E06FE871E086E792E076 +:1018C0000C941C068FEF0E942D0C85E50E942D0CB8 +:1018D0000C945A0C8FEF0E942D0C85E50C942D0C66 +:1018E0003FB7F8948091860490918704A091880472 +:1018F000B091890426B5A89B05C02F3F19F0019629 +:10190000A11DB11D3FBFBA2FA92F982F8827820F85 +:10191000911DA11DB11DBC01CD0142E0660F771FD5 +:10192000881F991F4A95D1F708952FB7F8946091B1 +:1019300082047091830480918404909185042FBF68 +:1019400008951F920F920FB60F9211242F933F9379 +:101950008F939F93AF93BF93809182049091830460 +:10196000A0918404B09185043091810423E0230F79 +:101970002D3720F40196A11DB11D05C026E8230FC7 +:101980000296A11DB11D209381048093820490933F +:101990008304A0938404B09385048091860490917D +:1019A0008704A0918804B09189040196A11DB11DFE +:1019B0008093860490938704A0938804B09389044D +:1019C000BF91AF919F918F913F912F910F900FBE3B +:1019D0000F901F901895CF92DF92EF92FF920F9386 +:1019E0001F93E82FF92F05C0015011092109310972 +:1019F00061F1908196239417B9F305C00150110944 +:101A00002109310911F1908196239413F7CFC12C4C +:101A1000D12CE12CF12C0AC08FEFC81AD80AE80AA1 +:101A2000F80A0C151D052E053F0579F080818623E7 +:101A3000841791F36C2D7D2D8E2D9F2D1F910F916D +:101A4000FF90EF90DF90CF90089560E070E080E02D +:101A500090E01F910F91FF90EF90DF90CF9008954D +:101A6000CF93DF93CDB7DEB768970FB6F894DEBF9C +:101A70000FBECDBF789484B5826084BD84B581608B +:101A800084BD85B5826085BD85B5816085BD809149 +:101A90006E00816080936E001092810080918100C1 +:101AA00082608093810080918100816080938100B9 +:101AB000809180008160809380008091B10084607B +:101AC0008093B1008091B00081608093B0008091DC +:101AD0007A00846080937A0080917A00826080939B +:101AE0007A0080917A00816080937A0080917A00F8 +:101AF000806880937A001092C100E0918602F09194 +:101B0000870282E08083E0918202F091830210825A +:101B1000E0918402F091850280E1808310928E0230 +:101B2000E0918A02F0918B0286E08083E091880246 +:101B3000F0918902808180618083E0918802F09138 +:101B40008902808188608083E0918802F091890217 +:101B5000808180688083E0918802F0918902808191 +:101B60008F7D808310E061E0812F0E944F0360E051 +:101B7000812F0E94EE021F5F1E30A9F768EC70E013 +:101B800080E090E00E948B0386E792E00E94770657 +:101B9000892B09F4A4C686E792E00E9477061816FE +:101BA000190694F786E792E00E94550690910A0282 +:101BB000853561F491110AC0809109028F3FE1F4EB +:101BC00081E08093080280930A0216C08093090284 +:101BD000992391F0E0910802E23019F48093070212 +:101BE00007C0E33028F090910702915090930702CC +:101BF000F0E0ED52FE4F8083809108028F5F8433C6 +:101C000018F48093080204C01092080210920A028D +:101C100080910A02882309F4B7CF809107028111CD +:101C2000B3CF80910802843008F4AECF10920A023C +:101C30001091D7018091D8010091D901E02EF12CAB +:101C4000123009F4FFC0133009F444C6113009F012 +:101C500043C6873009F04FC080912002D090DA014E +:101C6000811109C010932002F0922401E092230117 +:101C70008D2D90E023C08D2D90E040912301509157 +:101C800024012091210130912201E416F50621F46E +:101C90008217930709F420C6440F551FFA01E7562F +:101CA000FE4F11821082220F331FF901E756FE4FBB +:101CB00011821082F0922401E0922301909322017C +:101CC00080932101F701EE0FFF1FE756FE4F21E041 +:101CD00030E031832083880F991FFC01E756FE4FC7 +:101CE0003183208361E0802F0E944F0360E08D2DBF +:101CF0000E944F0318C090E08631910519F41093AB +:101D00001F0205C087319105A9F410931E02E091CE +:101D10002501F0912601EE0FFF1FE756FE4F81E0EF +:101D200090E09183808362E370E080E090E00E9425 +:101D30008B03D2C5809771F4F0921C02E0921B02D3 +:101D400081E080931D0281E090E090939E0180935A +:101D50009D01C2C58091230190912401E816F906E6 +:101D600039F08091210190912201E816F90659F489 +:101D70001092200210920B0210920C0210920D028F +:101D800010920E0257C08091250190912601E8160D +:101D9000F906A9F410921F0210920F02109210027D +:101DA000109211021092120210921E02109213024F +:101DB0001092140210921502109216023BC022E0FB +:101DC000E216F10479F410921D021092170210929B +:101DD00018021092190210921A0210929E0110928B +:101DE0009D017AC51092200210920B0210920C02F3 +:101DF00010920D0210920E0210921F0210920F020A +:101E000010921002109211021092120210921E02F1 +:101E100010921302109214021092150210921602E0 +:101E200010921D02109217021092180210921902BD +:101E300010921A02F701EE0FFF1FE756FE4F1182B4 +:101E400010824AC52091230130912401E216F30645 +:101E500039F02091210130912201E216F30659F464 +:101E60001092200210920B0210920C0210920D029E +:101E700010920E022AC02091250130912601E2160F +:101E8000F306A9F410921F0210920F021092100292 +:101E9000109211021092120210921E02109213025E +:101EA0001092140210921502109216020EC092E0C7 +:101EB000E916F10451F410921D02109217021092CB +:101EC00018021092190210921A028A3009F471C392 +:101ED00094F4843009F430C22CF4813019F1833049 +:101EE00039F1F8C4883009F4ECC20CF0EDC2853049 +:101EF00009F479C0EFC4893209F4E7C354F4883196 +:101F000009F413C28F3109F4CAC3853109F0E2C460 +:101F100080C38B3209F4DCC40CF4A4C48C3209F401 +:101F2000C4C4D8C4C7010E941C0C6091DA0157C018 +:101F3000C7010E941C0C1091DA01C12ED12C61E066 +:101F4000802F0E944F03112309F446C01F3F09F45C +:101F500045C0F701ED58FF4FE491E330F9F048F444 +:101F6000E130B9F0E230A1F584B5806284BD18BDDE +:101F7000B1C4E730E9F0E83019F1E43049F5809177 +:101F80008000806280938000D0928B00C0928A0093 +:101F9000A1C484B5806884BD17BD9CC480918000B5 +:101FA000806880938000D0928900C092880092C49B +:101FB0008091B00080688093B0001093B3008AC411 +:101FC0008091B00080628093B0001093B40082C40E +:101FD000A0E8CA16D10414F460E001C061E0802FCB +:101FE0000E94EE0277C4C7010E941C0C8091DA01A6 +:101FF0008093B7018091DB018093B801E091B70134 +:10200000F091B801FA8BE98B8091DC018093B701E4 +:102010008091DD018093B8018091B7019091B80162 +:102020009C8B8B8B181619060CF082C180910001D5 +:10203000081721F08F3F09F04DC404C0E8E6F0E036 +:10204000149174C000930001E8E6F0E0E491EF3FE2 +:1020500009F440C4E13009F443C038F1E23009F03A +:1020600064C01092B0001092B1008091B000826004 +:102070008093B0008091B10081608093B100F7013E +:10208000EF56FF4FE491F0E0EE0FFF1FE957FF4FCF +:10209000859194919093940180939301F701EB556E +:1020A000FF4FE491E09392018DC714BC15BC84B539 +:1020B000826084BD85B5816085BDF701EF56FF4F15 +:1020C000E491F0E0EE0FFF1FE957FF4F85919491E7 +:1020D000F701EB55FF4FE491E093BA0110E072C7AE +:1020E000109280001092810080918100886080931E +:1020F000810080918100816080938100F701EF561B +:10210000FF4FE491F0E0EE0FFF1FE957FF4F85917D +:102110009491F701EB55FF4FE491E093B90161E031 +:10212000802F0E944F0311E087C01E2F17FDD2C3DE +:1021300061E0802F0E944F03812F8D7F09F07CC0CA +:10214000A989BA892D01612C712C60E072E18AE7BE +:1021500090E0A30192010E94CD1949015A01690141 +:102160007A01B1E0CB1AD108E108F108EFEFCE1601 +:10217000D104E104F10409F008F44CC060E472E415 +:102180008FE090E0A30192010E94CD1969017A01CC +:10219000F1E0CF1AD108E108F108123009F52FEF6C +:1021A000C216D104E104F10409F008F4D4C660E9D0 +:1021B00070ED83E090E0A30192010E94CD196901C6 +:1021C0007A0181E0C81AD108E108F1089FEFC91629 +:1021D000D104E104F10411F008F04DC683E025C0FC +:1021E000AFEFCA16D104E104F104B1F0A8F068E43D +:1021F00078EE81E090E0A30192010E94CD1969017F +:102200007A01B1E0CB1AD108E108F108112309F4F1 +:10221000A6C670C681E001C082E0111106C095B566 +:10222000987F892B85BD3CC085E09091B100987F57 +:10223000892B8093B10034C0A989BA892D01612C02 +:10224000712C60E072E18AE790E0A30192010E94A4 +:10225000CD1969017A01B1E0CB1AD108E108F10882 +:10226000C114D104E1E0EE06F10488F068E478EEF0 +:1022700081E090E0A30192010E94CD1969017A01E9 +:10228000F1E0CF1AD108E108F10883E001C081E054 +:10229000113031F490918100987F892B80938100D7 +:1022A00029893A89220F331FAB89BC890E94591BA7 +:1022B00028EE33E040E050E00E94FF19113099F021 +:1022C000123019F1111106C3C7BC2093BF0130931E +:1022D000C0014093C1015093C20180916E008260A1 +:1022E00080936E00F7C2D0928900C092880020933C +:1022F000BB013093BC014093BD015093BE0180915E +:102300006F00826080936F00E5C2C092B30020939B +:1023100095013093960140939701509398018091D5 +:102320007000826080937000D5C2C7010E941C0CAF +:10233000802F0E948B08CEC2C7010E941C0CB09057 +:10234000DA0124EB2B1508F4C5C2E3ECF1E080E0E0 +:1023500090E021913191E216F30681F0232B41F4B4 +:10236000FC01EE0FFF1FED53FE4FF182E08206C02D +:1023700001968830910569F780E090E0FC01EE0F4E +:10238000FF1F8E0F9F1FFC01EF53FC4FF0808181D8 +:102390009281ABE0AF15E8F161E0802F0E944F031E +:1023A0008F2D90E0AC01440F551FFA01E80FF91F83 +:1023B000E15EFC4F0F732081207C022B008320E024 +:1023C00030E0F901EE0FFF1FE20FF31FE15EFC4F5B +:1023D000608166FD14C02F5F3F4F2C30310589F7B7 +:1023E0001092800022E020938100109285001092CC +:1023F0008400B19A20916F00226020936F00840FB7 +:10240000951FFC01E15EFC4F80818064808390E039 +:1024100080E028E532E06901C91AD10897FDD3941C +:10242000CC0CDD1CCC0CDD1C08E810E0081B1109ED +:1024300087FD1395000F111F000F111F2801012E9A +:10244000000C66087708AB2DB0E0A53BB10514F091 +:10245000A4EBB0E0A6010D2C000C660B770B9A01E3 +:10246000AB0124193509460957090E94F71924EBD5 +:1024700030E040E050E00E94CD19420E531E641E31 +:10248000751EBBE0BF1508F425C2401651062CF09E +:1024900086014C145D040CF4820102501109000FF6 +:1024A000111F2FB7F8948F2D90E0FC01EE0FFF1F46 +:1024B0008E0F9F1FFC01E15EFC4F128301832FBF33 +:1024C00009C20E94950C06C2C7010E941C0CC09054 +:1024D000DA01AC2CB12CE3E0CE9E60011124C601E0 +:1024E0000E947A1B009721F4C12CD12CA12CB12C75 +:1024F000F701EF56FF4FE491F0E0EE0FFF1FE957B1 +:10250000FF4F25913491F701EB55FF4FE49141E0E6 +:102510004093AB031092AC03B092AE03A092AD0314 +:10252000D092B003C092AF03F092B203E092B10335 +:102530001092B3039093B5038093B4034093B60312 +:102540001092B70352E05093B8034093B90310922E +:10255000BA031092BB031092BC031092BD033093D8 +:10256000BF032093BE03E093C0030E94121C60E0EF +:10257000802F0E944F038091B1039091B20397FD89 +:1025800008C061E00E944F0360E08091B1030E94A7 +:10259000EE0281E08093AC034091AF035091B00311 +:1025A00060E070E08091B4039091B5030E94A01C9C +:1025B00091C1C7010E941C0C8091DA018F3FB1F4D8 +:1025C00000E010E020E040E060E0C8010E94550219 +:1025D0008091B4039091B503892B11F00E949C0166 +:1025E0000F5F1F4F0F3F110569F774C12091E00184 +:1025F0004091DE016091DC0190E00E9455028091E3 +:10260000B4039091B503892B09F464C10E949C0125 +:1026100061C1C7010E941C0CF0922601E0922501C5 +:102620001091DA01F701EB55FF4F8491F701EF5656 +:10263000FF4FE49100939D039BE090939E03809352 +:102640009F03E093A00380E89EE3A0E0B0E08093C6 +:10265000A5039093A603A093A703B093A80362E0F9 +:10266000802F0E944F030E94950CDC01CB01805DFE +:102670009740A109B1098093A1039093A203A0936D +:10268000A303B093A40387E38093AA03112309F45F +:1026900021C181E080931F0280931E021BC1C701EC +:1026A0000E941C0C8091DA01F0929103E092900359 +:1026B000282F30E03093930320939203882309F46A +:1026C00009C181E080931D0205C1C7010E941C0C55 +:1026D0000E941D0311E01093520287E2809374025E +:1026E00010925302109275020E94E600882379F03E +:1026F000109352028FE3809374021092530210924F +:1027000075020E94E60081112BC08FE301C087E2B1 +:102710001092470310924603809348031092490396 +:1027200010924A0310924B0310924C0380E1809365 +:102730004D0382E080934E0310924F0368EC70E0EB +:1027400080E090E00E948B030E941D0310924903D9 +:1027500080914E03823028F098E09093490301C0A5 +:10276000FFCF80934C0362E370E080E090E00E9432 +:102770008B0360914F0384E493E00E94E40964E6D4 +:1027800070E080E090E00E948B0360E384E493E0DB +:102790000E94F7098BE496E40197F1F760E384E483 +:1027A00093E00E94F7098BE496E40197F1F760E368 +:1027B00084E493E00E94F70983E592E00197F1F742 +:1027C00060E284E493E00E94F7096091490360624B +:1027D00040E084E493E00E94100A84E080934A037E +:1027E00040E06CE084E493E00E94100A0E94420101 +:1027F00082E080934B0340E066E084E493E00E9433 +:10280000100A40E062E084E493E00E94100A8BE347 +:102810009FE10197F1F788E080934F0360E084E443 +:1028200093E00E94E40960E080E00E944D0164E6CC +:1028300070E080E090E00E948B0369E171E081E04C +:102840000E947C0161E171E082E00E947C0169E00C +:1028500071E083E00E947C0161E071E084E00E940D +:102860007C0138C0C7010E941C0C6091DA01809184 +:10287000DC010E944D01E3EDF1E0DE011196BD01A6 +:1028800083858D93329683EF91E08E179F07C1F772 +:10289000FB0101900020E9F73197AF01461B570B70 +:1028A00084E493E00E941C0615C0C7010E941C0C22 +:1028B0001091DE016091DA018091DC010E944D01EE +:1028C000112331F0612F84E493E00E94270A02C0B3 +:1028D0000E9442010E94620C1092080255C96FE0EA +:1028E00070E080E090E00E948B0399E9E92E91E08E +:1028F000F92E00E010E0D701CD90DD907D01C114EC +:10290000D10409F03AC0902E60E0802F0E944F035E +:102910000E946A0CF801ED58FF4F8491F801EB55C5 +:10292000FF4FA490F801EF56FF4FB490BB2099F0F1 +:1029300081110E94C502EB2DF0E0EE0FFF1FE7545E +:10294000FF4FA591B491EC91AE2291E080E009F4A3 +:1029500090E0C92ED82EB601DD0C880B990B0E9491 +:10296000B0180E94320C892D0E942D0C81E00E942B +:102970002D0C0E945A0C0E94620C0F5F1F4F0E30EC +:10298000110509F0B8CF0DE211E0F12CF8018191A9 +:1029900091918F01892B39F50E946A0C8F2D8064EB +:1029A00080937C0080917A00806480937A0080918B +:1029B0007A0086FDFCCF609178008091790070E00C +:1029C000782B072E000C880B990B0E94B0180E94E0 +:1029D000320C8F2D0E942D0C82E00E942D0C0E9443 +:1029E0005A0C0E94620CF394F6E0FF12CFCF809154 +:1029F0002002882309F47FC01091230160E0812F19 +:102A00000E94EE0283E090E00197F1F761E0812FF0 +:102A10000E94EE0283E290E00197F1F760E0812FDF +:102A20000E94EE0280912101909122019927FC01E0 +:102A3000EB55FF4F6491FC01EF56FF4FE491F0E03E +:102A4000EE0FFF1FE754FF4F8591949100E315E7C8 +:102A500020E030E0462F0E94EB0C611571058105E6 +:102A6000910549F0DC01CB010196A11DB11DBC010E +:102A7000CD019F7003C060E070E0CB010E94AE18F2 +:102A800020E030E048EE51E40E949D1A20E030E062 +:102A900040E05FE30E940F196B017C0120E030E011 +:102AA000A9010E94A918811109C0C0900B02D09001 +:102AB0000C02E0900D02F0900E0208C0C0920B02D2 +:102AC000D0920C02E0920D02F0920E020E946A0C6B +:102AD000C701B6010E94320C809123010E942D0C87 +:102AE000809121010E942D0C87E00E942D0C0E94F4 +:102AF0005A0C0E94620C80911F02882309F4B8C00E +:102B0000E0912501F0912601EE0FFF1FE756FE4FE1 +:102B100081E090E0918380830E94C503882309F4BB +:102B20008CC080919E038C3009F448C018F48B301F +:102B3000D1F06BC08551823008F067C010919A03C4 +:102B4000612F6F7770E0762F662780919B03682B4B +:102B500080E090E00E94AE182DEC3CEC4CEC5DE384 +:102B60000E940F1949C060919A0370E080E090E0E4 +:102B70000E94AE186B017C0110919B0317FF0AC0E5 +:102B80009B01AC0160E070E080E89FEB0E94301A8E +:102B90006B017C01612F6F7070E080E090E00E941B +:102BA000B0182DEC3CEC4CEC5DE30E940F19A70132 +:102BB00096010E94311A6B017C012DC010919A037D +:102BC00060919B036F7070E080E090E00E94B0180D +:102BD0002DEC3CEC4CEC5DE30E940F196B017C0189 +:102BE000612F70E080E090E00E94AE189B01AC0184 +:102BF000C701B6010E94311A6B017C0117FF0BC09F +:102C0000F7FAF094F7F8F09406C0C12CD12CF0EC50 +:102C1000EF2EFFE7FF2E20E030E0A901C701B6014B +:102C20000E94A91881110FC0C0900F02D09010020D +:102C3000E0901102F09012020EC0C12CD12CE0ECF9 +:102C4000EE2EEFE7FE2EC0920F02D0921002E0921D +:102C50001102F09212020E946A0CC701B6010E9492 +:102C6000320C86E10E942D0C0E945A0C0E94620CCC +:102C700080911E02882309F47EC0E0912501F09125 +:102C80002601EE0FFF1FE756FE4F81E090E0918393 +:102C900080830E94C503882309F452C080919E035B +:102CA0008B30B0F18D30A8F08551823088F560917D +:102CB00098037091990376276727762780E090E044 +:102CC0000E94AE182DEC3CEC4CEC5DE30E940F1919 +:102CD0001CC06091990370E080E090E00E94B01801 +:102CE0002DEC3CEC4CEC5DE30E940F196B017C0178 +:102CF0006091980370E080E090E00E94B0189B0122 +:102D0000AC01C701B6010E94311A6B017C0106C0FB +:102D1000C12CD12C60ECE62E6FE7F62E20E030E0DF +:102D2000A901C701B6010E94A91881110FC0C09066 +:102D30001302D0901402E0901502F09016020EC01B +:102D4000C12CD12C50ECE52E5FE7F52EC09213027A +:102D5000D0921402E0921502F09216020E946A0CC0 +:102D6000C701B6010E94320C87E10E942D0C0E941F +:102D70005A0C0E94620C80911D02882309F471C0D4 +:102D800000911B0210911C0281E090E090939E0143 +:102D900080939D010115110599F40E94CA040E94B7 +:102DA0009B02882389F1209160032E8B1D8A20903D +:102DB0006203309063038D899E89280E391E15C0E9 +:102DC0000130110591F40E94CA040E949B028823DD +:102DD000D9F090915C03988F1F8A20905E03309009 +:102DE0005F03AF89B88D2A0E3B1E2114310479F49C +:102DF00060911702709118028091190290911A0245 +:102E00000E940F1B1B0112C022242A94322CB101F4 +:102E1000032C000C880B990B0E94B01860931702CA +:102E2000709318028093190290931A020E946A0C00 +:102E3000B101032C000C880B990B0E94B0180E9462 +:102E4000320C802F0E942D0C80E20E942D0C0E94DB +:102E50005A0C64EF71E080E090E00E948B030E94C6 +:102E6000620C6AE070E080E090E00E948B030E94B8 +:102E70001E070C94C40D68E478EE81E090E0A30195 +:102E800092010E94CD1969017A01B1E0CB1AD108F3 +:102E9000E108F108EFEFCE16D104E104F10441F1AD +:102EA00038F164E274EF80E090E0A30192010E94A7 +:102EB000CD1969017A01E1E0CE1AD108E108F108E3 +:102EC000FFEFCF16D104E104F10409F008F4ACC916 +:102ED00062E17AE780E090E0A30192010E94CD19BF +:102EE00069017A0181E0C81AD108E108F10818C027 +:102EF00084E09BC92FEFC216D104E104F10469F10B +:102F000060F162E17AE780E090E0A30192010E9423 +:102F1000CD1969017A01F1E0CF1AD108E108F10871 +:102F20002FEFC216D104E104F10499F090F0D5011D +:102F3000C4013AE0B595A795979587953A95D1F74D +:102F40006C017D01F1E0CF1AD108E108F10887E0BA +:102F50006CC986E06AC982E068C984E05EC9AFEFE7 +:102F6000CA16D104E104F10459F150F162E17AE7A3 +:102F700080E090E0A30192010E94CD1969017A01DD +:102F800081E0C81AD108E108F1089FEFC916D10401 +:102F9000E104F10499F090F0D501C4012AE0B5955F +:102FA000A795979587952A95D1F76C017D01E1E06A +:102FB000CE1AD108E108F10885E031C984E02FC9B3 +:102FC00083E02DC961E0802F0E944F03B9C81092A1 +:102FD00079021092780288EE93E0A0E0B0E080934E +:102FE0007A0290937B02A0937C02B0937D0227E546 +:102FF00031E0309377022093760225EC30E0309375 +:1030000083022093820224EC30E0309385022093E7 +:10301000840220EC30E0309387022093860221EC7A +:1030200030E0309389022093880222EC30E0309324 +:103030008B0220938A0226EC30E030938D0220939D +:103040008C0210928F0210929002109291021092B4 +:103050009202109216031092150380931703909317 +:103060001803A0931903B0931A0389E691E0909393 +:1030700014038093130380914303A1ECB3E09FEF0B +:1030800048EB5BE08C3078F48C93282F30E0F9012A +:10309000EE0FFF1F2E0F3F1FF901E15EFC4F528321 +:1030A00041838F5F01C09C93139623E0A93DB20733 +:1030B00049F78093430381E08093AB031092AC0304 +:1030C0001092AE031092AD031092B0031092AF03B2 +:1030D0002FEF3FEF3093B2032093B1031092B3036D +:1030E0001092B5031092B4038093B6031092B70305 +:1030F00092E09093B8038093B9031092BA031092B0 +:10310000BB031092BC031092BD03109247031092B0 +:1031100046032BE731E0309345032093440310929C +:10312000480380E180934D0390934E0310924F0328 +:1031300008958091B4039091B5030E94121C809170 +:10314000B1039091B20397FD03C060E00C944F036C +:1031500008950E94EB1808F481E00895E89409C0EE +:1031600097FB3EF490958095709561957F4F8F4FBA +:103170009F4F9923A9F0F92F96E9BB279395F695D0 +:10318000879577956795B795F111F8CFFAF4BB0F4E +:1031900011F460FF1BC06F5F7F4F8F4F9F4F16C0B2 +:1031A000882311F096E911C0772321F09EE8872F3C +:1031B000762F05C0662371F096E8862F70E060E0F8 +:1031C0002AF09A95660F771F881FDAF7880F969571 +:1031D000879597F90895990F0008550FAA0BE0E815 +:1031E000FEEF16161706E807F907C0F012161306C9 +:1031F000E407F50798F0621B730B840B950B39F409 +:103200000A2661F0232B242B252B21F408950A266E +:1032100009F4A140A6958FEF811D811D08950E949C +:1032200022190C9493190E94851938F00E948C1968 +:1032300020F0952311F00C947C190C948219112420 +:103240000C94C7190E94A41970F3959FC1F3950FB0 +:1032500050E0551F629FF001729FBB27F00DB11D1A +:10326000639FAA27F00DB11DAA1F649F6627B00DAA +:10327000A11D661F829F2227B00DA11D621F739F93 +:10328000B00DA11D621F839FA00D611D221F749FA1 +:103290003327A00D611D231F849F600D211D822FE8 +:1032A000762F6A2F11249F5750409AF0F1F088230F +:1032B0004AF0EE0FFF1FBB1F661F771F881F91503C +:1032C0005040A9F79E3F510580F00C947C190C9456 +:1032D000C7195F3FE4F3983ED4F3869577956795D9 +:1032E000B795F795E7959F5FC1F7FE2B880F911D66 +:1032F0009695879597F9089597F99F6780E870E00C +:1033000060E008959FEF80EC089500240A9416165B +:10331000170618060906089500240A9412161306C3 +:10332000140605060895092E0394000C11F4882351 +:1033300052F0BB0F40F4BF2B11F460FF04C06F5F6D +:103340007F4F8F4F9F4F089557FD9058440F551F43 +:1033500059F05F3F71F04795880F97FB991F61F017 +:103360009F3F79F087950895121613061406551F8E +:10337000F2CF4695F1DF08C0161617061806991FFA +:10338000F1CF86957105610508940895E894BB27EF +:1033900066277727CB0197F90895052E97FB1EF432 +:1033A00000940E94E41957FD07D00E94FF1907FC02 +:1033B00003D04EF40C94E419509540953095219526 +:1033C0003F4F4F4F5F4F0895909580957095619551 +:1033D0007F4F8F4F9F4F08950E94211AA59F900DF8 +:1033E000B49F900DA49F800D911D11240895B7FFE7 +:1033F0000C94EC190E94EC19821B930B0895A1E226 +:103400001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F5E +:10341000FF1FA217B307E407F50720F0A21BB30BA9 +:10342000E40BF50B661F771F881F991F1A9469F725 +:1034300060957095809590959B01AC01BD01CF0181 +:103440000895A29FB001B39FC001A39F700D811D7D +:103450001124911DB29F700D811D1124911D08959D +:103460005058BB27AA270E94481A0C9493190E940F +:10347000851938F00E948C1920F039F49F3F19F417 +:1034800026F40C9482190EF4E095E7FB0C947C1959 +:10349000E92F0E94A41958F3BA176207730784072B +:1034A000950720F079F4A6F50C94C6190EF4E09572 +:1034B0000B2EBA2FA02D0B01B90190010C01CA01EE +:1034C000A0011124FF27591B99F0593F50F4503E99 +:1034D00068F11A16F040A22F232F342F4427585F8B +:1034E000F3CF469537952795A795F0405395C9F7A3 +:1034F0007EF41F16BA0B620B730B840BBAF091505B +:10350000A1F0FF0FBB1F661F771F881FC2F70EC0F9 +:10351000BA0F621F731F841F48F4879577956795CC +:10352000B795F7959E3F08F0B0CF9395880F08F0B8 +:103530009927EE0F9795879508950E94B11A0C94DC +:1035400093190E948C1958F00E94851940F029F4B3 +:103550005F3F29F00C947C1951110C94C7190C94FD +:1035600082190E94A41968F39923B1F3552391F3AA +:10357000951B550BBB27AA2762177307840738F0E2 +:103580009F5F5F4F220F331F441FAA1FA9F335D03F +:103590000E2E3AF0E0E832D091505040E695001CF3 +:1035A000CAF72BD0FE2F29D0660F771F881FBB1FAD +:1035B000261737074807AB07B0E809F0BB0B802D8B +:1035C000BF01FF2793585F4F3AF09E3F510578F0B7 +:1035D0000C947C190C94C7195F3FE4F3983ED4F324 +:1035E000869577956795B795F7959F5FC9F7880F8B +:1035F000911D9695879597F90895E1E0660F771FDD +:10360000881FBB1F621773078407BA0720F0621B6D +:10361000730B840BBA0BEE1F88F7E09508950E9498 +:10362000161B6894B1110C94C71908950E94AC1927 +:1036300088F09F5798F0B92F9927B751B0F0E1F073 +:10364000660F771F881F991F1AF0BA95C9F714C023 +:10365000B13091F00E94C619B1E008950C94C619DA +:10366000672F782F8827B85F39F0B93FCCF386955C +:1036700077956795B395D9F73EF4909580957095B9 +:1036800061957F4F8F4F9F4F089597FB072E16F43C +:10369000009407D077FD09D00E94601B07FC05D07D +:1036A0003EF4909581959F4F0895709561957F4F59 +:1036B00008950E94211AB7FF0895821B930B089565 +:1036C000AA1BBB1B51E107C0AA1FBB1FA617B70748 +:1036D00010F0A61BB70B881F991F5A95A9F7809564 +:1036E0009095BC01CD010895EE0FFF1F0590F49158 +:1036F000E02D09940F931F93CF93DF9382309105B0 +:1037000010F482E090E0E0918C04F0918D0420E0D0 +:1037100030E0A0E0B0E0309719F1408151810281A2 +:10372000138148175907C8F08417950769F4109753 +:1037300031F012960C93129713961C9327C00093A6 +:103740008C0410938D0422C02115310519F0421705 +:10375000530718F49A01BD01EF01DF01F801DBCF37 +:1037600021153105F9F0281B390B2430310580F47F +:103770008A819B816115710521F0FB01938382830E +:1037800004C090938D0480938C04FE01329644C053 +:10379000FE01E20FF31F8193919322503109398387 +:1037A00028833AC020918A0430918B04232B41F462 +:1037B0002091290130912A0130938B0420938A04AF +:1037C00020912701309128012115310541F42DB7B1 +:1037D0003EB740912B0150912C01241B350BE091F9 +:1037E0008A04F0918B04E217F307A0F42E1B3F0B21 +:1037F0002817390778F0AC014E5F5F4F2417350763 +:1038000048F04E0F5F1F50938B0440938A048193BE +:10381000919302C0E0E0F0E0CF01DF91CF911F91E2 +:103820000F910895CF93DF93009709F481C0FC01B5 +:10383000329713821282A0918C04B0918D0410975C +:1038400081F420813181820F931F20918A0430916D +:103850008B042817390751F5F0938B04E0938A0401 +:1038600067C0ED0120E030E0CE17DF0740F44A8169 +:103870005B819E0141155105F1F0EA01F5CFD3833B +:10388000C28340815181840F951FC817D90759F40D +:1038900088819981840F951F0296918380838A8104 +:1038A0009B81938382832115310529F4F0938D0444 +:1038B000E0938C043DC0E901FB83EA83499159916F +:1038C000C40FD51FEC17FD0761F480819181840F2F +:1038D000951F0296E90199838883828193819B8356 +:1038E0008A83E0E0F0E012968D919C911397009707 +:1038F00019F0FD01DC01F7CF8D919C9111979D018D +:103900002E5F3F4F820F931F20918A0430918B04CA +:103910002817390769F4309729F410928D04109212 +:103920008C0402C013821282B0938B04A0938A0489 +:10393000DF91CF91089581E090E0F8940C94A71C5A +:10394000DC0101C06D9341505040E0F7089510E054 +:10395000C3E6D0E004C0FE010E94741B2196C43669 +:08396000D107C9F7F894FFCF6D +:10396800FF00000A1F1F0E04000A15000A15000AAE +:103978001504040A0A111F1F0E040A0A0E0E1F1F3F +:103988000E0C000D00030000008E048000000000F3 +:103998000000000000000000000000400014005477 +:1039A800000000000041071C06860840079107A98F +:1039B80007280700000000AF061C064606FC06772D +:1039C80006550669060000000056082908860840C2 +:1039D8000721080D08FE0700000000270A1C0686BC +:1039E8000885080000000089081C06860885080D5F +:0239F8000A00C3 +:00000001FF diff --git a/app/modules/aiot.js b/app/modules/aiot.js new file mode 100644 index 0000000000..02cee8b841 --- /dev/null +++ b/app/modules/aiot.js @@ -0,0 +1,716 @@ +function Module() { + this.sp = null; + this.sensorTypes = { + ALIVE: 0, + DIGITAL: 1, + ANALOG: 2, + PWM: 3, + SERVO_PIN: 4, + TONE: 5, + PULSE_IN: 6, + ULTRASONIC: 7, + TIMER: 8, + NEOPIXEL_INIT: 9, + NEOPIXEL_COLOR: 10, + DHT_INIT: 21, + DHT_TEMP: 22, + DHT_HUMI: 23, + NO_TONE: 24, + LCD_INIT: 41, + LCD: 42, + LCD_CLEAR: 43, + LCD_EMOTICON: 44, + }; + + this.actionTypes = { + GET: 1, + SET: 2, + RESET: 3, + MODULE:4, + }; + + this.sensorValueSize = { + FLOAT: 2, + SHORT: 3, + STRING : 4, + SHORTSHORT: 5, + }; + + this.digitalPortTimeList = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + + this.sensorData = { + ULTRASONIC: 0, + DHT_TEMP: 0, + DHT_HUMI: 0, + DIGITAL: { + '0': 0, + '1': 0, + '2': 0, + '3': 0, + '4': 0, + '5': 0, + '6': 0, + '7': 0, + '8': 0, + '9': 0, + '10': 0, + '11': 0, + '12': 0, + '13': 0, + }, + ANALOG: { + '0': 0, + '1': 0, + '2': 0, + '3': 0, + '4': 0, + '5': 0, + }, + PULSE_IN: {}, + TIMER: 0, + }; + this.defaultOutput = {}; + this.recentCheckData = {}; + this.sendBuffers = []; + this.lastTime = 0; + this.lastSendTime = 0; + this.isDraing = false; +} + +var sensorIdx = 0; +Module.prototype.init = function(handler, config) {}; +Module.prototype.setSerialPort = function(sp) { + var self = this; + this.sp = sp; +}; + +Module.prototype.requestInitialData = function() { + return this.makeSensorReadBuffer(this.sensorTypes.ANALOG, 0); +}; + +Module.prototype.checkInitialData = function(data, config) { + return true; +}; + +Module.prototype.afterConnect = function(that, cb) { + //cb 은 화면의 이벤트를 보내는 로직. + //connected 라는 신호를 보내 강제로 연결됨 화면으로 전환 + that.connected = true; + if (cb) { + cb('connected'); + } +}; + +Module.prototype.validateLocalData = function(data) { + return true; +}; + +Module.prototype.requestRemoteData = function(handler) { + var self = this; + if (!self.sensorData) { + return; + } + Object.keys(this.sensorData).forEach(function(key) { + if (self.sensorData[key] != undefined) { + handler.write(key, self.sensorData[key]); + } + }); +}; + +Module.prototype.handleRemoteData = function(handler) { + var self = this; + var getDatas = handler.read('GET'); + var setDatas = handler.read('SET') || this.defaultOutput; + var time = handler.read('TIME'); + var buffer = new Buffer([]); + + if (getDatas) { + var keys = Object.keys(getDatas); + keys.forEach(function(key) { + var isSend = false; + var dataObj = getDatas[key]; + if ( + typeof dataObj.port === 'string' || + typeof dataObj.port === 'number' + ) { + var time = self.digitalPortTimeList[dataObj.port]; + if (dataObj.time > time) { + isSend = true; + self.digitalPortTimeList[dataObj.port] = dataObj.time; + } + } else if (Array.isArray(dataObj.port)) { + isSend = dataObj.port.every(function(port) { + var time = self.digitalPortTimeList[port]; + return dataObj.time > time; + }); + + if (isSend) { + dataObj.port.forEach(function(port) { + self.digitalPortTimeList[port] = dataObj.time; + }); + } + } + + if (isSend) { + if (!self.isRecentData(dataObj.port, key, dataObj.data)) { + self.recentCheckData[dataObj.port] = { + type: key, + data: dataObj.data, + }; + buffer = Buffer.concat([ + buffer, + self.makeSensorReadBuffer( + key, + dataObj.port, + dataObj.data + ), + ]); + } + } + }); + } + + if (setDatas) { + var setKeys = Object.keys(setDatas); + setKeys.forEach(function(port) { + var data = setDatas[port]; + if (data) { + if (self.digitalPortTimeList[port] < data.time) { + self.digitalPortTimeList[port] = data.time; + + if (!self.isRecentData(port, data.type, data.data)) { + self.recentCheckData[port] = { + type: data.type, + data: data.data, + }; + buffer = Buffer.concat([ + buffer, + self.makeOutputBuffer(data.type, port, data.data), + ]); + } + } + } + }); + } + + if (buffer.length) { + this.sendBuffers.push(buffer); + } +}; + +Module.prototype.isRecentData = function(port, type, data) { + var that = this; + var isRecent = false; + + if(type == this.sensorTypes.ULTRASONIC || type == this.sensorTypes.DHTTEMP || type == this.sensorTypes.DHTHUMI || type == this.sensorTypes.PMVALUE) { + var portString = port.toString(); + var isGarbageClear = false; + Object.keys(this.recentCheckData).forEach(function (key) { + var recent = that.recentCheckData[key]; + if(key === portString) { + + } + if(key !== portString && (recent.type == that.sensorTypes.ULTRASONIC || recent.type == that.sensorTypes.DHTTEMP || recent.type == that.sensorTypes.DHTHUMI || recent.type == that.sensorTypes.PMVALUE)) { + delete that.recentCheckData[key]; + isGarbageClear = true; + } + }); + + if((port in this.recentCheckData && isGarbageClear) || !(port in this.recentCheckData)) { + isRecent = false; + } else { + isRecent = true; + } + + } else if (port in this.recentCheckData && type != this.sensorTypes.TONE) { + if ( + this.recentCheckData[port].type === type && + this.recentCheckData[port].data === data + ) { + isRecent = true; + } + } + + return isRecent; +}; + +Module.prototype.requestLocalData = function() { + var self = this; + + if (!this.isDraing && this.sendBuffers.length > 0) { + this.isDraing = true; + this.sp.write(this.sendBuffers.shift(), function() { + if (self.sp) { + self.sp.drain(function() { + self.isDraing = false; + }); + } + }); + } + + return null; +}; + +/* +ff 55 idx size data a +*/ +Module.prototype.handleLocalData = function(data) { + var self = this; + var datas = this.getDataByBuffer(data); + + datas.forEach(function(data) { + if (data.length <= 4 || data[0] !== 255 || data[1] !== 85) { + return; + } + var readData = data.subarray(2, data.length); + var value; + switch (readData[0]) { + case self.sensorValueSize.FLOAT: { + value = new Buffer(readData.subarray(1, 5)).readFloatLE(); + value = Math.round(value * 100) / 100; + break; + } + case self.sensorValueSize.SHORT: { + value = new Buffer(readData.subarray(1, 3)).readInt16LE(); + break; + } + default: { + value = 0; + break; + } + } + + var type = readData[readData.length - 1]; + var port = readData[readData.length - 2]; + + switch (type) { + case self.sensorTypes.DIGITAL: { + self.sensorData.DIGITAL[port] = value; + break; + } + case self.sensorTypes.ANALOG: { + self.sensorData.ANALOG[port] = value; + break; + } + case self.sensorTypes.PULSE_IN: { + self.sensorData.PULSE_IN[port] = value; + break; + } + case self.sensorTypes.ULTRASONIC: { + self.sensorData.ULTRASONIC = value; + break; + } + case self.sensorTypes.DHT_TEMP: { + self.sensorData.DHT_TEMP = value; + //console.log(value); + break; + } + case self.sensorTypes.DHT_HUMI: { + self.sensorData.DHT_HUMI = value; + console.log(value); + break; + } + case self.sensorTypes.PM_VALUE: { + self.sensorData.PM_VALUE = value; + //console.log(value); + break; + } + case self.sensorTypes.TIMER: { + self.sensorData.TIMER = value; + break; + } + default: { + break; + } + } + }); +}; + +/* +ff 55 len idx action device port slot data a +0 1 2 3 4 5 6 7 8 +*/ + +Module.prototype.makeSensorReadBuffer = function(device, port, data) { + var buffer; + var dummy = new Buffer([10]); + if (device == this.sensorTypes.ULTRASONIC) { + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.GET, + device, + port[0], + port[1], + 10, + ]); + //console.log(buffer); + } else if (device == this.sensorTypes.DHT_TEMP) { + buffer = new Buffer([ + 255, + 85, + 5, + sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + //console.log(buffer); + } else if (device == this.sensorTypes.DHT_HUMI) { + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + console.log(buffer); + }else if (device == this.sensorTypes.PM_VALUE) { + buffer = new Buffer([ + 255, + 85, + 5, + sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + //console.log(buffer); + } else if (!data) { + buffer = new Buffer([ + 255, + 85, + 5, + sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + } else { + value = new Buffer(2); + value.writeInt16LE(data); + buffer = new Buffer([ + 255, + 85, + 7, + sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + } + sensorIdx++; + if (sensorIdx > 254) { + sensorIdx = 0; + } + //console.log(buffer); + return buffer; +}; + +//0xff 0x55 0x6 0x0 0x1 0xa 0x9 0x0 0x0 0xa +Module.prototype.makeOutputBuffer = function(device, port, data) { + var buffer; + var value = new Buffer(2); + var dummy = new Buffer([10]); + switch (device) { + case this.sensorTypes.SERVO_PIN: + case this.sensorTypes.DIGITAL: + case this.sensorTypes.PWM: { + value.writeInt16LE(data); + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + //console.log(buffer); + break; + } + case this.sensorTypes.TONE: { + var time = new Buffer(2); + if ($.isPlainObject(data)) { + value.writeInt16LE(data.value); + time.writeInt16LE(data.duration); + } else { + value.writeInt16LE(0); + time.writeInt16LE(0); + } + buffer = new Buffer([ + 255, + 85, + 8, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, time, dummy]); + break; + } + case this.sensorTypes.TONE: { + } + case this.sensorTypes.NO_TONE: { + value.writeInt16LE(data); + + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + //console.log(buffer); + break; + } + case this.sensorTypes.NEOPIXEL_INIT: { + value.writeInt16LE(data); + + //console.log(port); + //console.log(value); + + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + break; + } + + case this.sensorTypes.NEOPIXEL_COLOR: { + + var num = new Buffer(2); + var r = new Buffer(2); + var g = new Buffer(2); + var b = new Buffer(2); + + if($.isPlainObject(data)) + { + num.writeInt16LE(data.num); + r.writeInt16LE(data.r); + g.writeInt16LE(data.g); + b.writeInt16LE(data.b); + } + else + { + num.writeInt16LE(0); + r.writeInt16LE(0); + g.writeInt16LE(0); + b.writeInt16LE(0); + } + + buffer = new Buffer([ + 255, + 85, + 12, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, num, r, g, b, dummy]); + console.log(buffer); + break; + } + case this.sensorTypes.DHT_INIT: { + value.writeInt16LE(data); + + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + //console.log(buffer); + break; + } + + case this.sensorTypes.LCD_INIT: { + value.writeInt16LE(data); + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + //console.log(buffer); + break; + } + + case this.sensorTypes.LCD: { + var row = new Buffer(2); + var col = new Buffer(2); + + if($.isPlainObject(data)) { + row.writeInt16LE(data.row); + col.writeInt16LE(data.col); + } else { + row.writeInt16LE(0); + col.writeInt16LE(0); + } + var text0 = new Buffer(2); + var text1 = new Buffer(2); + var text2 = new Buffer(2); + var text3 = new Buffer(2); + var text4 = new Buffer(2); + var text5 = new Buffer(2); + var text6 = new Buffer(2); + var text7 = new Buffer(2); + var text8 = new Buffer(2); + var text9 = new Buffer(2); + var text10 = new Buffer(2); + var text11 = new Buffer(2); + var text12 = new Buffer(2); + var text13 = new Buffer(2); + var text14 = new Buffer(2); + var text15 = new Buffer(2); + if($.isPlainObject(data)) { + text0.writeInt16LE(data.text0); + text1.writeInt16LE(data.text1); + text2.writeInt16LE(data.text2); + text3.writeInt16LE(data.text3); + text4.writeInt16LE(data.text4); + text5.writeInt16LE(data.text5); + text6.writeInt16LE(data.text6); + text7.writeInt16LE(data.text7); + text8.writeInt16LE(data.text8); + text9.writeInt16LE(data.text9); + text10.writeInt16LE(data.text10); + text11.writeInt16LE(data.text11); + text12.writeInt16LE(data.text12); + text13.writeInt16LE(data.text13); + text14.writeInt16LE(data.text14); + text15.writeInt16LE(data.text15); + } else { + text0.writeInt16LE(0); + text1.writeInt16LE(0); + text2.writeInt16LE(0); + text3.writeInt16LE(0); + text4.writeInt16LE(0); + text5.writeInt16LE(0); + text6.writeInt16LE(0); + text7.writeInt16LE(0); + text8.writeInt16LE(0); + text9.writeInt16LE(0); + text10.writeInt16LE(0); + text11.writeInt16LE(0); + text12.writeInt16LE(0); + text13.writeInt16LE(0); + text14.writeInt16LE(0); + text15.writeInt16LE(0); + } + + buffer = new Buffer([255, 85, 40, sensorIdx, this.actionTypes.SET, device, port]); + buffer = Buffer.concat([buffer, row, col, text0, text1, text2, text3, text4, text5, text6, text7, text8, text9, text10,text11, text12, text13, text14, text15,dummy]); + + //console.log(buffer); + break; + } + + case this.sensorTypes.LCD_CLEAR: { + value.writeInt16LE(data); + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + console.log(buffer); + break; + } + + case this.sensorTypes.LCD_EMOTICON: { + var row = new Buffer(2); + var col = new Buffer(2); + var emoticon = new Buffer(2); + + if($.isPlainObject(data)) { + row.writeInt16LE(data.row); + col.writeInt16LE(data.col); + emoticon.writeInt16LE(data.emoticon); + } else { + row.writeInt16LE(0); + col.writeInt16LE(0); + emoticon.writeInt16LE(0); + } + + buffer = new Buffer([ + 255, + 85, + 10, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, row, col, emoticon, dummy]); + console.log(buffer); + break; + } + } + + return buffer; +}; + +Module.prototype.getDataByBuffer = function(buffer) { + var datas = []; + var lastIndex = 0; + buffer.forEach(function(value, idx) { + if (value == 13 && buffer[idx + 1] == 10) { + datas.push(buffer.subarray(lastIndex, idx)); + lastIndex = idx + 2; + } + }); + + return datas; +}; + +Module.prototype.disconnect = function(connect) { + var self = this; + connect.close(); + if (self.sp) { + delete self.sp; + } +}; + +Module.prototype.reset = function() { + this.lastTime = 0; + this.lastSendTime = 0; + + this.sensorData.PULSE_IN = {}; +}; + +module.exports = new Module(); diff --git a/app/modules/aiot.json b/app/modules/aiot.json new file mode 100644 index 0000000000..d1549bee12 --- /dev/null +++ b/app/modules/aiot.json @@ -0,0 +1,27 @@ +{ + "id": "260201", + "name": { + "ko": "AIoT 보드", + "en": "AIoT Board" + }, + "category": "board", + "platform": ["win32", "darwin"], + "icon" : "aiot.png", + "module": "aiot.js", + "url": "http://wonn.co.kr", + "email": "wonn@wonn.co.kr", + "driver": { + "win32-ia32": "CDM21226_Setup/CDM21226_Setup.exe", + "win32-x64": "CDM21226_Setup/CDM21226_Setup.exe" + }, + "reconnect" : true, + "firmware": "aiot", + "hardware": { + "type": "serial", + "control": "slave", + "duration": 32, + "vendor": ["Arduino", "wch.cn", "FTDI"], + "baudRate": 115200, + "firmwarecheck" : false + } +} diff --git a/app/modules/aiot.png b/app/modules/aiot.png new file mode 100644 index 0000000000..cd7df7d231 Binary files /dev/null and b/app/modules/aiot.png differ