clock animation is working now

This commit is contained in:
fenoglio 2020-02-28 07:59:39 +01:00
parent b0c303573f
commit a18b76a972
58 changed files with 909 additions and 160 deletions

Binary file not shown.

View file

@ -0,0 +1,484 @@
:100000000C9464000C948C000C948C000C948C0068
:100010000C948C000C948C000C948C000C948C0030
:100020000C948C000C948C000C948C000C948C0020
:100030000C948C000C948C000C948C000C948C0010
:100040000C941D070C948C000C9443030C941D031A
:100050000C948C000C948C000C948C000C948C00F0
:100060000C9475030C948C00000000002400270001
:100070002A0000000008000201000003040700003D
:100080000000000000001F1C1F1E1F1E1F1F1E1F40
:100090001E1F0102040810204080010204081020E5
:1000A00001020408102000000000250028002B0099
:1000B000040404040404040402020202020203030E
:1000C00003030303170B070B11241FBECFEFD8E068
:1000D000DEBFCDBF11E0A0E0B1E0E0EFFDE102C086
:1000E00005900D92AA33B107D9F722E0AAE3B1E057
:1000F00001C01D92AF3DB207E1F710E0C3E6D0E0CA
:1001000004C02197FE010E94F80BC236D107C9F73F
:100110000E9467070C94EB0E0C940000089508955C
:10012000CF92DF92EF92FF920F931F93CF93DF93C3
:100130006C017A018B01C0E0D0E0CE15DF0581F0C3
:10014000D8016D918D01D601ED91FC910190F08166
:10015000E02DC6010995892B11F02196EECF7E0185
:10016000C701DF91CF911F910F91FF90EF90DF902A
:10017000CF900895FC01538D448D252F30E0842FBE
:1001800090E0821B930B541710F0CF9608950197BF
:100190000895FC01918D828D981761F0828DDF01A9
:1001A000A80FB11D5D968C91928D9F5F9F73928F6A
:1001B00090E008958FEF9FEF0895FC01918D828D5F
:1001C000981731F0828DE80FF11D858D90E008952C
:1001D0008FEF9FEF0895FC01918D228D892F90E084
:1001E000805C9F4F821B91098F73992708958AE045
:1001F00092E00E94EB0021E0892B09F420E0822F9D
:100200000895FC01848DDF01A80FB11DA35ABF4FD3
:100210002C91848D90E001968F739927848FA68905
:10022000B7892C93A089B1898C91837080648C9359
:10023000938D848D981306C00288F389E02D808108
:100240008F7D80830895EF92FF920F931F93CF933A
:10025000DF93EC0181E0888F9B8D8C8D981305C016
:10026000E889F989808185FD26C0F62E0B8D10E086
:100270000F5F1F4F0F731127E02E8C8DE8120CC0FB
:100280000FB607FCFACFE889F989808185FFF5CFA1
:10029000CE010E940101F1CF8B8DFE01E80FF11D0F
:1002A000E35AFF4FF0829FB7F8940B8FEA89FB89DE
:1002B000808180620AC09FB7F894EE89FF896083CD
:1002C000E889F98980818370806480839FBF81E0A1
:1002D00090E0DF91CF911F910F91FF90EF900895E3
:1002E000CF93DF93EC01888D8823C9F0EA89FB89DD
:1002F000808185FD05C0A889B9898C9186FD0FC0D4
:100300000FB607FCF5CF808185FFF2CFA889B989A8
:100310008C9185FFEDCFCE010E940101E7CFDF91E7
:10032000CF91089580E090E0892B29F00E94F7009A
:1003300081110C940000089585ED8093BC0080919C
:10034000BC0084FDFCCF1092C901089540915A0170
:10035000262F30E0240F311D21323105DCF42091AD
:10036000C9012430C9F4FC0180E090E0861758F4FC
:1003700030915A012191DC01A65CBE4FA30FB11D43
:100380002C930196F3CF80915A01680F60935A0124
:1003900080E0089581E0089582E008950895E09155
:1003A000820180918101E81730F4F0E0ED57FE4FB3
:1003B000808190E008958FEF9FEF089590918201E2
:1003C00080918101981750F4E92FF0E0ED57FE4F2E
:1003D000208130E09F5F9093820102C02FEF3FEFBA
:1003E000C90108958091810190E020918201821BD2
:1003F00091090895CF92DF92EF92FF920F931F938E
:10040000CF93DF937C01CB018A012091ED01222360
:1004100089F0EB016B01C40ED51ECC15DD0569F02A
:100420006991D701ED91FC910190F081E02DC70118
:100430000995F3CF642F0E94A601C801DF91CF91E7
:100440001F910F91FF90EF90DF90CF900895CF9381
:10045000DF931F92CDB7DEB769832091ED01222390
:10046000D1F02091EA01203240F021E030E0FC019F
:100470003383228380E090E015C08091EB01E82F68
:10048000F0E0E653FE4F998190838F5F8093EB01FC
:100490008093EA0105C061E0CE0101960E94A601A9
:1004A00081E090E00F90DF91CF910895089580E072
:1004B00090E008950E94E60E2F923F924F925F9235
:1004C0006F927F928F929F92AF92BF92CF92DF9264
:1004D000EF92FF920F931F93CF93DF93CDB7DEB7C9
:1004E0006B017C015A01280139012DB63EB620E08E
:1004F00030E0A9010E942F0D20E030E040E05FE3F2
:1005000087FD05C0C701B6010E94FF0B04C0C701EB
:10051000B6010E94FE0B0E946B0C8B01B5010B2CE7
:10052000000C880B990B0E94A30C20E030E040E007
:100530005FE30E94340D6B017C0120E030E0A901F3
:100540000E942F0D20E030E040E05FE387FD05C012
:10055000C701B6010E94FF0B04C0C701B6010E948B
:10056000FE0B0E946B0CC501880F991F2DB73EB77B
:10057000281B390B0FB6F8943EBF0FBE2DBF8DB7A9
:100580009EB701964C01EDB7FEB7128211823396E9
:1005900080E090E00196A816B90619F01192119228
:1005A000F9CF6801C61AD70A9B01201B310B8901BC
:1005B000C8018C0D9D1D8A159B053CF5760133E520
:1005C000C316D1041CF083E5E81AF108F401E192A6
:1005D000F1924F01B7010F2C000C880B990B0E9470
:1005E00021068AE291E00E940F068091AF0290916D
:1005F000B002E816F90628F4B301A201C7010E946F
:10060000A305FFEFCF1ADF0AD3CF0FB6F8943EBE93
:100610000FBE2DBEDF91CF911F910F91FF90EF90F4
:10062000DF90CF90BF90AF909F908F907F906F9012
:100630005F904F903F902F9008951F920F920FB6AA
:100640000F9211242F933F934F935F936F937F9358
:100650008F939F93AF93BF93EF93FF938AE092E0C2
:100660000E940101FF91EF91BF91AF919F918F91F6
:100670007F916F915F914F913F912F910F900FBE9E
:100680000F901F9018951F920F920FB60F92112482
:100690002F938F939F93EF93FF93E0911A02F09122
:1006A0001B028081E0912002F091210282FD12C0A4
:1006B0009081809123028F5F8F7320912402821793
:1006C00051F0E0912302F0E0E65FFD4F958F8093BB
:1006D000230201C08081FF91EF919F918F912F9113
:1006E0000F900FBE0F901F9018951F920F920FB68C
:1006F0000F9211242F933F934F935F936F937F93A8
:100700008F939F93AF93BF93EF93FF938091B90023
:10071000887F803609F49CC068F5883209F45BC094
:1007200090F4803109F454C038F4882309F4F6C0F9
:10073000883009F44DC0F6C0883109F44CC08032CD
:1007400009F45DC0EFC0803409F468C048F4803318
:1007500009F455C0883309F0E5C08093C701D8C0BB
:10076000803509F44FC0883509F45DC0883409F03C
:10077000D9C0D6C0883909F4C7C0A8F4883709F4AD
:1007800067C038F4883609F463C0803709F460C064
:10079000C9C0883809F4B8C0803909F45FC080380E
:1007A00009F0C0C05BC0803B09F486C038F4803AD1
:1007B00009F466C0883A09F47FC0B4C0803C09F4EB
:1007C000A7C0883C09F4A4C0883B09F48AC0AAC029
:1007D0008091A40110C09091C6018091C501981725
:1007E00070F5E091C60181E08E0F8093C601F0E0C4
:1007F000EB55FE4F80818093BB0085EC86C08093D3
:10080000C7018EC0E091C60181E08E0F8093C601C2
:100810008091BB00F0E0EB55FE4F80839091C601C4
:100820008091C5016EC0E091C60181E08E0F80937A
:10083000C6018091BB00F0E0EB55FE4F80838091B4
:10084000C80181116DC081E08093A30184EA61C079
:1008500083E08093C90110927C01CFCF80917C010D
:10086000803208F051C0E0917C0181E08E0F8093CE
:100870007C018091BB00F0E0E45AFE4F8083BDCF45
:1008800085EC8093BC001092C90180917C0180327C
:1008900030F4E0917C01F0E0E45AFE4F1082609168
:1008A0007C0170E0E0917D01F0917E018CE591E0AA
:1008B000099510927C0136C084E08093C9011092A2
:1008C0005B0110925A01E0917F01F091800109953E
:1008D00080915A01811105C081E080935A011092E4
:1008E0003A01E0915B0181E08E0F80935B01F0E0C3
:1008F000E65CFE4F80818093BB0090915B0180910C
:100900005A01981708F479CF85E88093BC000AC093
:1009100085EC8093BC001092C90104C01092C701FD
:100920000E949C01FF91EF91BF91AF919F918F9198
:100930007F916F915F914F913F912F910F900FBEDB
:100940000F901F9018953FB7F8948091CB0290912B
:10095000CC02A091CD02B091CE0226B5A89B05C0D5
:100960002F3F19F00196A11DB11D3FBFBA2FA92F2E
:10097000982F8827820F911DA11DB11DBC01CD01AB
:1009800042E0660F771F881F991F4A95D1F7089597
:10099000DC0115961C92159714961C9214971396C9
:1009A0001C9213971C9281E011968C9311971196CB
:1009B0008C911197E82FF0E0EB57FF4FE4918230D4
:1009C00009F4EF5FE11102C08F5FEECF81E0129674
:1009D0008C9308950F931F93CF93DF93CDB7DEB71A
:1009E00029970FB6F894DEBF0FBECDBF0E94A304B7
:1009F0000091BC021091BD022091BE023091BF0255
:100A0000DC01CB01801B910BA20BB30B8C3291400C
:100A1000A105B10558F3F8948091B1029091B2020A
:100A20009A838983E091B602F091B702DF011196B3
:100A3000808189879091AD02E091C002F091C1025E
:100A40008091C202992309F42EC09081982B988737
:100A50009081809589238F838F818C8388E08B831D
:100A600058856F8149853B812C8189819A8150838A
:100A700047FD252F3A952083262F39F0441F00C0CB
:100A800000006083000000C0F2CF38E04D91608329
:100A90000000019761F7F093C102E093C00249871B
:100AA0003B832C8338C09081982B988790818095C8
:100AB00089238F838F818E8388E08D8358856F8112
:100AC00049853D812E8189819A81508347FD252F5B
:100AD00000C000C0208300C000C000C000C000C033
:100AE00060830000262F3A9541F0441F000000C0AB
:100AF00000C000C000C000C0E8CF38E04D9100C089
:100B0000608300C0019709F7F093C102E093C0022F
:100B100049873D832E839A83898378940E94A30416
:100B20006093BC027093BD028093BE029093BF029B
:100B300029960FB6F894DEBF0FBECDBFDF91CF91DF
:100B40001F910F9108958F929F92AF92BF92CF9273
:100B5000DF92EF92FF92CF93DF934B01AA24BB2445
:100B6000F82DC52ED62EE72EFF24AC2DE42F209194
:100B7000B502222361F0829E40011124F92D2C9DA3
:100B800060011124AD2D249FE0011124ED2F30913F
:100B9000BB02B091B802E090B602F090B7023B13EE
:100BA00008C09C01220F331F820F931F8E0D9F1DC3
:100BB00019C0880F991F880F991F8E0D9F1D472FF1
:100BC000552766277727EC01C30FD11D222349F053
:100BD00030E0249F7001259FF00C349FF00C11240D
:100BE0004F2D48832091B802EC01C20FD11DF8832C
:100BF0002091B902EC01C20FD11DA8832091BA0245
:100C0000DC01A20FB11DEC93DF91CF91FF90EF902B
:100C1000DF90CF90BF90AF909F908F9008950097F6
:100C200069F0FC0101900020E9F73197AF01481B02
:100C3000590BBC018AE092E00C94900080E090E0B7
:100C400008958F929F92AF92BF92CF92DF92EF92D0
:100C5000FF920F931F93CF93DF93CDB7DEB7A1978A
:100C60000FB6F894DEBF0FBECDBF6B017C0197FFBE
:100C70002BC06DE28AE092E00E9423018C012227C2
:100C80003327A9012C193D094E095F0919A2CE018C
:100C900081967C019AE0892E912CA12CB12CCA015D
:100CA000B901A50194010E94D60B605DF701629322
:100CB0007F01211531054105510589F7CF010E94BA
:100CC0000F06800F911F1DC09B01AC0119A28E0160
:100CD0000F5D1F4F8AE0C82ED12CE12CF12CCA01E8
:100CE000B901A70196010E94D60B605DF8016293DD
:100CF0008F01211531054105510589F7CF010E946A
:100D00000F06A1960FB6F894DEBF0FBECDBFDF91E0
:100D1000CF911F910F91FF90EF90DF90CF90BF90F8
:100D2000AF909F908F90089590E0FC01EE58FF4F98
:100D30002491FC01EE56FF4F3491FC01E055FF4F2A
:100D4000E491EE2309F43CC0222339F1233091F0E1
:100D500038F42130A9F0223001F584B58F7D12C01E
:100D6000273091F02830A1F02430B9F48091800030
:100D70008F7D03C0809180008F77809380000DC0AD
:100D800084B58F7784BD09C08091B0008F7703C090
:100D90008091B0008F7D8093B000F0E0EE0FFF1FD8
:100DA000EA55FF4FA591B4919FB7F894611104C023
:100DB0008C913095382302C0EC913E2B3C939FBF21
:100DC0000895CF93DF9390E0FC01EE56FF4F2491FE
:100DD000FC01E055FF4F8491882361F190E0880F7A
:100DE000991FFC01E859FF4FC591D491FC01EA55C8
:100DF000FF4FA591B491611109C09FB7F894888104
:100E0000209582238883EC912E230BC0623061F4FD
:100E10009FB7F8948881322F309583238883EC9193
:100E20002E2B2C939FBF06C08FB7F894E8812E2BF2
:100E300028838FBFDF91CF9108951F920F920FB635
:100E40000F9211242F933F938F939F93AF93BF9350
:100E50008091C7029091C802A091C902B091CA02C4
:100E60003091C60223E0230F2D3720F40196A11DF7
:100E7000B11D05C026E8230F0296A11DB11D2093C8
:100E8000C6028093C7029093C802A093C902B09390
:100E9000CA028091CB029091CC02A091CD02B09178
:100EA000CE020196A11DB11D8093CB029093CC027E
:100EB000A093CD02B093CE02BF91AF919F918F913D
:100EC0003F912F910F900FBE0F901F901895CF93C9
:100ED000DF93CDB7DEB72C970FB6F894DEBF0FBE09
:100EE000CDBF789484B5826084BD84B5816084BDB3
:100EF00085B5826085BD85B5816085BD80916E00B8
:100F0000816080936E0010928100809181008260E8
:100F10008093810080918100816080938100809125
:100F200080008160809380008091B1008460809314
:100F3000B1008091B00081608093B00080917A0010
:100F4000846080937A0080917A00826080937A0036
:100F500080917A00816080937A0080917A00806825
:100F600080937A001092C100E0911A02F0911B0266
:100F700082E08083E0911602F09117021082E091E6
:100F80001802F09119028FEC808310922202E091F6
:100F90001E02F0911F0286E08083E0911C02F09116
:100FA0001D02808180618083E0911C02F0911D020E
:100FB000808188608083E0911C02F0911D02808115
:100FC00080688083E0911C02F0911D0280818F7DFA
:100FD000808310928201109281011092EB01109295
:100FE000EA011092C90181E08093C8011092A30127
:100FF00061E082E10E94940661E083E10E94940630
:101000008091B9008E7F8093B9008091B9008D7F67
:101010008093B90088E48093B80085E48093BC0095
:101020008EE890E09093800180937F018FE890E0BC
:1010300090937E0180937D018091B3029091B402E0
:1010400097FD08C061E00E94E10660E08091B30274
:101050000E94940681E08093AE021092FE011092ED
:10106000FF01109200021092010280E09FEFA0E0C9
:10107000B0E08093EE019093EF01A093F001B09364
:10108000F1018FEF90E0A0E0B0E08093F201909347
:10109000F301A093F401B093F50180E090E0AFEF8D
:1010A000B0E08093F6019093F701A093F801B0931C
:1010B000F90180E090E0A0E8B0E08093FA0190931D
:1010C000FB01A093FC01B093FD01E090AF02F09012
:1010D000B002E114F104A1F000E010E08091AF0251
:1010E0009091B0020817190730F440E050E0BA01BF
:1010F000C8010E94A3050F5F1F4FE016F10671F7AC
:101100008091B6029091B702892B11F00E94EA04F7
:10111000EE24E39478E6272EE2E03E2EBB24BA9438
:10112000F5EEAF2EA5EC9A2EB6E08B2E1AEFF12E2F
:10113000E092ED012092EC011092EB011092EA0195
:101140008091C3029091C402DC01ED91FC91019069
:10115000F081E02D60E009953091EA01313208F02C
:1011600048C08091C9018111FCCF9091EC0130926F
:10117000C901E092C801B092C7011092C601309334
:10118000C501AAECB1E0E5EAF1E020E0321721F078
:101190004D9141932F5FFACF1092A4012091A401A9
:1011A000990F922B9093A4019091A301913069F42F
:1011B0001092A3019091A4019093BB009091BC0068
:1011C00093FDF8CF9092BC0002C0A092BC00909119
:1011D000C9019230E1F39091C7019F3F79F080916E
:1011E000C701803241F08091C701803331F483E040
:1011F00005C081E003C082E001C084E01092EB01F1
:101200001092EA011092ED018093C5028823A1F0AB
:10121000CE0101960E94C80486E0FE013196DE01EF
:10122000179601900D928A95E1F72F81C8847984F1
:101230001A85DB840C85E4C08091C9018111FCCF43
:10124000E092C901E092C801B092C7011092C601B4
:101250008092C501E092A4018091A401806D8093E9
:10126000A4018091A301813069F41092A3018091BF
:10127000A4018093BB008091BC0083FDF8CF9092C5
:10128000BC0002C0A092BC008091C9018130E1F392
:101290008091C601873018F49091C60101C097E093
:1012A000A5EAB1E0E3E8F1E080E0891721F02D91B3
:1012B00021938F5FFACF10928201809381018091F8
:1012C000C3029091C402DC01ED91FC910284F3858C
:1012D000E02D09958F77982F92959F70082F9F9DED
:1012E000000D11248091C3029091C402DC01ED91A4
:1012F000FC910284F385E02D09959C01332764E07D
:10130000359527956A95E1F7D82EF29ED00C1124D9
:101310008091C3029091C402DC01ED91FC910284A2
:10132000F385E02D099586FF0CC0182F1F71912FB2
:1013300092959F709F9D100D112485FF0DC0145F25
:101340000BC09C01332754E0359527955A95E1F75A
:10135000182FF29E100D11248091C3029091C402A7
:10136000DC01ED91FC910284F385E02D09958091DB
:10137000C3029091C402DC01ED91FC910284F385DB
:10138000E02D09959C01332794E0359527959A9592
:10139000E1F7782EF29E700C11248091C302909197
:1013A000C402DC01ED91FC910284F385E02D0995E6
:1013B000C82E8091C3029091C402DC01ED91FC9192
:1013C0000284F385E02D09959C01332744E035958F
:1013D00027954A95E1F7F29E800D112490E09C013B
:1013E0002053384FC7FE02C02C593F4F9C2D9F778A
:1013F000892F82958F70C92E8F9DC00C1124205D7E
:101400002093A702C092A8027092A9021093AA0288
:10141000D092AB020093AC02212F30E0309309024E
:10142000209308028D2D90E090930702809306028E
:1014300010E0109305020093040280910202909143
:1014400003028017910709F4DFC08DE291E00E944A
:101450000F066091080270910902072E000C880B9C
:10146000990B0E94210688E391E00E940F0660918B
:10147000060270910702072E000C880B990B0E9440
:10148000210688E391E00E940F06609104027091AA
:101490000502072E000C880B990B0E9421068AE298
:1014A00091E00E940F0680910402909105029093B2
:1014B000030280930202C090AF02D090B002C11428
:1014C000D104D9F04090FE015090FF0160900002DD
:1014D0007090010200E010E08091AF029091B002A4
:1014E0000817190728F4B301A201C8010E94A30537
:1014F0000F5F1F4FC016D10679F7CC24C394D12CAF
:101500006091080270910902C616D706FCF440905B
:10151000FA015090FB016090FC017090FD01B60152
:101520000D2C000C880B990B0E94A30C21E131E1DA
:1015300041EB5FE30E94340D9301820141E050E0F2
:101540000E945C02BFEFCB1ADB0ADACF4090F601B3
:101550005090F7016090F8017090F901072E000C8F
:10156000880B990B0E94A30C21E131E141EB5FE371
:101570000E94340D9301820143E050E00E945C021E
:101580004090F2015090F3016090F4017090F501E9
:101590006091060270910702072E000C880B990BD0
:1015A0000E94A30C21E131E141EB5FE30E94340D85
:1015B0009301820145E050E00E945C024090EE0100
:1015C0005090EF016090F0017090F1016091040281
:1015D00070910502072E000C880B990B0E94A30C3A
:1015E00021E131E141EB5FE30E94340D930182017F
:1015F00043E050E00E945C028091B6029091B702F5
:10160000892B11F00E94EA040E94920191CD8091F1
:10161000B6029091B7020E945D0E8091B302909144
:10162000B40297FD03C060E00C94E10608951092A7
:101630000D0210920C0288EE93E0A0E0B0E08093DF
:101640000E0290930F02A0931002B09311022AE0B1
:1016500031E030930B0220930A0225EC30E0309306
:1016600017022093160224EC30E0309319022093E5
:10167000180220EC30E030931B0220931A0221EC78
:1016800030E030931D0220931C0222EC30E03093B6
:101690001F0220931E0226EC30E03093210220939B
:1016A000200210922302109224021092250210921E
:1016B00026021092D2021092D1028093D30290930C
:1016C000D402A093D502B093D6028CE191E090931E
:1016D000D0028093CF028FEC92E09093C40280936B
:1016E000C3021092C5021092AE021092B50210927F
:1016F000BC021092BD021092BE021092BF0281E0A5
:101700008093BB028093B8021092B90292E090934A
:10171000BA028093AD0289EF90E09093B202809379
:10172000B1020E94C50D9093B7028093B602009754
:1017300061F029EFFC0111922A95E9F783E590E029
:101740009093B0028093AF0208C01092B202109240
:10175000B1021092B0021092AF0286E090E0909336
:10176000B4028093B3028091AE02882341F061E01D
:1017700086E00E94E10660E086E00E949406E6EBC7
:10178000F0E0E491F0E0EE0FFF1FEA55FF4F859186
:1017900094919093C1028093C002E8E9F0E0E49153
:1017A000E093C20287EA92E00C94C804A1E21A2EE8
:1017B000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FF5
:1017C000A217B307E407F50720F0A21BB30BE40B45
:1017D000F50B661F771F881F991F1A9469F760958C
:1017E0007095809590959B01AC01BD01CF01089546
:1017F000EE0FFF1F0590F491E02D09945058BB2780
:10180000AA270E94160C0C94F50C0E94E70C38F0E5
:101810000E94EE0C20F039F49F3F19F426F40C944A
:10182000E40C0EF4E095E7FB0C94DE0CE92F0E942B
:10183000060D58F3BA17620773078407950720F05F
:1018400079F4A6F50C94280D0EF4E0950B2EBA2F22
:10185000A02D0B01B90190010C01CA01A0011124B6
:10186000FF27591B99F0593F50F4503E68F11A1662
:10187000F040A22F232F342F4427585FF3CF4695F3
:1018800037952795A795F0405395C9F77EF41F1615
:10189000BA0B620B730B840BBAF09150A1F0FF0FDF
:1018A000BB1F661F771F881FC2F70EC0BA0F621FCB
:1018B000731F841F48F4879577956795B795F795BB
:1018C0009E3F08F0B0CF9395880F08F09927EE0F50
:1018D0009795879508950E94720C6894B1110C94A5
:1018E000290D08950E940E0D88F09F5798F0B92F8A
:1018F0009927B751B0F0E1F0660F771F881F991F45
:101900001AF0BA95C9F714C0B13091F00E94280DB1
:10191000B1E008950C94280D672F782F8827B85FC1
:1019200039F0B93FCCF3869577956795B395D9F79C
:101930003EF490958095709561957F4F8F4F9F4FA6
:101940000895E89409C097FB3EF4909580957095B2
:1019500061957F4F8F4F9F4F9923A9F0F92F96E9FB
:10196000BB279395F695879577956795B795F11170
:10197000F8CFFAF4BB0F11F460FF1BC06F5F7F4F0D
:101980008F4F9F4F16C0882311F096E911C077231F
:1019900021F09EE8872F762F05C0662371F096E828
:1019A000862F70E060E02AF09A95660F771F881FF7
:1019B000DAF7880F9695879597F9089597F99F67B5
:1019C00080E870E060E008959FEF80EC08950024C7
:1019D0000A941616170618060906089500240A9494
:1019E00012161306140605060895092E0394000C1A
:1019F00011F4882352F0BB0F40F4BF2B11F460FFA9
:101A000004C06F5F7F4F8F4F9F4F089557FD9058D1
:101A1000440F551F59F05F3F71F04795880F97FBB2
:101A2000991F61F09F3F79F087950895121613066C
:101A30001406551FF2CF4695F1DF08C0161617069B
:101A40001806991FF1CF86957105610508940895D0
:101A5000E894BB2766277727CB0197F908950E9462
:101A6000A10D08F48FEF08950E94470D0C94F50C1A
:101A70000E94E70C38F00E94EE0C20F0952311F044
:101A80000C94DE0C0C94E40C11240C94290D0E948F
:101A9000060D70F3959FC1F3950F50E0551F629F9F
:101AA000F001729FBB27F00DB11D639FAA27F00DB7
:101AB000B11DAA1F649F6627B00DA11D661F829FDE
:101AC0002227B00DA11D621F739FB00DA11D621FC3
:101AD000839FA00D611D221F749F3327A00D611DE0
:101AE000231F849F600D211D822F762F6A2F1124C2
:101AF0009F5750409AF0F1F088234AF0EE0FFF1FF5
:101B0000BB1F661F771F881F91505040A9F79E3F4B
:101B1000510580F00C94DE0C0C94290D5F3FE4F32A
:101B2000983ED4F3869577956795B795F795E795A1
:101B30009F5FC1F7FE2B880F911D9695879597F9AA
:101B40000895990F0008550FAA0BE0E8FEEF16164E
:101B50001706E807F907C0F012161306E407F507A1
:101B600098F0621B730B840B950B39F40A2661F015
:101B7000232B242B252B21F408950A2609F4A140B8
:101B8000A6958FEF811D811D08950F931F93CF930D
:101B9000DF938230910510F482E090E0E091DD0265
:101BA000F091DE0220E030E0A0E0B0E0309719F1E3
:101BB000408151810281138148175907C8F0841769
:101BC000950769F4109731F012960C9312971396BB
:101BD0001C9327C00093DD021093DE0222C0211562
:101BE000310519F04217530718F49A01BD01EF01AE
:101BF000DF01F801DBCF21153105F9F0281B390B86
:101C00002430310580F48A819B816115710521F0B2
:101C1000FB019383828304C09093DE028093DD02F4
:101C2000FE01329644C0FE01E20FF31F81939193AF
:101C300022503109398328833AC02091DB02309148
:101C4000DC02232B41F420910201309103013093F7
:101C5000DC022093DB02209100013091010121156B
:101C6000310541F42DB73EB7409104015091050173
:101C7000241B350BE091DB02F091DC02E217F30745
:101C8000A0F42E1B3F0B2817390778F0AC014E5FEC
:101C90005F4F2417350748F04E0F5F1F5093DC024B
:101CA0004093DB028193919302C0E0E0F0E0CF012A
:101CB000DF91CF911F910F910895CF93DF930097FC
:101CC00009F481C0FC01329713821282A091DD02D7
:101CD000B091DE02109781F420813181820F931F31
:101CE0002091DB023091DC022817390751F5F0937F
:101CF000DC02E093DB0267C0ED0120E030E0CE17AC
:101D0000DF0740F44A815B819E0141155105F1F0E6
:101D1000EA01F5CFD383C28340815181840F951F9F
:101D2000C817D90759F488819981840F951F0296A5
:101D3000918380838A819B819383828321153105DE
:101D400029F4F093DE02E093DD023DC0E901FB835C
:101D5000EA8349915991C40FD51FEC17FD0761F42F
:101D600080819181840F951F0296E9019983888370
:101D7000828193819B838A83E0E0F0E012968D91CB
:101D80009C911397009719F0FD01DC01F7CF8D911D
:101D90009C9111979D012E5F3F4F820F931F2091C1
:101DA000DB023091DC022817390769F4309729F4F7
:101DB0001092DE021092DD0202C013821282B093F2
:101DC000DC02A093DB02DF91CF91089581E090E0E7
:101DD000F8940C94EB0E10E0C3E6D0E004C0FE01D2
:101DE0000E94F80B2196C436D107C9F7F894FFCFAB
:101DF0000000DF0220000000000023019000BA0074
:101E00007001EB00C900DD00000000002702FA01AC
:101E10005702CE01F201DE01CF010D0A004E6F77AD
:0A1E2000206973202D3E20003A00D7
:00000001FF

View file

@ -0,0 +1 @@
!<arch>

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1 @@
ff781d083fae9e0bd9253df143495503eec5b6e2

View file

@ -0,0 +1,63 @@
{
"configurations": [
{
"name": "!!! WARNING !!! AUTO-GENERATED FILE, PLEASE DO NOT MODIFY IT AND USE https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags"
},
{
"name": "Win32",
"includePath": [
"c:/Users/jnoack/Documents/GITs/infinityledclock/vscode/clock/include",
"c:/Users/jnoack/Documents/GITs/infinityledclock/vscode/clock/src",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/Wire/src",
"C:/Users/jnoack/.platformio/lib/RTC_ID274/src",
"C:/Users/jnoack/.platformio/lib/Adafruit NeoPixel_ID28",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/cores/arduino",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/variants/eightanaloginputs",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/SPI/src",
"C:/Users/jnoack/.platformio/lib/DS3231_ID1379",
"C:/Users/jnoack/.platformio/lib/ESP32Servo_ID4744/src",
"C:/Users/jnoack/.platformio/lib/TimerOne_ID131",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/EEPROM/src",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/HID/src",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/SoftwareSerial/src",
"C:/Users/jnoack/.platformio/packages/tool-unity",
""
],
"browse": {
"limitSymbolsToIncludedHeaders": true,
"path": [
"c:/Users/jnoack/Documents/GITs/infinityledclock/vscode/clock/include",
"c:/Users/jnoack/Documents/GITs/infinityledclock/vscode/clock/src",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/Wire/src",
"C:/Users/jnoack/.platformio/lib/RTC_ID274/src",
"C:/Users/jnoack/.platformio/lib/Adafruit NeoPixel_ID28",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/cores/arduino",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/variants/eightanaloginputs",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/SPI/src",
"C:/Users/jnoack/.platformio/lib/DS3231_ID1379",
"C:/Users/jnoack/.platformio/lib/ESP32Servo_ID4744/src",
"C:/Users/jnoack/.platformio/lib/TimerOne_ID131",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/EEPROM/src",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/HID/src",
"C:/Users/jnoack/.platformio/packages/framework-arduino-avr/libraries/SoftwareSerial/src",
"C:/Users/jnoack/.platformio/packages/tool-unity",
""
]
},
"defines": [
"PLATFORMIO=40100",
"ARDUINO_AVR_NANO",
"F_CPU=16000000L",
"ARDUINO_ARCH_AVR",
"ARDUINO=10808",
"__AVR_ATmega328P__",
""
],
"intelliSenseMode": "clang-x64",
"cStandard": "c11",
"cppStandard": "c++11",
"compilerPath": "\"C:/Users/jnoack/.platformio/packages/toolchain-atmelavr@1.50400.190710/bin/avr-gcc.exe\" -mmcu=atmega328p"
}
],
"version": 4
}

32
vscode/clock/.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,32 @@
// AUTOMATICALLY GENERATED FILE. PLEASE DO NOT MODIFY IT MANUALLY
// PIO Unified Debugger
//
// Documentation: https://docs.platformio.org/page/plus/debugging.html
// Configuration: https://docs.platformio.org/page/projectconf/section_env_debug.html
{
"version": "0.2.0",
"configurations": [
{
"type": "platformio-debug",
"request": "launch",
"name": "PIO Debug",
"executable": "c:/Users/jnoack/Documents/GITs/infinityledclock/vscode/clock/.pio/build/nanoatmega328/firmware.elf",
"toolchainBinDir": "C:/Users/jnoack/.platformio/packages/toolchain-atmelavr@1.50400.190710/bin",
"preLaunchTask": {
"type": "PlatformIO",
"task": "Pre-Debug"
},
"internalConsoleOptions": "openOnSessionStart"
},
{
"type": "platformio-debug",
"request": "launch",
"name": "PIO Debug (skip Pre-Debug)",
"executable": "c:/Users/jnoack/Documents/GITs/infinityledclock/vscode/clock/.pio/build/nanoatmega328/firmware.elf",
"toolchainBinDir": "C:/Users/jnoack/.platformio/packages/toolchain-atmelavr@1.50400.190710/bin",
"internalConsoleOptions": "openOnSessionStart"
}
]
}

View file

@ -1 +1 @@
8eef9632a3892fcc0c09db17be5184cc16cc1602 04494c3f57e718d0fb8180e31fe62686bf2f9497

View file

@ -0,0 +1,60 @@
#include "led_clockelements.hpp"
class led_clock : protected elements
{
private:
static const uint8_t PIN_PIXELS = D3; //6;
static const uint16_t NUM_RING_PIXELS = 180U;
static const uint8_t NUM_SECONDS = 60U;
static const uint16_t NUM_RING_SEC_PIXELS = NUM_RING_PIXELS/NUM_SECONDS;
static const uint8_t NUM_MINUTES = 60U;
static const uint16_t NUM_RING_MIN_PIXELS = 1;
static const uint16_t NUM_POINTER_PIXELS = 6U;
static const uint16_t NUM_POINTERS = 12U;
static const uint16_t NUM_POINTERS_PIXELS = NUM_POINTER_PIXELS * NUM_POINTERS;
static const int16_t NUM_NUMBERS = 12U;
const uint16_t NUM_NUMBER_PIXELS[NUM_NUMBERS] = {2,4,4,4,4,4,4,4,4,5,3,5};
const uint16_t NUM_NUMBERS_PIXELS = NUM_NUMBER_PIXELS[0] + NUM_NUMBER_PIXELS[1] + NUM_NUMBER_PIXELS[2] + NUM_NUMBER_PIXELS[3] + NUM_NUMBER_PIXELS[4] + NUM_NUMBER_PIXELS[5] + NUM_NUMBER_PIXELS[6] + NUM_NUMBER_PIXELS[7] + NUM_NUMBER_PIXELS[8] + NUM_NUMBER_PIXELS[9] + NUM_NUMBER_PIXELS[10] + NUM_NUMBER_PIXELS[11];
const uint16_t NUM_ALL_PIXELS = NUM_RING_PIXELS + NUM_POINTERS_PIXELS + NUM_NUMBERS_PIXELS;
const hue_color COLOR_SECS = {HUE_GREEN,255,128}; // green
const hue_color COLOR_HOURS = {HUE_RED,255,128}; // red
const hue_color COLOR_MINS = {HUE_BLUE,255,128}; // blue
const hue_color COLOR_NUMS = {0,0,255}; // white
enum color_type {COL_SECOND = 0, COL_MINUTE, COL_HOUR, COL_NUM, COL_LAST};
hue_color color[COL_LAST] = {COLOR_SECS, COLOR_MINS, COLOR_HOURS, COLOR_NUMS};
CRGB * pixels;
elements number[NUM_NUMBERS];
elements pointer[NUM_POINTERS];
elements ringsecs[NUM_SECONDS];
elements ringmins[NUM_MINUTES];
unsigned int pixels_test;
void init_ringmins(void);
void init_ringsecs(void);
void init_numbers(void);
void init_pointers(void);
void init_test_pixel(void);
void show_hour( uint8_t hour, uint8_t minute);
void show_minute( uint8_t minute );
void animate_new_minute( uint8_t minute , uint8_t second, uint8_t hour);
void animate_new_hour( uint8_t minute , uint8_t second, uint8_t hour);
public:
enum test_type {TEST_NONE=0, TEST_PIXELS=1, TEST_SECS=2, TEST_MINS=4,TEST_PTRS=8,TEST_NUMS=16, TEST_ALL = 31};
void init(unsigned test_at_start = TEST_NONE);
void init(hue_color color_secs, hue_color color_mins, hue_color color_hours, hue_color color_nums, unsigned test_at_start);
void showtime(uint8_t hour, uint8_t minute, uint8_t second);
};

View file

@ -10,12 +10,13 @@ uint8_t sat;
uint8_t bright; uint8_t bright;
} hue_color; } hue_color;
#define FASTLEDDLY 2
class elements class elements
{ {
private: private:
/* data */ /* data */
#define FASTLEDDLY 1
#define BRIGHTNESS 128 #define BRIGHTNESS 128
#define SATURATION 255 #define SATURATION 255
public: public:
@ -35,9 +36,10 @@ public:
void fill(hue_color huecolor); void fill(hue_color huecolor);
void fill(void); void fill(void);
void clean(void); void clean(void);
void ffill(unsigned int fraction, uint8_t huecolor, uint8_t saturation = SATURATION, uint8_t brightness = BRIGHTNESS); void ffill(unsigned int fraction, unsigned int fullvalue, uint8_t huecolor, uint8_t saturation = SATURATION, uint8_t brightness = BRIGHTNESS);
void ffill(unsigned int fraction, hue_color huecolor); void ffill(unsigned int fraction, unsigned int fullvalue, hue_color huecolor);
void ffill(unsigned int fraction); void ffill(unsigned int fraction, unsigned int fullvalue);
void show(void);
}; };

View file

@ -0,0 +1,210 @@
#include "led_clock.hpp"
void led_clock::init( unsigned test_at_start)
{
init(COLOR_SECS , COLOR_MINS , COLOR_HOURS , COLOR_NUMS, test_at_start);
}
void led_clock::init(hue_color color_secs, hue_color color_mins, hue_color color_hours, hue_color color_nums, unsigned test_at_start)
{
pixels_test = test_at_start;
color[COL_SECOND] = color_secs;
color[COL_MINUTE] = color_mins;
color[COL_HOUR] = color_hours;
color[COL_NUM] = color_nums;
init_test_pixel();
init_ringsecs();
init_ringmins();
init_pointers();
init_numbers();
//Serial.printf("Init pixels - first:%d last:%d number:%d outsidetoinside:%d\n", element_first_pixel, element_last_pixel, element_number_pixels, element_outside2inside);
}
void led_clock::init_ringmins() {
// init all the seconds shown on the ring
Serial.println("Init minutes on outer ring ...");
unsigned int current_first_led = 1;
for(uint8_t num = 0; num < NUM_MINUTES; num++)
{
ringmins[num].init(pixels, current_first_led, NUM_RING_MIN_PIXELS, color[COL_MINUTE]);
ringmins[num].clean();
if(pixels_test & TEST_MINS)
ringmins[num].test(true);
current_first_led += NUM_RING_PIXELS/NUM_MINUTES;
}
}
void led_clock::init_ringsecs() {
// init all the seconds shown on the ring
Serial.println("Init seconds on outer ring ...");
unsigned int current_first_led = 0;
for(uint8_t num = 0; num < NUM_SECONDS; num++)
{
ringsecs[num].init(pixels, current_first_led, NUM_RING_SEC_PIXELS, color[COL_SECOND]);
ringsecs[num].clean();
if(pixels_test & TEST_SECS)
ringsecs[num].test(true);
current_first_led += NUM_RING_SEC_PIXELS;
}
}
void led_clock::init_numbers() {
// init all the numbers
Serial.println("Init numbers ...");
unsigned int current_first_led = NUM_RING_PIXELS + NUM_POINTERS_PIXELS;
for(uint8_t num = 0; num < NUM_NUMBERS; num++)
{
uint8_t real_num = num == 11? 0 : num + 1;
number[real_num].init(pixels, current_first_led, NUM_NUMBER_PIXELS[num],color[COL_NUM]);
number[real_num].clean();
if(pixels_test & TEST_NUMS)
number[real_num].test(true);
current_first_led += NUM_NUMBER_PIXELS[num];
}
}
void led_clock::init_pointers() {
Serial.println("Init pointers ...");
// init all the pointers - each as 6 leds, starts at 12,11,10 ... 1, each even is inversed (goes from outside into center)
unsigned int current_first_led = NUM_RING_PIXELS;
bool is_insideoutside = false;
for(int8_t num = NUM_POINTERS-1; num >= 0; num--)
{
uint8_t real_num = num == 11? 0 : num + 1;
is_insideoutside = num%2==0? false:true;
pointer[real_num].init(pixels, current_first_led, NUM_POINTER_PIXELS ,color[COL_MINUTE],is_insideoutside);
pointer[real_num].clean();
if(pixels_test & TEST_PTRS)
pointer[real_num].test();
current_first_led += NUM_POINTER_PIXELS;
}
}
void led_clock::init_test_pixel()
{
pixels = (CRGB*) malloc(NUM_ALL_PIXELS * sizeof(CRGB) );
FastLED.clearData();
FastLED.addLeds<WS2812B, PIN_PIXELS, RGB>(pixels, NUM_ALL_PIXELS); // GRB ordering is typical
FastLED.clear(true);
Serial.printf("Init LED pixels %d \n",NUM_ALL_PIXELS);
if(pixels_test & TEST_PIXELS)
for(unsigned char col = COL_SECOND; col < COL_LAST; col++)
{
unsigned int pixel = 0;
for(pixel = 0; pixel < NUM_ALL_PIXELS; pixel++)
{
if(pixel > 0)
{
pixels[pixel-1] = CHSV(0,0,0);
}
pixels[pixel] = CHSV(color[col].hue, color[col].sat, color[col].bright);
show();
}
FastLED.clear(true);
}
}
void led_clock::show_minute( uint8_t minute )
{
for(uint8_t minnr = 0; minnr < minute; minnr++)
{
if(minnr % 5 == 0)
{
ringmins[minnr].fill(ringmins[minnr].elements_huecolor.hue, ringmins[minnr].elements_huecolor.sat, ringmins[minnr].elements_huecolor.bright/2);
}
else
{
ringmins[minnr].fill(ringmins[minnr].elements_huecolor.hue, ringmins[minnr].elements_huecolor.sat, ringmins[minnr].elements_huecolor.bright/8);
}
}
ringmins[minute].fill();
}
void led_clock::animate_new_minute( uint8_t minute , uint8_t second, uint8_t hour)
{
uint8_t old_minute = minute==0?NUM_MINUTES-1:minute-1;
FastLED.clearData();
show_minute( old_minute );
show_hour( hour, old_minute);
ringsecs[second].fill();
show();
for(uint8_t minnr = 1; minnr < minute; minnr++)
{
ringmins[minnr].fill();
if(minnr > 1){
if(minnr-1 % 5 != 0)
ringmins[minnr-1].fill(ringmins[minnr-1].elements_huecolor.hue, ringmins[minnr-1].elements_huecolor.sat, ringmins[minnr-1].elements_huecolor.bright/8);
else
ringmins[minnr-1].fill(ringmins[minnr-1].elements_huecolor.hue, ringmins[minnr-1].elements_huecolor.sat, ringmins[minnr-1].elements_huecolor.bright/2);
}
show();
}
}
void led_clock::animate_new_hour( uint8_t minute , uint8_t second, uint8_t hour)
{
uint8_t old_hour = hour==0?11:hour-1;
uint8_t old_minute = NUM_MINUTES-1;
FastLED.clearData();
show_minute( old_minute );
show_hour( old_hour, old_minute);
ringsecs[second].fill();
show();
for(uint8_t minnr = 1; minnr < NUM_MINUTES; minnr++)
{
ringmins[minnr].clean();
show();
}
}
void led_clock::show_hour( uint8_t hour, uint8_t minute)
{
uint8_t next_hour = hour == 11? 0:hour+1;
uint8_t brightness = number[hour].elements_huecolor.bright;
uint8_t basebrightness = brightness/6;
uint8_t minutebrightness = (brightness-basebrightness)/NUM_MINUTES;
uint8_t fractionbrightness = minutebrightness * minute;
uint8_t numbrightness = (uint8_t)(basebrightness + fractionbrightness);
//Serial.printf("Show hour: minute=%d, basebright=%d, mintebright=%d, fractionbright=%d, bright=%d\n", minute, basebrightness, minutebrightness, fractionbrightness, numbrightness );
number[hour].fill(number[hour].elements_huecolor.hue, number[hour].elements_huecolor.sat,brightness-numbrightness);
number[next_hour].fill(number[next_hour].elements_huecolor.hue, number[next_hour].elements_huecolor.sat,numbrightness);
pointer[hour].ffill(NUM_MINUTES-minute, NUM_MINUTES);
pointer[next_hour].ffill(minute, NUM_MINUTES);
}
void led_clock::showtime(uint8_t hour, uint8_t minute, uint8_t second)
{
if(second == 0)
{
if(minute!=0)
{
animate_new_minute( minute , second, hour);
}
else
{
animate_new_hour( minute , second, hour);
}
}
else
{
FastLED.clearData();
show_minute( minute );
ringsecs[second].fill();
show_hour( hour, minute);
show();
}
}

View file

@ -1,4 +1,4 @@
#include "clockelements.hpp" #include "led_clockelements.hpp"
void elements::init(CRGB *pixels, unsigned int first_led, unsigned int number_leds, hue_color huecolor, bool outside2inside) void elements::init(CRGB *pixels, unsigned int first_led, unsigned int number_leds, hue_color huecolor, bool outside2inside)
{ {
@ -11,6 +11,12 @@ void elements::init(CRGB *pixels, unsigned int first_led, unsigned int number_le
//Serial.printf("Init pixels - first:%d last:%d number:%d outsidetoinside:%d\n", element_first_pixel, element_last_pixel, element_number_pixels, element_outside2inside); //Serial.printf("Init pixels - first:%d last:%d number:%d outsidetoinside:%d\n", element_first_pixel, element_last_pixel, element_number_pixels, element_outside2inside);
} }
void elements::show(void)
{
FastLED.show();
delay(FASTLEDDLY);
}
void elements::clean(void) void elements::clean(void)
{ {
fill(0, 0, 0); fill(0, 0, 0);
@ -30,25 +36,22 @@ void elements::test(uint8_t huecolor, uint8_t saturation, uint8_t brightness, bo
{ {
unsigned int setpix = element_outside2inside == true? element_last_pixel: element_first_pixel ; unsigned int setpix = element_outside2inside == true? element_last_pixel: element_first_pixel ;
char plus_minus = element_outside2inside == true? -1:1; char plus_minus = element_outside2inside == true? -1:1;
for(uint8_t nrpixel = 0; nrpixel < element_number_pixels; nrpixel++) for(unsigned int nrpixel = 0; nrpixel < element_number_pixels; nrpixel++)
{ {
element_pixels[setpix] = CHSV(huecolor,saturation, brightness); element_pixels[setpix] = CHSV(huecolor,saturation, brightness);
setpix = setpix + plus_minus; setpix = setpix + plus_minus;
if( all_at_once == false) if( all_at_once == false)
{ {
FastLED.show(); show();
delay(FASTLEDDLY);
} }
} }
if( all_at_once == true) if( all_at_once == true)
{ {
FastLED.show(); show();
delay(FASTLEDDLY);
} }
delay(100); delay(100);
clean(); clean();
FastLED.show(); show();
delay(FASTLEDDLY);
} }
void elements::fill(void) void elements::fill(void)
@ -63,41 +66,40 @@ void elements::fill(hue_color huecolor)
void elements::fill(uint8_t huecolor, uint8_t saturation, uint8_t brightness) void elements::fill(uint8_t huecolor, uint8_t saturation, uint8_t brightness)
{ {
for(uint8_t nrpixel = element_first_pixel; nrpixel <= element_last_pixel; nrpixel++) for(unsigned int nrpixel = element_first_pixel; nrpixel <= element_last_pixel; nrpixel++)
{ {
element_pixels[nrpixel] = CHSV(huecolor,saturation, brightness); element_pixels[nrpixel] = CHSV(huecolor,saturation, brightness);
} }
} }
void elements::ffill(unsigned int fraction) void elements::ffill(unsigned int fraction, unsigned int fullvalue)
{ {
ffill(fraction, elements_huecolor.hue, elements_huecolor.sat, elements_huecolor.bright); ffill(fraction, fullvalue, elements_huecolor.hue, elements_huecolor.sat, elements_huecolor.bright);
} }
void elements::ffill(unsigned int fraction, hue_color huecolor) void elements::ffill(unsigned int fraction, unsigned int fullvalue, hue_color huecolor)
{ {
ffill(fraction, huecolor.hue, huecolor.sat, huecolor.bright); ffill(fraction, fullvalue, huecolor.hue, huecolor.sat, huecolor.bright);
} }
void elements::ffill(unsigned int fraction, uint8_t huecolor, uint8_t saturation, uint8_t brightness) void elements::ffill(unsigned int fraction, unsigned int fullvalue, uint8_t huecolor, uint8_t saturation, uint8_t brightness)
{ {
uint8_t fullpixels = element_number_pixels / fraction; unsigned int value_of_pixel = fullvalue / element_number_pixels; //this is what part one pixel of the element represents of the full value
uint8_t partpixels = element_number_pixels % fraction; unsigned int fullpixels = fraction / value_of_pixel; //the number of pixels that represents the fraction (part of the fullvalue)
elements_fraction = brightness / (60/element_number_pixels); unsigned int partialpixel = fraction % value_of_pixel; //the left over of the division of fraction and value of one pixel
uint8_t part_brightness = elements_fraction * partpixels; uint8_t partial_brightness = (uint8_t)((brightness/element_number_pixels)*partialpixel);
unsigned int current_pixel = 0; unsigned int current_pixel = 0;
for(unsigned int num = 0; num < fullpixels; num++)
for(uint8_t num = 0; num < fullpixels; num++)
{ {
current_pixel = element_outside2inside==true? element_last_pixel - num : element_first_pixel + num; current_pixel = element_outside2inside==true? element_last_pixel - num : element_first_pixel + num;
element_pixels[current_pixel] = CHSV(huecolor,saturation, brightness); element_pixels[current_pixel] = CHSV(huecolor,saturation, brightness);
} }
if(partpixels > 0) if(partialpixel > 0)
{ {
current_pixel = element_outside2inside==true? element_last_pixel - fullpixels : element_first_pixel + fullpixels; current_pixel = element_outside2inside==true? element_last_pixel - fullpixels : element_first_pixel + fullpixels;
element_pixels[current_pixel] = CHSV(huecolor,saturation, part_brightness); element_pixels[current_pixel] = CHSV(huecolor,saturation, partial_brightness);
} }
} }

View file

@ -3,43 +3,13 @@
//#include <SoftwareWire.h> // must be included here so that Arduino library object file references work //#include <SoftwareWire.h> // must be included here so that Arduino library object file references work
//#include <RtcDS3231.h> //#include <RtcDS3231.h>
#include "led_clock.hpp"
#include "clockelements.hpp" led_clock ledclock;
//SoftwareWire myWire(A4, A5); //SoftwareWire myWire(A4, A5);
//RtcDS3231<SoftwareWire> Rtc(myWire); //RtcDS3231<SoftwareWire> Rtc(myWire);
const unsigned int PIN_BUZZER = 9; const unsigned int PIN_BUZZER = 9;
const uint8_t PIN_PIXELS = D3; //6;
const uint16_t NUM_RING_PIXELS = 180U;
const uint8_t NUM_SECONDS = 60U;
const uint16_t NUM_RING_SEC_PIXELS = NUM_RING_PIXELS/NUM_SECONDS;
const uint8_t NUM_MINUTES = 60U;
const uint16_t NUM_RING_MIN_PIXELS = 1;
const uint16_t NUM_POINTER_PIXELS = 6U;
const uint16_t NUM_POINTERS = 12U;
const uint16_t NUM_POINTERS_PIXELS = NUM_POINTER_PIXELS * NUM_POINTERS;
const int16_t NUM_NUMBERS = 12U;
const uint16_t NUM_NUMBER_PIXELS[NUM_NUMBERS] = {2,4,4,4,4,4,4,4,4,4,4,5};
const uint16_t NUM_NUMBERS_PIXELS = NUM_NUMBER_PIXELS[0] + NUM_NUMBER_PIXELS[1] + NUM_NUMBER_PIXELS[2] + NUM_NUMBER_PIXELS[3] + NUM_NUMBER_PIXELS[4] + NUM_NUMBER_PIXELS[5] + NUM_NUMBER_PIXELS[6] + NUM_NUMBER_PIXELS[7] + NUM_NUMBER_PIXELS[8] + NUM_NUMBER_PIXELS[9] + NUM_NUMBER_PIXELS[10] + NUM_NUMBER_PIXELS[11];
const uint16_t NUM_ALL_PIXELS = NUM_RING_PIXELS + NUM_POINTERS_PIXELS + NUM_NUMBERS_PIXELS;
CRGB * pixels;
//Adafruit_NeoPixel pixels(NUM_ALL_PIXELS, PIN_PIXELS, NEO_GRB + NEO_KHZ800);
elements number[NUM_NUMBERS];
elements pointer[NUM_POINTERS];
elements ringsecs[NUM_SECONDS];
elements ringmins[NUM_MINUTES];
const hue_color COLOR_SECS = {HUE_GREEN,255,128}; // green
const hue_color COLOR_HOURS = {HUE_RED,255,128}; // red
const hue_color COLOR_MINS = {HUE_BLUE,255,128}; // blue
const hue_color COLOR_NUMS = {0,0,255}; // white
const hue_color color[] = {COLOR_SECS, COLOR_MINS, COLOR_HOURS, COLOR_NUMS};
enum color_type {COL_SECOND = 0, COL_MINUTE, COL_HOUR, COL_NUM, COL_LAST};
const int TICK_FREQ = 40; const int TICK_FREQ = 40;
const int TICK_DLY = 13; const int TICK_DLY = 13;
@ -47,6 +17,11 @@ const int TOCK_FREQ = 15;
const int TOCK_DLY = 35; const int TOCK_DLY = 35;
bool tick_not_tock = true; bool tick_not_tock = true;
const hue_color COLOR_SECS = {HUE_GREEN,255,128}; // green
const hue_color COLOR_HOURS = {HUE_RED,255,128}; // red
const hue_color COLOR_MINS = {HUE_BLUE,255,128}; // blue
const hue_color COLOR_NUMS = {0,0,255}; // white
/* /*
void init_rtc() void init_rtc()
{ {
@ -95,60 +70,6 @@ void init_rtc()
} }
*/ */
void init_ringmins() {
// init all the seconds shown on the ring
Serial.println("Init minutes on outer ring ...");
unsigned int current_first_led = 1;
for(uint8_t num = 0; num < NUM_MINUTES; num++)
{
ringmins[num].init(pixels, current_first_led, NUM_RING_MIN_PIXELS, color[COL_MINUTE]);
ringmins[num].clean();
//ringmins[num].test(true);
current_first_led += NUM_RING_PIXELS/NUM_MINUTES;
}
}
void init_ringsecs() {
// init all the seconds shown on the ring
Serial.println("Init seconds on outer ring ...");
unsigned int current_first_led = 0;
for(uint8_t num = 0; num < NUM_SECONDS; num++)
{
ringsecs[num].init(pixels, current_first_led, NUM_RING_SEC_PIXELS, color[COL_SECOND]);
ringsecs[num].clean();
//ringsecs[num].test(true);
current_first_led += NUM_RING_SEC_PIXELS;
}
}
void init_numbers() {
// init all the numbers
Serial.println("Init numbers ...");
unsigned int current_first_led = NUM_RING_PIXELS + NUM_POINTERS_PIXELS;
for(uint8_t num = 0; num < NUM_NUMBERS; num++)
{
number[num].init(pixels, current_first_led, NUM_NUMBER_PIXELS[num],color[COL_NUM]);
number[num].clean();
number[num].test(true);
current_first_led += NUM_NUMBER_PIXELS[num];
}
}
void init_pointers() {
Serial.println("Init pointers ...");
// init all the pointers - each as 6 leds, starts at 12,11,10 ... 1, each even is inversed (goes from outside into center)
unsigned int current_first_led = NUM_RING_PIXELS;
bool is_insideoutside = false;
for(int8_t num = NUM_POINTERS-1; num >= 0; num--)
{
is_insideoutside = num%2==0? false:true;
pointer[num].init(pixels, current_first_led, NUM_POINTER_PIXELS ,color[COL_MINUTE],is_insideoutside);
pointer[num].clean();
//pointer[num].test();
current_first_led += NUM_POINTER_PIXELS;
}
}
/* /*
void tick_tock() void tick_tock()
{ {
@ -160,47 +81,15 @@ void tick_tock()
} }
*/ */
void init_test_pixel()
{
pixels = (CRGB*) malloc(NUM_ALL_PIXELS * sizeof(CRGB) );
FastLED.clearData();
FastLED.addLeds<WS2812B, PIN_PIXELS, RGB>(pixels, NUM_ALL_PIXELS); // GRB ordering is typical
FastLED.clear(true);
Serial.printf("Init LED pixels %d \n",NUM_ALL_PIXELS);
/*
for(unsigned char col = COL_SECOND; col < COL_LAST; col++)
{
unsigned int pixel = 0;
for(pixel = 0; pixel < NUM_ALL_PIXELS; pixel++)
{
if(pixel > 0)
{
pixels[pixel-1] = CHSV(0,0,0);
}
pixels[pixel] = CHSV(color[col].hue, color[col].sat, color[col].bright);
FastLED.show();
delay(FASTLEDDLY);
}
pixels[pixel] = CHSV(0,0,0);
FastLED.show();
delay(FASTLEDDLY);
}
*/
Serial.println("Done.");
}
void setup() { void setup() {
ESP.wdtEnable(5000); ESP.wdtEnable(5000);
Serial.begin(115200); Serial.begin(115200);
Serial.println("Lets tick ... tock ... tick ... tock ... "); Serial.println("Lets tick ... tock ... tick ... tock ... ");
// put your setup code here, to run once:
init_test_pixel(); ledclock.init(COLOR_SECS, COLOR_MINS, COLOR_HOURS, COLOR_NUMS, ledclock.TEST_NONE );
init_ringsecs();
init_ringmins();
init_pointers();
init_numbers();
//init_rtc(); //init_rtc();
} }
@ -236,21 +125,26 @@ void loop() {
} }
*/ */
while (0 == 0)
for(unsigned int second = 0; second<60; second++)
{ {
minute = second == 59 ? minute + 1 : minute; second = second + 1;
hour = minute == 60 ? hour+1 : hour; if(second > 59)
minute = minute > 59 ? 0 : minute; {
hour = hour > 11 ? 0 : hour; second = 0;
minute++;
FastLED.clearData(); if(minute > 59)
ringsecs[second].fill(); {
ringmins[minute].fill(); minute = 0;
number[hour].fill(); hour++;
FastLED.show(); if(hour > 11)
delay(100); {
hour = 0;
}
}
}
ledclock.showtime(hour,minute,second);
//Serial.printf("%02d : %02d : %02d \n" , hour, minute, second); //Serial.printf("%02d : %02d : %02d \n" , hour, minute, second);
} }