├── .gitgnore ├── ConfigurationFiles ├── LayoutSet.txt ├── PreConfiguration.py ├── ScreenConfig1306.py ├── ScreenConfig1322.py ├── ScreenConfig1351.py ├── ScreenConfig7735.py ├── ScreenConfigBraun.py ├── cava1 │ └── config ├── cava2 │ └── config ├── config.txt ├── ldconf │ └── libc.conf ├── mpd.conf ├── mpd.conf.tmpl ├── proftpd │ ├── controls.log │ ├── proftp-custom.conf │ ├── proftpd.conf │ ├── proftpd.log │ └── test ├── python │ ├── Setup │ └── test └── test ├── LICENSE.md ├── NoCover.bmp ├── PreConfiguration.sh ├── README.md ├── Standby ATTiny85 ├── Braun-NR1-StandBy.ino ├── standby.jpg └── stdby.png ├── fonts ├── DSEG7Classic-Regular.ttf ├── DSG.ttf ├── FONT_LICENSE.txt ├── NotoSansCJK.ttc ├── NotoSansTC-Bold.otf ├── NotoSansTC-Light.otf ├── NotoSansTC-Medium.otf ├── NotoSansTC-Regular.otf ├── Oxanium-Bold.ttf ├── Oxanium-ExtraBold.ttf ├── Oxanium-ExtraLight.ttf ├── Oxanium-Light.ttf ├── Oxanium-Medium.ttf ├── Oxanium-Regular.ttf ├── Oxanium-SemiBold.ttf ├── digi.ttf ├── entypo.ttf └── fa-solid-900.ttf ├── ftp.sh ├── img ├── ShutdownScreen1306.bmp ├── ShutdownScreen1322.bmp ├── StartScreen1306.bmp ├── StartScreen1322.bmp ├── shutdown.ppm ├── st7735start.bmp ├── st7735start2.bmp ├── st7735stop.bmp ├── volumio_logo.ppm ├── vu.png ├── vu1.png ├── vu2.png └── vudig.png ├── install-buildfix.sh ├── install.sh ├── installbuster.sh ├── modules ├── StatusLEDempty.py ├── StatusLEDgpio.py ├── StatusLEDpcf.py ├── display1306.py ├── display1322.py ├── display1351.py ├── display7735.py ├── displayBraun.py ├── pushbutton.py └── rotaryencoder.py ├── nr1ui.py ├── pcf-i2c-adress-config.sh ├── samba.sh ├── service-files ├── cava1.service ├── cava2.service ├── nr1ui.service └── nr1uibuster.service └── wiki ├── MS2501.png ├── MadeByGloria.jpg ├── fonts ├── Oxanium.png ├── dseg_sample.png └── entypo.jpg ├── fotos ├── 20200605_211206.jpg ├── 20200605_211215.jpg ├── 20200610_220630.jpg ├── 20200610_221909.jpg ├── 20200610_221915.jpg ├── 20200610_221921.jpg ├── 20200610_221927.jpg ├── 20200610_221932.jpg ├── 20200610_221937.jpg ├── 20200610_221942.jpg ├── 20200610_222003.jpg ├── 20200610_222135.jpg └── 20200610_222143.jpg ├── screenshots ├── Screenshots.png ├── ssd1306 (1).png ├── ssd1306 (2).png ├── ssd1306 (3).png ├── ssd1306Screen1 (1).png ├── ssd1306Screen1 (2).png ├── ssd1306Screen2 (1).png ├── ssd1306Screen2 (2).png ├── ssd1322 (1).png ├── ssd1322 (2).png ├── ssd1322 (3).png ├── ssd1322Screen1 (1).png ├── ssd1322Screen1 (2).png ├── ssd1322Screen2 (1).png ├── ssd1322Screen2 (2).png ├── ssd1322Screen3 (1).png ├── ssd1322Screen3 (2).png ├── ssd1322Screen4 (1).png ├── ssd1322Screen4 (2).png ├── ssd1322Screen5 (1).png ├── ssd1322Screen5 (2).png ├── ssd1322Screen6 (1).png ├── ssd1322Screen6 (2).png ├── ssd1322Screen7 (1).png ├── ssd1322Screen7 (2).png ├── ssd1322Screen8 (1).png ├── ssd1322Screen8 (2).png ├── ssd1322Screenselect.png └── test.txt ├── truthtable └── test.txt └── wiring ├── Screenshot - 01.03.2020 , 15_54_59.png ├── Wiring.jpg ├── button.png ├── button2.png ├── connection.png ├── standby.jpg ├── wiring.jpg ├── wiring1306.png └── wiring7735.png /.gitgnore: -------------------------------------------------------------------------------- 1 | # ignore a single file 2 | LICENSE.md 3 | README.md 4 | 5 | # ignore an entire directory 6 | /Standby ATTiny85/ 7 | /wiki/ 8 | -------------------------------------------------------------------------------- /ConfigurationFiles/LayoutSet.txt: -------------------------------------------------------------------------------- 1 | No-Spectrum -------------------------------------------------------------------------------- /ConfigurationFiles/PreConfiguration.py: -------------------------------------------------------------------------------- 1 | #config for Standby 2 | StandbyActive = False 3 | 4 | #config for NR1-UI-Remote 5 | NR1UIRemoteActive = True 6 | 7 | #config for LED 8 | ledActive = True 9 | ledTechnology = "pcf8574usage" 10 | 11 | #config for GPIO Buttons 12 | oledBtnA = 4 13 | oledBtnB = 17 14 | oledBtnC = 5 15 | oledBtnD = 6 16 | oledRtrLeft = 22 17 | oledRtrRight = 23 18 | oledRtrBtn = 27 19 | 20 | #config for Display: 21 | DisplayTechnology = "spi1322" 22 | NowPlayingLayout = "No-Spectrum" 23 | oledrotation = 0 24 | 25 | #config for timers: 26 | oledPause2StopTime = 15.0 27 | 28 | #config for spectrum 29 | SpectrumActive = True #Still needed -> Will be purged later. Do not Change! 30 | -------------------------------------------------------------------------------- /ConfigurationFiles/ScreenConfig1306.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | #___________________________________________________________________ 4 | #config for boot- and shutdown-logo 5 | oledBootLogo = "StartScreen1306.bmp" 6 | oledShutdownLogo = "ShutdownScreen1306.bmp" 7 | 8 | #___________________________________________________________________ 9 | #config for Clock/Standby: 10 | oledtext03 = 0, 2 #clock 11 | oledtext04 = 39, 42 #IP 12 | oledtext05 = 55, 29 #Date 13 | oledtext09 = 116, 54 #LibraryInfoIcon 14 | 15 | #_______Screen1 'Spectrum-Screen'_____________________________________________________ 16 | #Config TextPositions NowPlaying-/StandBy-Screen: 17 | Screen1text01 = 0, 0 #Artist 18 | Screen1text02 = 0, 18 #Title 19 | Screen1text06 = 8, 38 #format 20 | Screen1text07 = 32, 38 #samplerate 21 | Screen1text08 = 85, 38 #bitdepth 22 | Screen1text28 = 0, 38 23 | 24 | #configuration of the duration and playtime (textbox-) positions 25 | Screen1ActualPlaytimeText = 0, 51 26 | Screen1DurationText = 78, 51 27 | 28 | #config for Progress-Bar 29 | Screen1barwidth = 28 30 | Screen1barLineBorder = 'white' 31 | Screen1barLineFill = 'black' 32 | Screen1barLineX = 45 33 | Screen1barLineThick1 = 59 #difference between both = thickness 34 | Screen1barLineThick2 = 59 # 59 and 59 = 1 Pixel thick 35 | Screen1barBorder = 'white' 36 | Screen1barFill = 'black' 37 | Screen1barX = 45 38 | Screen1barThick1 = 56 #difference between both = thickness 39 | Screen1barThick2 = 62 # 56 and 62 = 6 Pixel thick 40 | 41 | #config for Spectrum 42 | Screen1specBorder = 'white' 43 | Screen1specFill = 'white' 44 | Screen1specWide1 = 2 45 | Screen1specWide2 = 0 46 | Screen1specYposTag = 63 47 | Screen1specYposNoTag = 63 48 | 49 | #_______Screen2 'Essential'_____________________________________________________ 50 | Screen2text01 = 0, 24 #Artist 51 | Screen2text02 = 0, 0 #Title 52 | Screen2text06 = 8, 50 #format 53 | Screen2text07 = 38, 41 #samplerate 54 | Screen2text08 = 85, 41 #bitdepth 55 | Screen2text28 = 0, 50 56 | 57 | #configuration of the duration and playtime (textbox-) positions 58 | Screen2ActualPlaytimeText = 0, 54 59 | Screen2DurationText = 78, 54 60 | 61 | #config for Progress-Bar 62 | Screen2barwidth = 128 63 | Screen2barLineBorder = 'white' 64 | Screen2barLineFill = 'black' 65 | Screen2barLineX = 0 66 | Screen2barLineThick1 = 63 #difference between both = thickness 67 | Screen2barLineThick2 = 63 # 59 and 59 = 1 Pixel thick 68 | Screen2barBorder = 'white' 69 | Screen2barFill = 'white' 70 | Screen2barX = 0 71 | Screen2barThick1 = 63 #difference between both = thickness 72 | Screen2barThick2 = 63 # 56 and 62 = 6 Pixel thick 73 | 74 | #_______Screen3 'Progress-Bar'_____________________________________________________ 75 | #Config TextPositions NowPlaying-/StandBy-Screen: 76 | Screen4text01 = 0, 0 #Artist 77 | Screen4text02 = 0, 18 #Title 78 | Screen4text06 = 8, 38 #format 79 | Screen4text07 = 32, 38 #samplerate 80 | Screen4text08 = 85, 38 #bitdepth 81 | Screen4text28 = 0, 38 82 | 83 | #configuration of the duration and playtime (textbox-) positions 84 | Screen4ActualPlaytimeText = 0, 51 85 | Screen4DurationText = 84, 51 86 | 87 | #config for Progress-Bar 88 | Screen4barwidth = 32 89 | Screen4barLineBorder = 'white' 90 | Screen4barLineFill = 'black' 91 | Screen4barLineX = 43 92 | Screen4barLineThick1 = 59 #difference between both = thickness 93 | Screen4barLineThick2 = 59 # 59 and 59 = 1 Pixel thick 94 | Screen4barBorder = 'white' 95 | Screen4barFill = 'black' 96 | Screen4barX = 43 97 | Screen4barThick1 = 56 #difference between both = thickness 98 | Screen4barThick2 = 62 # 56 and 62 = 6 Pixel thick 99 | 100 | #___________________________________________________________________ 101 | #Config TextPositions Media-Library-Info-Screen: 102 | oledtext10 = 80, 2 #Number of Artists 103 | oledtext11 = 80, 15 #Number of Albums 104 | oledtext12 = 80, 28 #Number of Songs 105 | oledtext13 = 80, 41 #Summary of duration 106 | oledtext14 = 14, 2 #Text for Artists 107 | oledtext15 = 14, 15 #Text for Albums 108 | oledtext16 = 14, 28 #Text for Songs 109 | oledtext17 = 14, 41 #Text for duration 110 | oledtext18 = 60, 52 #Menu-Label Icon 111 | oledtext19 = 120, 54 #LibraryInfoIcon 112 | oledtext20 = 0, 2 #icon for Artists 113 | oledtext21 = 0, 15 #icon for Albums 114 | oledtext22 = 0, 28 #icon for Songs 115 | oledtext23 = 0, 41 #icon for duration 116 | 117 | #___________________________________________________________________ 118 | #configuration Menu-Screen: 119 | oledListEntrys = 4 120 | oledEmptyListText = 'no items..' 121 | oledEmptyListTextPosition = 0, 4 122 | oledListTextPosX = 0 123 | oledListTextPosY = 16 #height of each Entry (4x16 = 64) 124 | 125 | #___________________________________________________________________ 126 | #config for Text: 127 | oledArt = 'Interpreten :' #sets the Artists-text for the MediaLibrarayInfo 128 | oledAlb = 'Alben :' #sets the Albums-text for the MediaLibrarayInfo 129 | oledSon = 'Songs :' #sets the Songs-text for the MediaLibrarayInfo 130 | oledPla = 'Playtime :' #sets the Playtime-text for the MediaLibrarayInfo 131 | 132 | #___________________________________________________________________ 133 | #config for Icons: 134 | oledlibraryInfo = '\U0001F4D6' 135 | oledlibraryReturn = '\u2302' 136 | oledArtistIcon = '\uF0F3' 137 | oledAlbumIcon = '\uF2BB' 138 | oledSongIcon = '\U0000F001' 139 | oledPlaytimeIcon = '\U0000F1DA' 140 | oledplayIcon = '\u25B6' 141 | oledpauseIcon = '\u2389' 142 | 143 | #____________________________________________________________________ 144 | #config for Scrolling Text 145 | ArtistScrollSpeed = 1 146 | ArtistEndScrollMargin = 2 147 | SongScrollSpeed = 1 148 | SongEndScrollMargin = 2 149 | 150 | #Menu 151 | oledMenuHighlightColor = 'black' 152 | oledMenuHighlightBackGround = 'white' 153 | oledMenuNotSelectedColor = 'white' 154 | oledMenuNotSelectedBackground = 'black' 155 | -------------------------------------------------------------------------------- /ConfigurationFiles/ScreenConfig1322.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | #___________________________________________________________________ 4 | #config for boot- and shutdown-logo 5 | oledBootLogo = "StartScreen1322.bmp" 6 | oledShutdownLogo = "ShutdownScreen1322.bmp" 7 | 8 | #___________________________________________________________________ 9 | #config for Clock/Standby: 10 | oledtext03 = 47, 4 #clock 11 | oledtext04 = 0, 52 #IP 12 | oledtext05 = 176, 52 #Date 13 | oledtext09 = 244, 51 #LibraryInfoIcon 14 | 15 | #_______'Spectrum-Center'_____________________________________________________ 16 | #Config TextPositions NowPlaying-/StandBy-Screen: 17 | Screen2text01 = 0, -4 #Artist 18 | Screen2text02 = 0, 16 #Title 19 | Screen2text06 = 0, 41 #format 20 | Screen2text07 = 159, 41 #samplerate 21 | Screen2text08 = 220, 41 #bitdepth 22 | Screen2text28 = 25, 41 #Play/Pause Indicator 23 | 24 | #configuration of the duration and playtime (textbox-) positions 25 | Screen2ActualPlaytimeText = 1, 54 26 | Screen2DurationText = 210, 54 27 | 28 | #config for Progress-Bar 29 | Screen2barwidth = 152 30 | Screen2barLineBorder = 'white' 31 | Screen2barLineFill = 'black' 32 | Screen2barLineX = 50 33 | Screen2barLineThick1 = 61 #difference between both = thickness 34 | Screen2barLineThick2 = 61 # 59 and 59 = 1 Pixel thick 35 | Screen2barBorder = 'white' 36 | Screen2barFill = 'black' 37 | Screen2barX = 50 38 | Screen2barThick1 = 59 #difference between both = thickness 39 | Screen2barThick2 = 63 # 56 and 62 = 6 Pixel thick 40 | Screen2barNibbleWidth = 2 41 | 42 | #config for Spectrum 43 | Screen2specDistance = 62 44 | Screen2specBorder = (80, 80, 80) 45 | Screen2specFill = (80, 80, 80) 46 | Screen2specWide1 = 2 47 | Screen2specWide2 = 0 48 | Screen2specYposTag = 61 49 | Screen2specYposNoTag = 61 50 | 51 | #config for Spectrum2 NoProgress 52 | Screen22specDistance = 0 53 | Screen22specBorder = (130, 130, 130) 54 | Screen22specFill = (130, 130, 130) 55 | Screen22specWide1 = 4 56 | Screen22specWide2 = 0 57 | Screen22specYposTag = 63 58 | Screen22specYposNoTag = 63 59 | 60 | #_______'No-Spectrum'_____________________________________________________ 61 | #Config TextPositions NowPlaying-/StandBy-Screen: 62 | Screen4text01 = 0, -4 #Artist 63 | Screen4text02 = 0, 16 #Title 64 | Screen4text06 = 132, 41 #format 65 | Screen4text07 = 163, 41 #samplerate 66 | Screen4text08 = 220, 41 #bitdepth 67 | Screen4text008 = 200, 41 #Webradio Bitrate 68 | Screen4Text0008 = 130, 41 #Weebradio Tracktype 69 | Screen4text28 = 120, 40 #Play/Pause Indicator 70 | Screen4text29 = 15, 41 #Volume Text 71 | Screen4text30 = 0, 39 #VolumeOn Symbol 72 | Screen4text31 = 0, 39 #VolumeOff Speaker symbol 73 | Screen4text32 = 54, 38 #VolumeOff Forbidden Symbol 74 | Screen4text33 = 88, 40 #repeat symbol 75 | Screen4text34 = 81, 41 #repeat once one 76 | Screen4text35 = 104, 40 #shuffle 77 | 78 | #"No Progress" 79 | Screen4text60 = 120, 50 #Play/Pause Indicator 80 | Screen4Text61 = 130, 51 #Weebradio Tracktype 81 | Screen4text62 = 200, 51 #Webradio Bitrate 82 | Screen4text63 = 88, 50 #repeat symbol 83 | Screen4text64 = 81, 51 #repeat once one 84 | Screen4text65 = 104, 50 #shuffle 85 | Screen4text66 = 0, 49 #VolumeOn Symbol 86 | Screen4text67 = 0, 49 #VolumeOff Speaker symbol 87 | Screen4text68 = 15, 51 #Volume Text 88 | 89 | #configuration of the duration and playtime (textbox-) positions 90 | Screen4ActualPlaytimeText = 1, 54 91 | Screen4DurationText = 210, 54 92 | 93 | #config for Progress-Bar 94 | Screen4barwidth = 152 95 | Screen4barLineBorder = 'white' 96 | Screen4barLineFill = 'black' 97 | Screen4barLineX = 50 98 | Screen4barLineThick1 = 59 #difference between both = thickness 99 | Screen4barLineThick2 = 59 # 59 and 59 = 1 Pixel thick 100 | Screen4barBorder = 'white' 101 | Screen4barFill = 'black' 102 | Screen4barX = 50 103 | Screen4barThick1 = 57 #difference between both = thickness 104 | Screen4barThick2 = 61 # 56 and 62 = 6 Pixel thick 105 | Screen4barNibbleWidth =2 106 | 107 | #_______'Modern'_____________________________________________________ 108 | #Config TextPositions NowPlaying-/StandBy-Screen: 109 | Screen5text01 = 0, 46 #Artist + Song 110 | Screen5text06 = 74, 39 #format 111 | Screen5text07 = 106, 39 #samplerate 112 | Screen5text08 = 156, 39 #bitdepth 113 | Screen5text28 = 96, 37 #Play/Pause Indicator 114 | 115 | #configuration of the duration and playtime (textbox-) positions 116 | Screen5ActualPlaytimeText = 1, 0 117 | Screen5DurationText = 220, 0 118 | 119 | #config for Progress-Bar 120 | Screen5barwidth = 256 121 | Screen5barLineBorder = 'white' 122 | Screen5barLineFill = 'white' 123 | Screen5barLineX = 0 124 | Screen5barLineThick1 = 32 #difference between both = thickness 125 | Screen5barLineThick2 = 32 # 59 and 59 = 1 Pixel thick 126 | Screen5barBorder = 'white' 127 | Screen5barFill = 'black' 128 | Screen5barX = 0 129 | Screen5barThick1 = 30 #difference between both = thickness 130 | Screen5barThick2 = 34 # 56 and 62 = 6 Pixel thick 131 | Screen5barNibbleWidth = 2 132 | 133 | #config for Spectrum 134 | Screen5specDistance = 1 135 | Screen5specBorder = (130, 130, 130) 136 | Screen5specFill = (130, 130, 130) 137 | Screen5specWide1 = 4 138 | Screen5specWide2 = 1 139 | Screen5specYposTag = 28 140 | Screen5specYposNoTag = 28 141 | 142 | #config for Spectrum2 NoProgress 143 | Screen55specDistance = 0 144 | Screen55specBorder = (130, 130, 130) 145 | Screen55specFill = (130, 130, 130) 146 | Screen55specWide1 = 4 147 | Screen55specWide2 = 1 148 | Screen55specYposTag = 33 149 | Screen55specYposNoTag = 33 150 | 151 | #config for leftVU 152 | Screen5leftVUDistance = 0 153 | Screen5leftVUBorder = (80, 80, 80) 154 | Screen5leftVUFill = (80, 80, 80) 155 | Screen5leftVUWide1 = 2 156 | Screen5leftVUWide2 = 0 157 | Screen5leftVUYpos1 = 39 158 | Screen5leftVUYpos2 = 45 159 | 160 | #config for leftVU NoProgress 161 | Screen55leftVUDistance = 0 162 | Screen55leftVUBorder = (80, 80, 80) 163 | Screen55leftVUFill = (80, 80, 80) 164 | Screen55leftVUWide1 = 2 165 | Screen55leftVUWide2 = 0 166 | Screen55leftVUYpos1 = 39 167 | Screen55leftVUYpos2 = 45 168 | 169 | #config for rightVU 170 | Screen5rightVUDistance = 255 171 | Screen5rightVUBorder = (80, 80, 80) 172 | Screen5rightVUFill = (80, 80, 80) 173 | Screen5rightVUWide1 = 2 174 | Screen5rightVUWide2 = 0 175 | Screen5rightVUYpos1 = 39 176 | Screen5rightVUYpos2 = 45 177 | 178 | #config for rightVU NoProgress 179 | Screen55rightVUDistance = 255 180 | Screen55rightVUBorder = (80, 80, 80) 181 | Screen55rightVUFill = (80, 80, 80) 182 | Screen55rightVUWide1 = 2 183 | Screen55rightVUWide2 = 0 184 | Screen55rightVUYpos1 = 39 185 | Screen55rightVUYpos2 = 45 186 | 187 | #_______'VU-Meter-2'_____________________________________________________ 188 | #Config TextPositions NowPlaying-/StandBy-Screen: 189 | Screen7text01 = 0, -2 #Artist +Titel 190 | Screen7text06 = 86, 14 #format 191 | #Screen7text07 = 109, 14 #samplerate 192 | #Screen7text08 = 156, 14 #bitdepth 193 | Screen7text28 = 74, 13 #Play/Pause Indicator 194 | 195 | #config for VU-Meter "Hand"/"Pointer" 196 | Screen7leftVUcoordinates = [(63, 160, 5, 59), (63, 160, 8, 57), (63, 160, 11, 55), (63, 160, 14, 53), (63, 160, 17, 52), (63, 160, 20, 51), (63, 160, 23, 49), (63, 160, 26, 47), (63, 160, 29, 46), (63, 160, 32, 45), (63, 160, 35, 44), (63, 160, 38, 43), (63, 160, 41, 43), (63, 160, 44, 42), (63, 160, 47, 42), (63, 160, 50, 41), (63, 160, 53, 40), (63, 160, 56, 40), (63, 160, 59, 40), (63, 160, 62, 40), (63, 160, 65, 41), (63, 160, 68, 41), (63, 160, 71, 41), (63, 160, 74, 41), (63, 160, 77, 42), (63, 160, 80, 42), (63, 160, 83, 43), (63, 160, 86, 43), (63, 160, 89, 44), (63, 160, 92, 44), (63, 160, 95, 45), (63, 160, 98, 45), (63, 160, 101, 46)] 197 | Screen7rightVUcoordinates = [(191, 160, 133, 59), (191, 160, 136, 57), (191, 160, 139, 55), (191, 160, 142, 53), (191, 160, 145, 52), (191, 160, 148, 51), (191, 160, 151, 49), (191, 160, 154, 47), (191, 160, 157, 46), (191, 160, 160, 45), (191, 160, 163, 44), (191, 160, 166, 43), (191, 160, 169, 43), (191, 160, 172, 42), (191, 160, 175, 42), (191, 160, 178, 41), (191, 160, 181, 40), (191, 160, 184, 40), (191, 160, 187, 40), (191, 160, 190, 40), (191, 160, 193, 41), (191, 160, 196, 41), (191, 160, 199, 41), (191, 160, 202, 41), (191, 160, 205, 42), (191, 160, 208, 42), (191, 160, 211, 43), (191, 160, 214, 43), (191, 160, 217, 44), (191, 160, 220, 44), (191, 160, 223, 45), (191, 160, 226, 45), (191, 160, 229, 45)] 198 | 199 | #configuration of the duration and playtime (textbox-) positions 200 | Screen7ActualPlaytimeText = 1, 14 201 | Screen7DurationText = 220, 14 202 | 203 | #config for Progress-Bar 204 | Screen7barwidth = 256 205 | Screen7barLineBorder = 'white' 206 | Screen7barLineFill = 'white' 207 | Screen7barLineX = 0 208 | Screen7barLineThick1 = 26 #difference between both = thickness 209 | Screen7barLineThick2 = 26 # 59 and 59 = 1 Pixel thick 210 | Screen7barBorder = 'white' 211 | Screen7barFill = 'black' 212 | Screen7barX = 0 213 | Screen7barThick1 = 24 #difference between both = thickness 214 | Screen7barThick2 = 28 # 56 and 62 = 6 Pixel thick 215 | Screen7barNibbleWidth = 2 216 | 217 | #_______'VU-Meter-Bar'_____________________________________________________ 218 | #Config TextPositions NowPlaying-/StandBy-Screen: 219 | Screen8text01 = 60, -4 #Artist 220 | Screen8text02 = 60, 11 #Title 221 | Screen8text11 = 60, -4 #Artist 222 | Screen8text22 = 60, 14 #Title 223 | Screen8text06 = 0, 2 #format 224 | Screen8text07 = 10, 16 #samplerate 225 | Screen8text08 = 22, 2 #bitdepth 226 | Screen8text28 = 1, 14 #Play/Pause Indicator 227 | 228 | #configuration of the duration and playtime (textbox-) positions 229 | Screen8ActualPlaytimeText = 0, 29 230 | Screen8DurationText = 219, 29 231 | 232 | #config for Progress-Bar 233 | Screen8barwidth = 172 234 | Screen8barLineBorder = 'white' 235 | Screen8barLineFill = 'white' 236 | Screen8barLineX = 40 237 | Screen8barLineThick1 = 34 #difference between both = thickness 238 | Screen8barLineThick2 = 34 # 59 and 59 = 1 Pixel thick 239 | Screen8barBorder = 'white' 240 | Screen8barFill = 'black' 241 | Screen8barX = 40 242 | Screen8barThick1 = 32 #difference between both = thickness 243 | Screen8barThick2 = 36 # 56 and 62 = 6 Pixel thick 244 | Screen8barNibbleWidth = 2 245 | 246 | #config for leftVU 247 | Screen8leftVUDistance = 22 #startpoint oft the VU from the left side of the screen 248 | Screen8leftVUWide1 = 7 #spacing/width of each value -> 32max value from cava * 7 = 224pixels width 249 | Screen8leftVUWide2 = 4 #width of each Value from cava -> Value <= Screen8leftVUWide1 -> results in Spaces between / Value >= Screen8leftVUWide1 -> continous Bar 250 | Screen8leftVUYpos1 = 40 251 | Screen8leftVUYpos2 = 46 252 | 253 | #config for rightVU 254 | Screen8rightVUDistance = 22 255 | Screen8rightVUWide1 = 7 256 | Screen8rightVUWide2 = 4 257 | Screen8rightVUYpos1 = 56 258 | Screen8rightVUYpos2 = 62 259 | 260 | #config for "Peak-Hold" 261 | Screen8fallingTime = 0.3 # lower = faster drop / higher = longer hold time 262 | Screen8PeakWidth = 2 # wdith of the peak indicator in pixels 263 | 264 | #config for gradient color of the VU 265 | Screen8specGradstart = 80 266 | Screen8specGradstop = 210 267 | Screen8specGradSamples = 32 268 | 269 | #___________________________________________________________________ 270 | #Config TextPositions Media-Library-Info-Screen: 271 | oledtext10 = 138, 2 #Number of Artists 272 | oledtext11 = 138, 15 #Number of Albums 273 | oledtext12 = 138, 28 #Number of Songs 274 | oledtext13 = 138, 41 #Summary of duration 275 | oledtext14 = 14, 2 #Text for Artists 276 | oledtext15 = 14, 15 #Text for Albums 277 | oledtext16 = 14, 28 #Text for Songs 278 | oledtext17 = 14, 41 #Text for duration 279 | oledtext18 = 134, 52 #Menu-Label Icon 280 | oledtext19 = 226, 54 #LibraryInfoIcon 281 | oledtext20 = 0, 2 #icon for Artists 282 | oledtext21 = 0, 15 #icon for Albums 283 | oledtext22 = 0, 28 #icon for Songs 284 | oledtext23 = 0, 41 #icon for duration 285 | 286 | #___________________________________________________________________ 287 | #configuration Menu-Screen: 288 | oledListEntrys = 4 289 | oledEmptyListText = 'no items..' 290 | oledEmptyListTextPosition = 0, 4 291 | oledListTextPosX = 2 292 | oledListTextPosY = 16 #height of each Entry (4x16 = 64) 293 | 294 | #___________________________________________________________________ 295 | #config for Text: 296 | oledArt = 'Interpreten :' #sets the Artists-text for the MediaLibrarayInfo 297 | oledAlb = 'Alben :' #sets the Albums-text for the MediaLibrarayInfo 298 | oledSon = 'Songs :' #sets the Songs-text for the MediaLibrarayInfo 299 | oledPla = 'Playtime :' #sets the Playtime-text for the MediaLibrarayInfo 300 | 301 | #___________________________________________________________________ 302 | #config for Icons: 303 | #entypo 304 | oledlibraryInfo = '\U0001F4D6' 305 | oledlibraryReturn = '\u2302' 306 | oledArtistIcon = '\uF0F3' 307 | oledAlbumIcon = '\uF2BB' 308 | oledSongIcon = '\U0000F001' 309 | oledPlaytimeIcon = '\U0000F1DA' 310 | oledplayIcon = '\u25B6' 311 | oledpauseIcon = '\u2389' 312 | 313 | #entypo 314 | oledrepeat = '\U0001F501' 315 | oledshuffle = '\U0001F500' 316 | #fa 317 | oledblockSymbol = '\uF05E' 318 | oledvolumeoff = '\uF026' 319 | oledvolumeon = '\uF028' 320 | 321 | #____________________________________________________________________ 322 | #config for Scrolling Text 323 | ArtistScrollSpeed = 1 324 | ArtistEndScrollMargin = 2 325 | SongScrollSpeed = 1 326 | SongEndScrollMargin = 2 327 | 328 | #Menu 329 | oledMenuHighlightColor = (255, 255, 255) 330 | oledMenuHighlightBackGround = (0, 0, 0) 331 | oledMenuNotSelectedColor = (80, 80, 80) 332 | oledMenuNotSelectedBackground = (0, 0, 0) 333 | -------------------------------------------------------------------------------- /ConfigurationFiles/ScreenConfig1351.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | #___________________________________________________________________ 4 | #config for boot- and shutdown-logo 5 | oledBootLogo = "volumio_logo.ppm" 6 | oledShutdownLogo = "shutdown.ppm" 7 | 8 | #___________________________________________________________________ 9 | #config for Clock/Standby: 10 | oledtext03 = 0, 2 #clock 11 | oledtext04 = 0, 113 #IP 12 | oledtext05 = 40, 30 #Date 13 | oledtext09 = 116, 118 #LibraryInfoIcon 14 | 15 | #_______'No-Spectrum'-Screen1_____________________________________________________ 16 | #Config TextPositions NowPlaying-/StandBy-Screen: 17 | Screen1text01 = 0, 2 #Artist 18 | Screen1text09 = 0, 22 #Album 19 | Screen1text02 = 0, 38 #Title 20 | Screen1text06 = 0, 89 #format 21 | Screen1text07 = 32, 89 #samplerate 22 | Screen1text08 = 90, 89 #bitdepth 23 | Screen1text28 = 46, 109 #Play/Pause Indicator 24 | 25 | #configuration of the duration and playtime (textbox-) positions 26 | Screen1ActualPlaytimeText = 0, 106 27 | Screen1DurationText = 88, 106 28 | 29 | #config for Progress-Bar 30 | Screen1barwidth = 128 31 | Screen1barLineBorder = (0, 255, 0) 32 | Screen1barLineFill = 'black' 33 | Screen1barLineX = 0 34 | Screen1barLineThick1 = 124 #difference between both = thickness 35 | Screen1barLineThick2 = 125 # 59 and 59 = 1 Pixel thick 36 | Screen1barBorder = (0, 255, 0) 37 | Screen1barFill = (0, 255, 0) 38 | Screen1barX = 0 39 | Screen1barThick1 = 122 #difference between both = thickness 40 | Screen1barThick2 = 127 # 56 and 62 = 6 Pixel thick 41 | Screen1barNibbleWidth = 3 42 | 43 | #_______'No-Spectrum'-Screen2_____________________________________________________ 44 | #Config TextPositions NowPlaying-/StandBy-Screen: 45 | Screen2text01 = 0, 2 #Artist 46 | Screen2text02 = 0, 89 #Title 47 | Screen2text06 = 0, 41 #format 48 | Screen2text07 = 32, 41 #samplerate 49 | Screen2text08 = 90, 41 #bitdepth 50 | Screen2text28 = 46, 109 #Play/Pause Indicator 51 | 52 | #configuration of the duration and playtime (textbox-) positions 53 | Screen2ActualPlaytimeText = 0, 106 54 | Screen2DurationText = 88, 106 55 | 56 | #config for Progress-Bar 57 | Screen2barwidth = 128 58 | Screen2barLineBorder = (0, 255, 0) 59 | Screen2barLineFill = 'black' 60 | Screen2barLineX = 0 61 | Screen2barLineThick1 = 124 #difference between both = thickness 62 | Screen2barLineThick2 = 125 # 59 and 59 = 1 Pixel thick 63 | Screen2barBorder = (0, 255, 0) 64 | Screen2barFill = (0, 255, 0) 65 | Screen2barX = 0 66 | Screen2barThick1 = 122 #difference between both = thickness 67 | Screen2barThick2 = 127 # 56 and 62 = 6 Pixel thick 68 | Screen2barNibbleWidth = 3 69 | 70 | #_______Spectrum-Center_Screen3_____________________________________ 71 | #Config TextPositions NowPlaying-/StandBy-Screen: 72 | Screen3text01 = 0, 2 #Artist 73 | Screen3text02 = 0, 26 #Title 74 | Screen3text06 = 0, 50 #format 75 | Screen3text07 = 32, 38 #samplerate 76 | Screen3text08 = 90, 38 #bitdepth 77 | Screen3text28 = 46, 109 #Play/Pause Indicator 78 | 79 | #configuration of the duration and playtime (textbox-) positions 80 | Screen3ActualPlaytimeText = 0, 106 81 | Screen3DurationText = 88, 106 82 | 83 | #config for Progress-Bar 84 | Screen3barwidth = 128 85 | Screen3barLineBorder = (0, 255, 0) 86 | Screen3barLineFill = 'black' 87 | Screen3barLineX = 0 88 | Screen3barLineThick1 = 124 #difference between both = thickness 89 | Screen3barLineThick2 = 125 # 59 and 59 = 1 Pixel thick 90 | Screen3barBorder = (0, 255, 0) 91 | Screen3barFill = (0, 255, 0) 92 | Screen3barX = 0 93 | Screen3barThick1 = 122 #difference between both = thickness 94 | Screen3barThick2 = 127 # 56 and 62 = 6 Pixel thick 95 | Screen3barNibbleWidth = 3 96 | 97 | #config for Spectrum 98 | Screen3specDistance = 0 99 | Screen3specWide1 = 2 100 | Screen3specWide2 = 0 101 | Screen3specYposTag = 104 102 | Screen3specYposNoTag = 104 103 | 104 | #config for Spectrum2 NoProgress 105 | Screen33specDistance = 0 106 | Screen33specWide1 = 2 107 | Screen33specWide2 = 0 108 | Screen33specYposTag = 127 109 | Screen33specYposNoTag = 127 110 | 111 | #___________________________________________________________________ 112 | #Config TextPositions Media-Library-Info-Screen: 113 | oledtext10 = 80, 2 #Number of Artists 114 | oledtext11 = 80, 15 #Number of Albums 115 | oledtext12 = 80, 28 #Number of Songs 116 | oledtext13 = 80, 41 #Summary of duration 117 | oledtext14 = 14, 2 #Text for Artists 118 | oledtext15 = 14, 15 #Text for Albums 119 | oledtext16 = 14, 28 #Text for Songs 120 | oledtext17 = 14, 41 #Text for duration 121 | oledtext18 = 60, 52 #Menu-Label Icon 122 | oledtext19 = 120, 116 #LibraryInfoIcon 123 | oledtext20 = 0, 5 #icon for Artists 124 | oledtext21 = 0, 18 #icon for Albums 125 | oledtext22 = 0, 31 #icon for Songs 126 | oledtext23 = 0, 44 #icon for duration 127 | 128 | #___________________________________________________________________ 129 | #configuration Menu-Screen: 130 | oledListEntrys = 8 131 | oledEmptyListText = 'no items..' 132 | oledEmptyListTextPosition = 0, 4 133 | oledListTextPosX = 0 134 | oledListTextPosY = 16 #height of each Entry (4x16 = 64) 135 | 136 | #___________________________________________________________________ 137 | #config for Text: 138 | oledArt = 'Interpreten :' #sets the Artists-text for the MediaLibrarayInfo 139 | oledAlb = 'Alben :' #sets the Albums-text for the MediaLibrarayInfo 140 | oledSon = 'Songs :' #sets the Songs-text for the MediaLibrarayInfo 141 | oledPla = 'Playtime :' #sets the Playtime-text for the MediaLibrarayInfo 142 | 143 | #___________________________________________________________________ 144 | #config for Icons: 145 | oledlibraryInfo = '\U0001F4D6' 146 | oledlibraryReturn = '\u2302' 147 | oledArtistIcon = '\uF0F3' 148 | oledAlbumIcon = '\uF2BB' 149 | oledSongIcon = '\U0000F001' 150 | oledPlaytimeIcon = '\U0000F1DA' 151 | oledplayIcon = '\u25B6' 152 | oledpauseIcon = '\u2389' 153 | 154 | #____________________________________________________________________ 155 | #config for Scrolling Text 156 | ArtistScrollSpeed = 1 157 | ArtistEndScrollMargin = 2 158 | SongScrollSpeed = 1 159 | SongEndScrollMargin = 2 160 | AlbumScrollSpeed = 1 161 | AlbumEndScrollMargin = 2 162 | SpecsScrollSpeed = 1 163 | SpecsEndScrollMargin = 2 164 | 165 | #Menu 166 | oledMenuHighlightColor = (0, 255, 0) 167 | oledMenuHighlightBackGround = (0, 0, 0) 168 | oledMenuNotSelectedColor = (100, 100, 100) 169 | oledMenuNotSelectedBackground = (0, 0, 0) 170 | -------------------------------------------------------------------------------- /ConfigurationFiles/ScreenConfig7735.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | #___________________________________________________________________ 4 | #config for boot- and shutdown-logo 5 | oledBootLogo = "st7735start.bmp" 6 | oledShutdownLogo = "st7735stop.bmp" 7 | 8 | #___________________________________________________________________ 9 | #config for Clock/Standby: 10 | oledtext03 = 0, 2 #clock 11 | oledtext04 = 0, 113 #IP 12 | oledtext05 = 56, 40 #Date 13 | oledtext09 = 150, 117 #LibraryInfoIcon 14 | 15 | #_______'No-Spectrum'-Screen1_____________________________________________________ 16 | #Config TextPositions NowPlaying-/StandBy-Screen: 17 | Screen1text01 = 0, 2 #Artist 18 | Screen1text09 = 0, 22 #Album 19 | Screen1text02 = 0, 38 #Title 20 | Screen1text06 = 0, 89 #format 21 | Screen1text07 = 32, 89 #samplerate 22 | Screen1text08 = 90, 89 #bitdepth 23 | Screen1text28 = 46, 109 #Play/Pause Indicator 24 | 25 | #configuration of the duration and playtime (textbox-) positions 26 | Screen1ActualPlaytimeText = 0, 106 27 | Screen1DurationText = 88, 106 28 | 29 | #config for Progress-Bar 30 | Screen1barwidth = 160 31 | Screen1barLineBorder = (0, 255, 0) 32 | Screen1barLineFill = 'black' 33 | Screen1barLineX = 0 34 | Screen1barLineThick1 = 124 #difference between both = thickness 35 | Screen1barLineThick2 = 125 # 59 and 59 = 1 Pixel thick 36 | Screen1barBorder = (0, 255, 0) 37 | Screen1barFill = (0, 255, 0) 38 | Screen1barX = 0 39 | Screen1barThick1 = 122 #difference between both = thickness 40 | Screen1barThick2 = 127 # 56 and 62 = 6 Pixel thick 41 | Screen1barNibbleWidth = 3 42 | 43 | #_______'No-Spectrum'-Screen2_____________________________________________________ 44 | #Config TextPositions NowPlaying-/StandBy-Screen: 45 | Screen2text01 = 0, 2 #Artist 46 | Screen2text02 = 0, 89 #Title 47 | Screen2text06 = 0, 41 #format 48 | Screen2text07 = 32, 41 #samplerate 49 | Screen2text08 = 90, 41 #bitdepth 50 | Screen2text28 = 46, 109 #Play/Pause Indicator 51 | 52 | #configuration of the duration and playtime (textbox-) positions 53 | Screen2ActualPlaytimeText = 0, 106 54 | Screen2DurationText = 88, 106 55 | 56 | #config for Progress-Bar 57 | Screen2barwidth = 160 58 | Screen2barLineBorder = (0, 255, 0) 59 | Screen2barLineFill = 'black' 60 | Screen2barLineX = 0 61 | Screen2barLineThick1 = 124 #difference between both = thickness 62 | Screen2barLineThick2 = 125 # 59 and 59 = 1 Pixel thick 63 | Screen2barBorder = (0, 255, 0) 64 | Screen2barFill = (0, 255, 0) 65 | Screen2barX = 0 66 | Screen2barThick1 = 122 #difference between both = thickness 67 | Screen2barThick2 = 127 # 56 and 62 = 6 Pixel thick 68 | Screen2barNibbleWidth = 3 69 | 70 | #_______Spectrum-Center_Screen3_____________________________________ 71 | #Config TextPositions NowPlaying-/StandBy-Screen: 72 | Screen3text01 = 0, 2 #Artist 73 | Screen3text02 = 0, 26 #Title 74 | Screen3text06 = 0, 50 #format 75 | Screen3text07 = 32, 38 #samplerate 76 | Screen3text08 = 90, 38 #bitdepth 77 | Screen3text28 = 46, 109 #Play/Pause Indicator 78 | 79 | #configuration of the duration and playtime (textbox-) positions 80 | Screen3ActualPlaytimeText = 0, 106 81 | Screen3DurationText = 120, 106 82 | 83 | #config for Progress-Bar 84 | Screen3barwidth = 160 85 | Screen3barLineBorder = (0, 255, 0) 86 | Screen3barLineFill = 'black' 87 | Screen3barLineX = 0 88 | Screen3barLineThick1 = 124 #difference between both = thickness 89 | Screen3barLineThick2 = 125 # 59 and 59 = 1 Pixel thick 90 | Screen3barBorder = (0, 255, 0) 91 | Screen3barFill = (0, 255, 0) 92 | Screen3barX = 0 93 | Screen3barThick1 = 122 #difference between both = thickness 94 | Screen3barThick2 = 127 # 56 and 62 = 6 Pixel thick 95 | Screen3barNibbleWidth = 3 96 | 97 | #config for Spectrum 98 | Screen3specDistance = 16 99 | Screen3specWide1 = 2 100 | Screen3specWide2 = 0 101 | Screen3specYposTag = 104 102 | Screen3specYposNoTag = 104 103 | 104 | #config for Spectrum2 NoProgress 105 | Screen33specDistance = 16 106 | Screen33specWide1 = 2 107 | Screen33specWide2 = 0 108 | Screen33specYposTag = 127 109 | Screen33specYposNoTag = 127 110 | 111 | #___________________________________________________________________ 112 | #Config TextPositions Media-Library-Info-Screen: 113 | oledtext10 = 80, 2 #Number of Artists 114 | oledtext11 = 80, 15 #Number of Albums 115 | oledtext12 = 80, 28 #Number of Songs 116 | oledtext13 = 80, 41 #Summary of duration 117 | oledtext14 = 14, 2 #Text for Artists 118 | oledtext15 = 14, 15 #Text for Albums 119 | oledtext16 = 14, 28 #Text for Songs 120 | oledtext17 = 14, 41 #Text for duration 121 | oledtext18 = 60, 52 #Menu-Label Icon 122 | oledtext19 = 152, 118 #LibraryInfoIcon 123 | oledtext20 = 0, 5 #icon for Artists 124 | oledtext21 = 0, 18 #icon for Albums 125 | oledtext22 = 0, 31 #icon for Songs 126 | oledtext23 = 0, 44 #icon for duration 127 | 128 | #___________________________________________________________________ 129 | #configuration Menu-Screen: 130 | oledListEntrys = 8 131 | oledEmptyListText = 'no items..' 132 | oledEmptyListTextPosition = 0, 4 133 | oledListTextPosX = 0 134 | oledListTextPosY = 16 #height of each Entry (4x16 = 64) 135 | 136 | #___________________________________________________________________ 137 | #config for Text: 138 | oledArt = 'Interpreten :' #sets the Artists-text for the MediaLibrarayInfo 139 | oledAlb = 'Alben :' #sets the Albums-text for the MediaLibrarayInfo 140 | oledSon = 'Songs :' #sets the Songs-text for the MediaLibrarayInfo 141 | oledPla = 'Playtime :' #sets the Playtime-text for the MediaLibrarayInfo 142 | 143 | #___________________________________________________________________ 144 | #config for Icons: 145 | oledlibraryInfo = '\U0001F4D6' 146 | oledlibraryReturn = '\u2302' 147 | oledArtistIcon = '\uF0F3' 148 | oledAlbumIcon = '\uF2BB' 149 | oledSongIcon = '\U0000F001' 150 | oledPlaytimeIcon = '\U0000F1DA' 151 | oledplayIcon = '\u25B6' 152 | oledpauseIcon = '\u2389' 153 | 154 | #____________________________________________________________________ 155 | #config for Scrolling Text 156 | ArtistScrollSpeed = 1 157 | ArtistEndScrollMargin = 2 158 | SongScrollSpeed = 1 159 | SongEndScrollMargin = 2 160 | AlbumScrollSpeed = 1 161 | AlbumEndScrollMargin = 2 162 | SpecsScrollSpeed = 1 163 | SpecsEndScrollMargin = 2 164 | 165 | #Menu 166 | oledMenuHighlightColor = (0, 255, 0) 167 | oledMenuHighlightBackGround = (0, 0, 0) 168 | oledMenuNotSelectedColor = (100, 100, 100) 169 | oledMenuNotSelectedBackground = (0, 0, 0) -------------------------------------------------------------------------------- /ConfigurationFiles/ScreenConfigBraun.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | #___________________________________________________________________ 4 | #config for boot- and shutdown-logo 5 | oledBootLogo = "volumio_logo.ppm" 6 | oledShutdownLogo = "shutdown.ppm" 7 | 8 | #___________________________________________________________________ok 9 | #config for Clock/Standby: 10 | oledtext03 = 59, 4 #clock 11 | oledtext04 = 34, 52 #IP 12 | oledtext05 = 169, 52 #Date 13 | oledtext09 = 236, 51 #LibraryInfoIcon 14 | 15 | #_______'Spectrum-Center'_____________________________________________________ 16 | #Config TextPositions NowPlaying-/StandBy-Screen: 17 | Screen2text01 = 35, -4 #Artist 18 | Screen2text02 = 35, 16 #Title 19 | Screen2text06 = 35, 41 #format 20 | Screen2text07 = 151, 41 #samplerate 21 | Screen2text08 = 212, 41 #bitdepth 22 | Screen2text28 = 59, 41 #Play/Pause Indicator 23 | 24 | #configuration of the duration and playtime (textbox-) positions 25 | Screen2ActualPlaytimeText = 35, 54 26 | Screen2DurationText = 205, 54 27 | 28 | #config for Progress-Bar 29 | Screen2barwidth = 128 30 | Screen2barLineBorder = 'white' 31 | Screen2barLineFill = 'black' 32 | Screen2barLineX = 76 33 | Screen2barLineThick1 = 61 #difference between both = thickness 34 | Screen2barLineThick2 = 61 # 59 and 59 = 1 Pixel thick 35 | Screen2barBorder = 'white' 36 | Screen2barFill = 'black' 37 | Screen2barX = 76 38 | Screen2barThick1 = 59 #difference between both = thickness 39 | Screen2barThick2 = 63 # 56 and 62 = 6 Pixel thick 40 | Screen2barNibbleWidth = 2 41 | 42 | #config for Spectrum 43 | Screen2specDistance = 76 44 | Screen2specBorder = (80, 80, 80) 45 | Screen2specFill = (80, 80, 80) 46 | Screen2specWide1 = 2 47 | Screen2specWide2 = 0 48 | Screen2specYposTag = 61 49 | Screen2specYposNoTag = 61 50 | 51 | #config for Spectrum2 NoProgress 52 | Screen22specDistance = 34 53 | Screen22specBorder = (130, 130, 130) 54 | Screen22specFill = (130, 130, 130) 55 | Screen22specWide1 = 3 56 | Screen22specWide2 = 0 57 | Screen22specYposTag = 63 58 | Screen22specYposNoTag = 63 59 | 60 | #_______'No-Spectrum'_____________________________________________________ 61 | #Config TextPositions NowPlaying-/StandBy-Screen: 62 | Screen4text01 = 34, 2 #Artist 63 | Screen4text02 = 34, 22 #Title 64 | Screen4text06 = 45, 41 #format 65 | Screen4text07 = 80, 41 #samplerate 66 | Screen4text08 = 210, 41 #bitdepth 67 | Screen4text28 = 35, 41 #Play/Pause Indicator 68 | 69 | #configuration of the duration and playtime (textbox-) positions 70 | Screen4ActualPlaytimeText = 35, 54 71 | Screen4DurationText = 205, 54 72 | 73 | #config for Progress-Bar 74 | Screen4barwidth = 128 75 | Screen4barLineBorder = 'white' 76 | Screen4barLineFill = 'black' 77 | Screen4barLineX = 76 78 | Screen4barLineThick1 = 59 #difference between both = thickness 79 | Screen4barLineThick2 = 59 # 59 and 59 = 1 Pixel thick 80 | Screen4barBorder = 'white' 81 | Screen4barFill = 'black' 82 | Screen4barX = 76 83 | Screen4barThick1 = 57 #difference between both = thickness 84 | Screen4barThick2 = 61 # 56 and 62 = 6 Pixel thick 85 | Screen4barNibbleWidth =2 86 | 87 | #_______'Modern'_____________________________________________________ 88 | #Config TextPositions NowPlaying-/StandBy-Screen: 89 | Screen5text01 = 35, 51 #Artist 90 | Screen5text02 = 35, 51 #Title 91 | Screen5text012 = 35, 0 #Artist 92 | Screen5text022 = 35, 19 #Title 93 | Screen5text06 = 91, 39 #format 94 | Screen5text07 = 123, 39 #samplerate 95 | Screen5text08 = 163, 39 #bitdepth 96 | Screen5text28 = 113, 37 #Play/Pause Indicator 97 | 98 | #configuration of the duration and playtime (textbox-) positions 99 | Screen5ActualPlaytimeText = 35, 0 100 | Screen5DurationText = 207, 0 101 | 102 | #config for Progress-Bar 103 | Screen5barwidth = 208 104 | Screen5barLineBorder = 'white' 105 | Screen5barLineFill = 'white' 106 | Screen5barLineX = 34 107 | Screen5barLineThick1 = 32 #difference between both = thickness 108 | Screen5barLineThick2 = 32 # 59 and 59 = 1 Pixel thick 109 | Screen5barBorder = 'white' 110 | Screen5barFill = 'black' 111 | Screen5barX = 34 112 | Screen5barThick1 = 30 #difference between both = thickness 113 | Screen5barThick2 = 34 # 56 and 62 = 6 Pixel thick 114 | Screen5barNibbleWidth = 2 115 | 116 | #config for Spectrum 117 | Screen5specDistance = 34 118 | Screen5specBorder = (130, 130, 130) 119 | Screen5specFill = (130, 130, 130) 120 | Screen5specWide1 = 3.3 121 | Screen5specWide2 = 0 122 | Screen5specYposTag = 28 123 | Screen5specYposNoTag = 28 124 | 125 | #config for Spectrum2 NoProgress 126 | Screen55specDistance = 35 127 | Screen55specBorder = (130, 130, 130) 128 | Screen55specFill = (130, 130, 130) 129 | Screen55specWide1 = 3.5 130 | Screen55specWide2 = 1 131 | Screen55specYposTag = 33 132 | Screen55specYposNoTag = 33 133 | 134 | #config for leftVU 135 | Screen5leftVUDistance = 35 136 | Screen5leftVUBorder = (80, 80, 80) 137 | Screen5leftVUFill = (80, 80, 80) 138 | Screen5leftVUWide1 = 1.5 139 | Screen5leftVUWide2 = 0 140 | Screen5leftVUYpos1 = 38 141 | Screen5leftVUYpos2 = 45 142 | 143 | #config for leftVU NoProgress 144 | Screen55leftVUDistance = 35 145 | Screen55leftVUBorder = (80, 80, 80) 146 | Screen55leftVUFill = (80, 80, 80) 147 | Screen55leftVUWide1 = 1.5 148 | Screen55leftVUWide2 = 0 149 | Screen55leftVUYpos1 = 38 150 | Screen55leftVUYpos2 = 45 151 | 152 | #config for rightVU 153 | Screen5rightVUDistance = 241 154 | Screen5rightVUBorder = (80, 80, 80) 155 | Screen5rightVUFill = (80, 80, 80) 156 | Screen5rightVUWide1 = 1.5 157 | Screen5rightVUWide2 = 0 158 | Screen5rightVUYpos1 = 38 159 | Screen5rightVUYpos2 = 45 160 | 161 | #config for rightVU NoProgress 162 | Screen55rightVUDistance = 241 163 | Screen55rightVUBorder = (80, 80, 80) 164 | Screen55rightVUFill = (80, 80, 80) 165 | Screen55rightVUWide1 = 1.5 166 | Screen55rightVUWide2 = 0 167 | Screen55rightVUYpos1 = 38 168 | Screen55rightVUYpos2 = 45 169 | 170 | #_______'VU-Meter-2'_____________________________________________________ 171 | #Config TextPositions NowPlaying-/StandBy-Screen: 172 | Screen7text01 = 35, 0 #Artist 173 | Screen7text02 = 35, 14 #Title 174 | Screen7text012 = 35, 0 #Artist 175 | Screen7text022 = 35, 19 #Title 176 | Screen7text06 = 78, 14 #format 177 | Screen7text07 = 101, 14 #samplerate 178 | Screen7text08 = 148, 14 #bitdepth 179 | Screen7text28 = 66, 13 #Play/Pause Indicator 180 | 181 | #config for VU-Meter "Hand"/"Pointer" 182 | Screen7leftVUcoordinates = [(105, 160, 5, 59), (105, 160, 8, 57), (105, 160, 11, 55), (105, 160, 14, 53), (105, 160, 17, 52), (105, 160, 20, 51), (105, 160, 23, 49), (105, 160, 26, 47), (105, 160, 29, 46), (105, 160, 32, 45), (105, 160, 35, 44), (105, 160, 38, 43), (105, 160, 41, 43), (105, 160, 44, 42), (105, 160, 47, 42), (105, 160, 50, 41), (105, 160, 53, 40), (105, 160, 56, 40), (105, 160, 59, 40), (105, 160, 62, 40), (105, 160, 65, 41), (105, 160, 68, 41), (105, 160, 71, 41), (105, 160, 74, 41), (105, 160, 77, 42), (105, 160, 80, 42), (105, 160, 83, 43), (105, 160, 86, 43), (105, 160, 89, 44), (105, 160, 92, 44), (105, 160, 95, 45), (105, 160, 98, 45), (105, 160, 101, 46)] 183 | Screen7rightVUcoordinates = [(191, 160, 133, 59), (191, 160, 136, 57), (191, 160, 139, 55), (191, 160, 142, 53), (191, 160, 145, 52), (191, 160, 148, 51), (191, 160, 151, 49), (191, 160, 154, 47), (191, 160, 157, 46), (191, 160, 160, 45), (191, 160, 1105, 44), (191, 160, 166, 43), (191, 160, 169, 43), (191, 160, 172, 42), (191, 160, 175, 42), (191, 160, 178, 41), (191, 160, 181, 40), (191, 160, 184, 40), (191, 160, 187, 40), (191, 160, 190, 40), (191, 160, 193, 41), (191, 160, 196, 41), (191, 160, 199, 41), (191, 160, 202, 41), (191, 160, 205, 42), (191, 160, 208, 42), (191, 160, 211, 43), (191, 160, 214, 43), (191, 160, 217, 44), (191, 160, 220, 44), (191, 160, 223, 45), (191, 160, 226, 45), (191, 160, 229, 45)] 184 | 185 | #configuration of the duration and playtime (textbox-) positions 186 | Screen7ActualPlaytimeText = 35, 14 187 | Screen7DurationText = 207, 14 188 | 189 | #config for Progress-Bar 190 | Screen7barwidth = 208 191 | Screen7barLineBorder = 'white' 192 | Screen7barLineFill = 'white' 193 | Screen7barLineX = 34 194 | Screen7barLineThick1 = 26 #difference between both = thickness 195 | Screen7barLineThick2 = 26 # 59 and 59 = 1 Pixel thick 196 | Screen7barBorder = 'white' 197 | Screen7barFill = 'black' 198 | Screen7barX = 34 199 | Screen7barThick1 = 24 #difference between both = thickness 200 | Screen7barThick2 = 28 # 56 and 62 = 6 Pixel thick 201 | Screen7barNibbleWidth = 2 202 | 203 | #_______'VU-Meter-Bar'_____________________________________________________ 204 | #Config TextPositions NowPlaying-/StandBy-Screen: 205 | Screen8text01 = 96, 0 #Artist 206 | Screen8text02 = 96, 16 #Title 207 | Screen8text012 = 35, 0 #Artist 208 | Screen8text022 = 35, 19 #Title 209 | Screen8text06 = 35, 2 #format 210 | Screen8text07 = 44, 16 #samplerate 211 | Screen8text08 = 56, 2 #bitdepth 212 | Screen8text28 = 35, 14 #Play/Pause Indicator 213 | 214 | #configuration of the duration and playtime (textbox-) positions 215 | Screen8ActualPlaytimeText = 35, 29 216 | Screen8DurationText = 207, 29 217 | 218 | #config for Progress-Bar 219 | Screen8barwidth = 130 220 | Screen8barLineBorder = 'white' 221 | Screen8barLineFill = 'white' 222 | Screen8barLineX = 82 223 | Screen8barLineThick1 = 34 #difference between both = thickness 224 | Screen8barLineThick2 = 34 # 59 and 59 = 1 Pixel thick 225 | Screen8barBorder = 'white' 226 | Screen8barFill = 'black' 227 | Screen8barX = 82 228 | Screen8barThick1 = 32 #difference between both = thickness 229 | Screen8barThick2 = 36 # 56 and 62 = 6 Pixel thick 230 | Screen8barNibbleWidth = 2 231 | 232 | #config for leftVU 233 | Screen8leftVUDistance = 64 #startpoint oft the VU from the left side of the screen 234 | Screen8leftVUWide1 = 6.7 #spacing/width of each value -> 32max value from cava * 7 = 224pixels width 235 | Screen8leftVUWide2 = 4 #width of each Value from cava -> Value <= Screen8leftVUWide1 -> results in Spaces between / Value >= Screen8leftVUWide1 -> continous Bar 236 | Screen8leftVUYpos1 = 40 237 | Screen8leftVUYpos2 = 46 238 | 239 | #config for rightVU 240 | Screen8rightVUDistance = 64 241 | Screen8rightVUWide1 = 6.7 242 | Screen8rightVUWide2 = 4 243 | Screen8rightVUYpos1 = 56 244 | Screen8rightVUYpos2 = 62 245 | 246 | #config for "Peak-Hold" 247 | Screen8fallingTime = 0.3 # lower = faster drop / higher = longer hold time 248 | Screen8PeakWidth = 2 # wdith of the peak indicator in pixels 249 | 250 | #config for gradient color of the VU 251 | Screen8specGradstart = 80 252 | Screen8specGradstop = 210 253 | Screen8specGradSamples = 32 254 | 255 | #___________________________________________________________________ 256 | #Config TextPositions Media-Library-Info-Screen: 257 | oledtext10 = 180, 2 #Number of Artists 258 | oledtext11 = 180, 15 #Number of Albums 259 | oledtext12 = 180, 28 #Number of Songs 260 | oledtext13 = 180, 41 #Summary of duration 261 | oledtext14 = 56, 2 #Text for Artists 262 | oledtext15 = 56, 15 #Text for Albums 263 | oledtext16 = 56, 28 #Text for Songs 264 | oledtext17 = 56, 41 #Text for duration 265 | oledtext18 = 176, 52 #Menu-Label Icon 266 | oledtext19 = 237, 54 #LibraryInfoIcon 267 | oledtext20 = 42, 2 #icon for Artists 268 | oledtext21 = 42, 15 #icon for Albums 269 | oledtext22 = 42, 28 #icon for Songs 270 | oledtext23 = 42, 41 #icon for duration 271 | 272 | #___________________________________________________________________ 273 | #configuration Menu-Screen: 274 | oledListEntrys = 4 275 | oledEmptyListText = 'no items..' 276 | oledEmptyListTextPosition = 42, 4 277 | oledListTextPosX = 44 278 | oledListTextPosY = 16 #height of each Entry (4x16 = 64) 279 | 280 | #___________________________________________________________________ 281 | #config for Text: 282 | oledArt = 'Interpreten :' #sets the Artists-text for the MediaLibrarayInfo 283 | oledAlb = 'Alben :' #sets the Albums-text for the MediaLibrarayInfo 284 | oledSon = 'Songs :' #sets the Songs-text for the MediaLibrarayInfo 285 | oledPla = 'Playtime :' #sets the Playtime-text for the MediaLibrarayInfo 286 | 287 | #___________________________________________________________________ 288 | #config for Icons: 289 | oledlibraryInfo = '\U0001F4D6' 290 | oledlibraryReturn = '\u2302' 291 | oledArtistIcon = '\uF0F3' 292 | oledAlbumIcon = '\uF2BB' 293 | oledSongIcon = '\U0000F001' 294 | oledPlaytimeIcon = '\U0000F1DA' 295 | oledplayIcon = '\u25B6' 296 | oledpauseIcon = '\u2389' 297 | 298 | #____________________________________________________________________ 299 | #config for Scrolling Text 300 | ArtistScrollSpeed = 1 301 | ArtistEndScrollMargin = 2 302 | SongScrollSpeed = 1 303 | SongEndScrollMargin = 2 304 | 305 | #Menu 306 | oledMenuHighlightColor = (255, 255, 255) 307 | oledMenuHighlightBackGround = (0, 0, 0) 308 | oledMenuNotSelectedColor = (80, 80, 80) 309 | oledMenuNotSelectedBackground = (0, 0, 0) 310 | 311 | #Menu 312 | oledMenuHighlightColor = (255, 255, 255) 313 | oledMenuHighlightBackGround = (0, 0, 0) 314 | oledMenuNotSelectedColor = (80, 80, 80) 315 | oledMenuNotSelectedBackground = (0, 0, 0) -------------------------------------------------------------------------------- /ConfigurationFiles/cava1/config: -------------------------------------------------------------------------------- 1 | ## Configuration file for CAVA. Default values are commented out. Use either ';' or '#' for commenting. 2 | 3 | 4 | [general] 5 | 6 | # Smoothing mode. Can be 'normal', 'scientific' or 'waves'. DEPRECATED as of 0.6.0 7 | mode = normal 8 | 9 | # Accepts only non-negative values. 10 | framerate = 20 11 | 12 | # 'autosens' will attempt to decrease sensitivity if the bars peak. 1 = on, 0 = off 13 | # new as of 0.6.0 autosens of low values (dynamic range) 14 | # 'overshoot' allows bars to overshoot (in % of terminal height) without initiating autosens. DEPRECATED as of 0.6.0 15 | ; autosens = 1 16 | ; overshoot = 20 17 | 18 | # Manual sensitivity in %. Autosens must be turned off for this to take effect. 19 | # 200 means double height. Accepts only non-negative values. 20 | ; sensitivity = 100 21 | 22 | # The number of bars (0-200). 0 sets it to auto (fill up console). 23 | # Bars' width and space between bars in number of characters. 24 | bars = 64 25 | ; bar_width = 2 26 | ; bar_spacing = 1 27 | 28 | 29 | # Lower and higher cutoff frequencies for lowest and highest bars 30 | # the bandwidth of the visualizer. 31 | # Note: there is a minimum total bandwidth of 43Mhz x number of bars. 32 | # Cava will automatically increase the higher cutoff if a too low band is specified. 33 | lower_cutoff_freq = 30 34 | higher_cutoff_freq = 20000 35 | 36 | 37 | # Seconds with no input before cava goes to sleep mode. Cava will not perform FFT or drawing and 38 | # only check for input once per second. Cava will wake up once input is detected. 0 = disable. 39 | sleep_timer = 0 40 | 41 | 42 | [input] 43 | 44 | # Audio capturing method. Possible methods are: 'pulse', 'alsa', 'fifo', 'sndio' or 'shmem' 45 | # Defaults to 'pulse', 'alsa' or 'fifo', in that order, dependent on what support cava was built with. 46 | # 47 | # All input methods uses the same config variable 'source' 48 | # to define where it should get the audio. 49 | # 50 | # For pulseaudio 'source' will be the source. Default: 'auto', which uses the monitor source of the default sink 51 | # (all pulseaudio sinks(outputs) have 'monitor' sources(inputs) associated with them). 52 | # 53 | # For alsa 'source' will be the capture device. 54 | # For fifo 'source' will be the path to fifo-file. 55 | # For shmem 'source' will be /squeezelite-AA:BB:CC:DD:EE:FF where 'AA:BB:CC:DD:EE:FF' will be squeezelite's MAC address 56 | ; method = pulse 57 | ; source = auto 58 | 59 | ; method = alsa 60 | ; source = hw:Loopback,1 61 | 62 | method = fifo 63 | source = /tmp/mpd.fifo 64 | ; sample_rate = 44100 65 | ; sample_bits = 16 66 | 67 | ; method = shmem 68 | ; source = /squeezelite-AA:BB:CC:DD:EE:FF 69 | 70 | ; method = portaudio 71 | ; source = auto 72 | 73 | 74 | [output] 75 | 76 | # Output method. Can be 'ncurses', 'noncurses' or 'raw'. 77 | # 'noncurses' uses a custom framebuffer technique and draws only changes 78 | # from frame to frame. 'ncurses' is default if supported 79 | # 80 | # 'raw' is an 8 or 16 bit (configurable via the 'bit_format' option) data 81 | # stream of the bar heights that can be used to send to other applications. 82 | # 'raw' defaults to 200 bars, which can be adjusted in the 'bars' option above. 83 | method = raw 84 | 85 | # Visual channels. Can be 'stereo' or 'mono'. 86 | # 'stereo' mirrors both channels with low frequencies in center. 87 | # 'mono' outputs left to right lowest to highest frequencies. 88 | # 'mono_option' set mono to either take input from 'left', 'right' or 'average'. 89 | channels = stereo 90 | ; mono_option = average 91 | 92 | # Raw output target. A fifo will be created if target does not exist. 93 | raw_target = /tmp/cava_fifo 94 | 95 | # Raw data format. Can be 'binary' or 'ascii'. 96 | data_format = ascii 97 | 98 | # Binary bit format, can be '8bit' (0-255) or '16bit' (0-65530). 99 | ; bit_format = 16bit 100 | 101 | # Ascii max value. In 'ascii' mode range will run from 0 to value specified here 102 | ascii_max_range = 30 103 | 104 | # Ascii delimiters. In ascii format each bar and frame is separated by a delimiters. 105 | # Use decimal value in ascii table (i.e. 59 = ';' and 10 = '\n' (line feed)). 106 | ; bar_delimiter = 59 107 | ; frame_delimiter = 10 108 | 109 | 110 | 111 | [color] 112 | 113 | # Colors can be one of seven predefined: black, blue, cyan, green, magenta, red, white, yellow. 114 | # Or defined by hex code '#xxxxxx' (hex code must be within ''). User defined colors requires 115 | # ncurses output method and a terminal that can change color definitions such as Gnome-terminal or rxvt. 116 | # if supported, ncurses mode will be forced on if user defined colors are used. 117 | # default is to keep current terminal color 118 | ; background = default 119 | ; foreground = default 120 | 121 | # Gradient mode, only hex defined colors (and thereby ncurses mode) are supported, 122 | # background must also be defined in hex or remain commented out. 1 = on, 0 = off. 123 | # You can define as many as 8 different colors. They range from bottom to top of screen 124 | ; gradient = 1 125 | ; gradient_count = 8 126 | ; gradient_color_1 = '#59cc33' 127 | ; gradient_color_2 = '#80cc33' 128 | ; gradient_color_3 = '#a6cc33' 129 | ; gradient_color_4 = '#cccc33' 130 | ; gradient_color_5 = '#cca633' 131 | ; gradient_color_6 = '#cc8033' 132 | ; gradient_color_7 = '#cc5933' 133 | ; gradient_color_8 = '#cc3333' 134 | 135 | 136 | 137 | [smoothing] 138 | 139 | # Percentage value for integral smoothing. Takes values from 0 - 100. 140 | # Higher values means smoother, but less precise. 0 to disable. 141 | ; integral = 77 142 | 143 | # Disables or enables the so-called "Monstercat smoothing" with or without "waves". Set to 0 to disable. 144 | ; monstercat = 0 145 | ; waves = 0 146 | 147 | # Set gravity percentage for "drop off". Higher values means bars will drop faster. 148 | # Accepts only non-negative values. 50 means half gravity, 200 means double. Set to 0 to disable "drop off". 149 | gravity = 150 150 | 151 | 152 | # In bar height, bars that would have been lower that this will not be drawn. 153 | ; ignore = 0 154 | 155 | 156 | [eq] 157 | 158 | # This one is tricky. You can have as much keys as you want. 159 | # Remember to uncomment more then one key! More keys = more precision. 160 | # Look at readme.md on github for further explanations and examples. 161 | ; 1 = 1 # bass 162 | ; 2 = 1 163 | ; 3 = 1 # midtone 164 | ; 4 = 1 165 | ; 5 = 1 # treble 166 | -------------------------------------------------------------------------------- /ConfigurationFiles/cava2/config: -------------------------------------------------------------------------------- 1 | ## Configuration file for CAVA. Default values are commented out. Use either ';' or '#' for commenting. 2 | 3 | 4 | [general] 5 | 6 | # Smoothing mode. Can be 'normal', 'scientific' or 'waves'. DEPRECATED as of 0.6.0 7 | mode = normal 8 | 9 | # Accepts only non-negative values. 10 | framerate = 20 11 | 12 | # 'autosens' will attempt to decrease sensitivity if the bars peak. 1 = on, 0 = off 13 | # new as of 0.6.0 autosens of low values (dynamic range) 14 | # 'overshoot' allows bars to overshoot (in % of terminal height) without initiating autosens. DEPRECATED as of 0.6.0 15 | ; autosens = 1 16 | ; overshoot = 20 17 | 18 | # Manual sensitivity in %. Autosens must be turned off for this to take effect. 19 | # 200 means double height. Accepts only non-negative values. 20 | ; sensitivity = 100 21 | 22 | # The number of bars (0-200). 0 sets it to auto (fill up console). 23 | # Bars' width and space between bars in number of characters. 24 | bars = 2 25 | ; bar_width = 2 26 | ; bar_spacing = 1 27 | 28 | 29 | # Lower and higher cutoff frequencies for lowest and highest bars 30 | # the bandwidth of the visualizer. 31 | # Note: there is a minimum total bandwidth of 43Mhz x number of bars. 32 | # Cava will automatically increase the higher cutoff if a too low band is specified. 33 | lower_cutoff_freq = 30 34 | higher_cutoff_freq = 20000 35 | 36 | 37 | # Seconds with no input before cava goes to sleep mode. Cava will not perform FFT or drawing and 38 | # only check for input once per second. Cava will wake up once input is detected. 0 = disable. 39 | sleep_timer = 0 40 | 41 | 42 | [input] 43 | 44 | # Audio capturing method. Possible methods are: 'pulse', 'alsa', 'fifo', 'sndio' or 'shmem' 45 | # Defaults to 'pulse', 'alsa' or 'fifo', in that order, dependent on what support cava was built with. 46 | # 47 | # All input methods uses the same config variable 'source' 48 | # to define where it should get the audio. 49 | # 50 | # For pulseaudio 'source' will be the source. Default: 'auto', which uses the monitor source of the default sink 51 | # (all pulseaudio sinks(outputs) have 'monitor' sources(inputs) associated with them). 52 | # 53 | # For alsa 'source' will be the capture device. 54 | # For fifo 'source' will be the path to fifo-file. 55 | # For shmem 'source' will be /squeezelite-AA:BB:CC:DD:EE:FF where 'AA:BB:CC:DD:EE:FF' will be squeezelite's MAC address 56 | ; method = pulse 57 | ; source = auto 58 | 59 | ; method = alsa 60 | ; source = hw:Loopback,1 61 | 62 | method = fifo 63 | source = /tmp/mpd.fifo 64 | ; sample_rate = 44100 65 | ; sample_bits = 16 66 | 67 | ; method = shmem 68 | ; source = /squeezelite-AA:BB:CC:DD:EE:FF 69 | 70 | ; method = portaudio 71 | ; source = auto 72 | 73 | 74 | [output] 75 | 76 | # Output method. Can be 'ncurses', 'noncurses' or 'raw'. 77 | # 'noncurses' uses a custom framebuffer technique and draws only changes 78 | # from frame to frame. 'ncurses' is default if supported 79 | # 80 | # 'raw' is an 8 or 16 bit (configurable via the 'bit_format' option) data 81 | # stream of the bar heights that can be used to send to other applications. 82 | # 'raw' defaults to 200 bars, which can be adjusted in the 'bars' option above. 83 | method = raw 84 | 85 | # Visual channels. Can be 'stereo' or 'mono'. 86 | # 'stereo' mirrors both channels with low frequencies in center. 87 | # 'mono' outputs left to right lowest to highest frequencies. 88 | # 'mono_option' set mono to either take input from 'left', 'right' or 'average'. 89 | channels = stereo 90 | ; mono_option = average 91 | 92 | # Raw output target. A fifo will be created if target does not exist. 93 | raw_target = /tmp/cava2_fifo 94 | 95 | # Raw data format. Can be 'binary' or 'ascii'. 96 | data_format = ascii 97 | # Binary bit format, can be '8bit' (0-255) or '16bit' (0-65530). 98 | ; bit_format = 16bit 99 | 100 | # Ascii max value. In 'ascii' mode range will run from 0 to value specified here 101 | ascii_max_range = 32 102 | 103 | # Ascii delimiters. In ascii format each bar and frame is separated by a delimiters. 104 | # Use decimal value in ascii table (i.e. 59 = ';' and 10 = '\n' (line feed)). 105 | ; bar_delimiter = 59 106 | ; frame_delimiter = 10 107 | 108 | 109 | 110 | [color] 111 | 112 | # Colors can be one of seven predefined: black, blue, cyan, green, magenta, red, white, yellow. 113 | # Or defined by hex code '#xxxxxx' (hex code must be within ''). User defined colors requires 114 | # ncurses output method and a terminal that can change color definitions such as Gnome-terminal or rxvt. 115 | # if supported, ncurses mode will be forced on if user defined colors are used. 116 | # default is to keep current terminal color 117 | ; background = default 118 | ; foreground = default 119 | 120 | # Gradient mode, only hex defined colors (and thereby ncurses mode) are supported, 121 | # background must also be defined in hex or remain commented out. 1 = on, 0 = off. 122 | # You can define as many as 8 different colors. They range from bottom to top of screen 123 | ; gradient = 1 124 | ; gradient_count = 8 125 | ; gradient_color_1 = '#59cc33' 126 | ; gradient_color_2 = '#80cc33' 127 | ; gradient_color_3 = '#a6cc33' 128 | ; gradient_color_4 = '#cccc33' 129 | ; gradient_color_5 = '#cca633' 130 | ; gradient_color_6 = '#cc8033' 131 | ; gradient_color_7 = '#cc5933' 132 | ; gradient_color_8 = '#cc3333' 133 | 134 | 135 | 136 | [smoothing] 137 | 138 | # Percentage value for integral smoothing. Takes values from 0 - 100. 139 | # Higher values means smoother, but less precise. 0 to disable. 140 | ; integral = 77 141 | 142 | # Disables or enables the so-called "Monstercat smoothing" with or without "waves". Set to 0 to disable. 143 | ; monstercat = 0 144 | ; waves = 0 145 | 146 | # Set gravity percentage for "drop off". Higher values means bars will drop faster. 147 | # Accepts only non-negative values. 50 means half gravity, 200 means double. Set to 0 to disable "drop off". 148 | gravity = 150 149 | 150 | 151 | # In bar height, bars that would have been lower that this will not be drawn. 152 | ; ignore = 0 153 | 154 | 155 | [eq] 156 | 157 | # This one is tricky. You can have as much keys as you want. 158 | # Remember to uncomment more then one key! More keys = more precision. 159 | # Look at readme.md on github for further explanations and examples. 160 | ; 1 = 1 # bass 161 | ; 2 = 1 162 | ; 3 = 1 # midtone 163 | ; 4 = 1 164 | ; 5 = 1 # treble 165 | -------------------------------------------------------------------------------- /ConfigurationFiles/config.txt: -------------------------------------------------------------------------------- 1 | initramfs volumio.initrd 2 | gpu_mem=32 3 | max_usb_current=1 4 | dtparam=audio=on 5 | audio_pwm_mode=2 6 | dtparam=i2c_arm=on 7 | disable_splash=1 8 | hdmi_force_hotplug=1 9 | hdmi_group=2 10 | hdmi_mode=87 11 | hdmi_cvt=800 480 60 6 0 0 0 12 | hdmi_drive=1 13 | display_rotate=2 14 | dtparam=spi=on 15 | dtparam=i2c=on 16 | #dtoverlay=pi3-disable-bt 17 | #dtoverlay=pi3-disable-wifi 18 | #dtoverlay=gpio-poweroff,active_low,gpiopin=13 19 | #enable_uart=1 20 | 21 | dtoverlay=gpio-shutdown 22 | 23 | include userconfig.txt 24 | 25 | -------------------------------------------------------------------------------- /ConfigurationFiles/ldconf/libc.conf: -------------------------------------------------------------------------------- 1 | # libc default configuration 2 | /usr/local/lib 3 | /home/volumio/src/openssl-1.1.1b/lib 4 | 5 | -------------------------------------------------------------------------------- /ConfigurationFiles/mpd.conf: -------------------------------------------------------------------------------- 1 | # Volumio MPD Configuration File 2 | 3 | # Files and directories ####################################################### 4 | music_directory "/var/lib/mpd/music" 5 | playlist_directory "/var/lib/mpd/playlists" 6 | db_file "/var/lib/mpd/tag_cache" 7 | log_file "/var/log/mpd.log" 8 | #pid_file "/var/run/mpd/pid" 9 | #state_file "/var/lib/mpd/state" 10 | #sticker_file "/var/lib/mpd/sticker.sql" 11 | ############################################################################### 12 | 13 | # General music daemon options ################################################ 14 | user "mpd" 15 | group "audio" 16 | bind_to_address "any" 17 | #port "6600" 18 | #log_level "default" 19 | gapless_mp3_playback "no" 20 | #save_absolute_paths_in_playlists "no" 21 | #metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" 22 | auto_update "yes" 23 | #auto_update_depth "3" 24 | ############################################################################### 25 | # Symbolic link behavior ###################################################### 26 | follow_outside_symlinks "yes" 27 | follow_inside_symlinks "yes" 28 | ############################################################################### 29 | # Input ####################################################################### 30 | # 31 | input { 32 | plugin "curl" 33 | # proxy "proxy.isp.com:8080" 34 | # proxy_user "user" 35 | # proxy_password "password" 36 | } 37 | ############################################################################### 38 | 39 | # Decoder ################################################################ 40 | 41 | 42 | 43 | 44 | 45 | ############################################################################### 46 | 47 | # Audio Output ################################################################ 48 | 49 | resampler { 50 | plugin "soxr" 51 | quality "high" 52 | threads "1" 53 | } 54 | 55 | audio_output { 56 | type "alsa" 57 | name "alsa" 58 | device "hw:1,0" 59 | buffer_time "1200000" 60 | dop "no" 61 | 62 | 63 | 64 | 65 | } 66 | 67 | 68 | 69 | 70 | 71 | audio_output { 72 | type "fifo" 73 | enabled "no" 74 | name "multiroom" 75 | path "/tmp/snapfifo" 76 | format "44100:16:2" 77 | } 78 | 79 | #replaygain "album" 80 | #replaygain_preamp "0" 81 | volume_normalization "no" 82 | ############################################################################### 83 | 84 | # MPD Internal Buffering ###################################################### 85 | audio_buffer_size "2048" 86 | buffer_before_play "10%" 87 | ############################################################################### 88 | 89 | 90 | # Resource Limitations ######################################################## 91 | #connection_timeout "60" 92 | max_connections "20" 93 | max_playlist_length "81920" 94 | max_command_list_size "81920" 95 | max_output_buffer_size "81920" 96 | ############################################################################### 97 | 98 | # Character Encoding ########################################################## 99 | filesystem_charset "UTF-8" 100 | id3v1_encoding "UTF-8" 101 | ############################################################################### 102 | audio_output { 103 | 104 | type "fifo" 105 | 106 | name "my_fifo" 107 | 108 | path "/tmp/mpd.fifo" 109 | 110 | format "44100:16:2" 111 | 112 | } 113 | audio_output { 114 | 115 | type "fifo" 116 | 117 | name "my_fifo2" 118 | 119 | path "/tmp/mpd2.fifo" 120 | 121 | format "44100:16:2" 122 | 123 | } -------------------------------------------------------------------------------- /ConfigurationFiles/mpd.conf.tmpl: -------------------------------------------------------------------------------- 1 | # Volumio MPD Configuration File 2 | 3 | # Files and directories ####################################################### 4 | music_directory "/var/lib/mpd/music" 5 | playlist_directory "/var/lib/mpd/playlists" 6 | db_file "/var/lib/mpd/tag_cache" 7 | log_file "/var/log/mpd.log" 8 | #pid_file "/var/run/mpd/pid" 9 | #state_file "/var/lib/mpd/state" 10 | #sticker_file "/var/lib/mpd/sticker.sql" 11 | ############################################################################### 12 | 13 | # General music daemon options ################################################ 14 | user "mpd" 15 | group "audio" 16 | bind_to_address "any" 17 | #port "6600" 18 | #log_level "default" 19 | gapless_mp3_playback "${gapless_mp3_playback}" 20 | #save_absolute_paths_in_playlists "no" 21 | #metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" 22 | auto_update "no" 23 | #auto_update_depth "3" 24 | ############################################################################### 25 | # Symbolic link behavior ###################################################### 26 | follow_outside_symlinks "yes" 27 | follow_inside_symlinks "yes" 28 | ############################################################################### 29 | # Input ####################################################################### 30 | # 31 | input { 32 | plugin "curl" 33 | # proxy "proxy.isp.com:8080" 34 | # proxy_user "user" 35 | # proxy_password "password" 36 | } 37 | ############################################################################### 38 | 39 | # Decoder ################################################################ 40 | 41 | "${ffmpeg}" 42 | 43 | "${sacdiso}" 44 | 45 | ############################################################################### 46 | 47 | # Audio Output ################################################################ 48 | 49 | ${sox} 50 | 51 | audio_output { 52 | type "alsa" 53 | name "alsa" 54 | device "${device}" 55 | dop "${dop}" 56 | buffer_time "1200000" 57 | ${mixer} 58 | ${format} 59 | ${special_settings} 60 | 61 | } 62 | 63 | 64 | 65 | 66 | 67 | audio_output { 68 | type "fifo" 69 | enabled "no" 70 | name "multiroom" 71 | path "/tmp/snapfifo" 72 | format "44100:16:2" 73 | } 74 | 75 | #replaygain "album" 76 | #replaygain_preamp "0" 77 | volume_normalization "${volume_normalization}" 78 | ############################################################################### 79 | 80 | # MPD Internal Buffering ###################################################### 81 | audio_buffer_size "${audio_buffer_size}" 82 | buffer_before_play "${buffer_before_play}" 83 | ############################################################################### 84 | 85 | 86 | # Resource Limitations ######################################################## 87 | #connection_timeout "60" 88 | max_connections "20" 89 | max_playlist_length "81920" 90 | max_command_list_size "81920" 91 | max_output_buffer_size "81920" 92 | ############################################################################### 93 | 94 | # Character Encoding ########################################################## 95 | filesystem_charset "UTF-8" 96 | id3v1_encoding "UTF-8" 97 | ############################################################################### 98 | audio_output { 99 | 100 | type "fifo" 101 | 102 | name "my_fifo" 103 | 104 | path "/tmp/mpd.fifo" 105 | 106 | format "44100:16:2" 107 | 108 | } 109 | audio_output { 110 | 111 | type "fifo" 112 | 113 | name "my_fifo2" 114 | 115 | path "/tmp/mpd2.fifo" 116 | 117 | format "44100:16:2" 118 | 119 | } 120 | 121 | -------------------------------------------------------------------------------- /ConfigurationFiles/proftpd/controls.log: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ConfigurationFiles/proftpd/proftp-custom.conf: -------------------------------------------------------------------------------- 1 | # Ftp user doesn't need a valid shell 2 | 3 | RequireValidShell off 4 | 5 | # If desired turn off IPv6 6 | UseIPv6 off 7 | # Default directory is ftpusers home 8 | DefaultRoot ~ volumio 9 | -------------------------------------------------------------------------------- /ConfigurationFiles/proftpd/proftpd.conf: -------------------------------------------------------------------------------- 1 | # 2 | # /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file. 3 | # To really apply changes, reload proftpd after modifications, if 4 | # it runs in daemon mode. It is not required in inetd/xinetd mode. 5 | # 6 | 7 | # Includes DSO modules 8 | Include /etc/proftpd/modules.conf 9 | 10 | # Set off to disable IPv6 support which is annoying on IPv4 only boxes. 11 | UseIPv6 off 12 | # If set on you can experience a longer connection delay in many cases. 13 | IdentLookups off 14 | 15 | ServerName "VolumioFTP" 16 | ServerType standalone 17 | DeferWelcome off 18 | 19 | MultilineRFC2228 on 20 | DefaultServer on 21 | ShowSymlinks on 22 | 23 | TimeoutNoTransfer 600 24 | TimeoutStalled 600 25 | TimeoutIdle 1200 26 | 27 | DisplayLogin welcome.msg 28 | DisplayChdir .message true 29 | ListOptions "-l" 30 | 31 | DenyFilter \*.*/ 32 | 33 | # Use this to jail all users in their homes 34 | # DefaultRoot ~ 35 | 36 | # Users require a valid shell listed in /etc/shells to login. 37 | # Use this directive to release that constrain. 38 | # RequireValidShell off 39 | 40 | # Port 21 is the standard FTP port. 41 | Port 21 42 | 43 | # In some cases you have to specify passive ports range to by-pass 44 | # firewall limitations. Ephemeral ports can be used for that, but 45 | # feel free to use a more narrow range. 46 | # PassivePorts 49152 65534 47 | 48 | # If your host was NATted, this option is useful in order to 49 | # allow passive tranfers to work. You have to use your public 50 | # address and opening the passive ports used on your firewall as well. 51 | # MasqueradeAddress 1.2.3.4 52 | 53 | # This is useful for masquerading address with dynamic IPs: 54 | # refresh any configured MasqueradeAddress directives every 8 hours 55 | 56 | # DynMasqRefresh 28800 57 | 58 | 59 | # To prevent DoS attacks, set the maximum number of child processes 60 | # to 30. If you need to allow more than 30 concurrent connections 61 | # at once, simply increase this value. Note that this ONLY works 62 | # in standalone mode, in inetd mode you should use an inetd server 63 | # that allows you to limit maximum number of processes per service 64 | # (such as xinetd) 65 | MaxInstances 30 66 | 67 | # Set the user and group that the server normally runs at. 68 | User volumio 69 | Group volumio 70 | 71 | # Umask 022 is a good standard umask to prevent new files and dirs 72 | # (second parm) from being group and world writable. 73 | Umask 022 022 74 | # Normally, we want files to be overwriteable. 75 | AllowOverwrite on 76 | 77 | # Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords: 78 | # PersistentPasswd off 79 | 80 | # This is required to use both PAM-based authentication and local passwords 81 | # AuthOrder mod_auth_pam.c* mod_auth_unix.c 82 | 83 | # Be warned: use of this directive impacts CPU average load! 84 | # Uncomment this if you like to see progress and transfer rate with ftpwho 85 | # in downloads. That is not needed for uploads rates. 86 | # 87 | # UseSendFile off 88 | 89 | #TransferLog /home/volumio/proftpd/xferlog 90 | #SystemLog /home/volumio/proftpd/proftpd.log 91 | 92 | # Logging onto /var/log/lastlog is enabled but set to off by default 93 | #UseLastlog on 94 | 95 | # In order to keep log file dates consistent after chroot, use timezone info 96 | # from /etc/localtime. If this is not set, and proftpd is configured to 97 | # chroot (e.g. DefaultRoot or ), it will use the non-daylight 98 | # savings timezone regardless of whether DST is in effect. 99 | #SetEnv TZ :/etc/localtime 100 | 101 | 102 | QuotaEngine off 103 | 104 | 105 | 106 | Ratios off 107 | 108 | 109 | 110 | # Delay engine reduces impact of the so-called Timing Attack described in 111 | # http://www.securityfocus.com/bid/11430/discuss 112 | # It is on by default. 113 | 114 | DelayEngine on 115 | 116 | 117 | 118 | ControlsEngine off 119 | ControlsMaxClients 2 120 | #ControlsLog /var/log/proftpd/controls.log 121 | ControlsInterval 5 122 | ControlsSocket /var/run/proftpd/proftpd.sock 123 | 124 | 125 | 126 | AdminControlsEngine off 127 | 128 | 129 | # 130 | # Alternative authentication frameworks 131 | # 132 | #Include /etc/proftpd/ldap.conf 133 | #Include /etc/proftpd/sql.conf 134 | 135 | # 136 | # This is used for FTPS connections 137 | # 138 | #Include /etc/proftpd/tls.conf 139 | 140 | # 141 | # Useful to keep VirtualHost/VirtualRoot directives separated 142 | # 143 | #Include /etc/proftpd/virtuals.conf 144 | 145 | # A basic anonymous configuration, no upload directories. 146 | 147 | # 148 | # User ftp 149 | # Group volumio 150 | # # We want clients to be able to login with "anonymous" as well as "ftp" 151 | # UserAlias anonymous ftp 152 | # # Cosmetic changes, all files belongs to ftp user 153 | # DirFakeUser on ftp 154 | # DirFakeGroup on ftp 155 | # 156 | # RequireValidShell off 157 | # 158 | # # Limit the maximum number of anonymous logins 159 | # MaxClients 10 160 | # 161 | # # We want 'welcome.msg' displayed at login, and '.message' displayed 162 | # # in each newly chdired directory. 163 | # DisplayLogin welcome.msg 164 | # DisplayChdir .message 165 | # 166 | # # Limit WRITE everywhere in the anonymous chroot 167 | # 168 | # 169 | # DenyAll 170 | # 171 | # 172 | # 173 | # # Uncomment this if you're brave. 174 | # # 175 | # # # Umask 022 is a good standard umask to prevent new files and dirs 176 | # # # (second parm) from being group and world writable. 177 | # # Umask 022 022 178 | # # 179 | # # DenyAll 180 | # # 181 | # # 182 | # # AllowAll 183 | # # 184 | # # 185 | # 186 | # 187 | 188 | # Include other custom configuration files 189 | Include /etc/proftpd/conf.d/ 190 | -------------------------------------------------------------------------------- /ConfigurationFiles/proftpd/proftpd.log: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ConfigurationFiles/proftpd/test: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ConfigurationFiles/python/Setup: -------------------------------------------------------------------------------- 1 | # -*- makefile -*- 2 | # The file Setup is used by the makesetup script to construct the files 3 | # Makefile and config.c, from Makefile.pre and config.c.in, 4 | # respectively. Note that Makefile.pre is created from Makefile.pre.in 5 | # by the toplevel configure script. 6 | 7 | # (VPATH notes: Setup and Makefile.pre are in the build directory, as 8 | # are Makefile and config.c; the *.in files are in the source directory.) 9 | 10 | # Each line in this file describes one or more optional modules. 11 | # Modules configured here will not be compiled by the setup.py script, 12 | # so the file can be used to override setup.py's behavior. 13 | # Tag lines containing just the word "*static*", "*shared*" or "*disabled*" 14 | # (without the quotes but with the stars) are used to tag the following module 15 | # descriptions. Tag lines may alternate throughout this file. Modules are 16 | # built statically when they are preceded by a "*static*" tag line or when 17 | # there is no tag line between the start of the file and the module 18 | # description. Modules are built as a shared library when they are preceded by 19 | # a "*shared*" tag line. Modules are not built at all, not by the Makefile, 20 | # nor by the setup.py script, when they are preceded by a "*disabled*" tag 21 | # line. 22 | 23 | # Lines have the following structure: 24 | # 25 | # ... [ ...] [ ...] [ ...] 26 | # 27 | # is anything ending in .c (.C, .cc, .c++ are C++ files) 28 | # is anything starting with -I, -D, -U or -C 29 | # is anything ending in .a or beginning with -l or -L 30 | # is anything else but should be a valid Python 31 | # identifier (letters, digits, underscores, beginning with non-digit) 32 | # 33 | # (As the makesetup script changes, it may recognize some other 34 | # arguments as well, e.g. *.so and *.sl as libraries. See the big 35 | # case statement in the makesetup script.) 36 | # 37 | # Lines can also have the form 38 | # 39 | # = 40 | # 41 | # which defines a Make variable definition inserted into Makefile.in 42 | # 43 | # The build process works like this: 44 | # 45 | # 1. Build all modules that are declared as static in Modules/Setup, 46 | # combine them into libpythonxy.a, combine that into python. 47 | # 2. Build all modules that are listed as shared in Modules/Setup. 48 | # 3. Invoke setup.py. That builds all modules that 49 | # a) are not builtin, and 50 | # b) are not listed in Modules/Setup, and 51 | # c) can be build on the target 52 | # 53 | # Therefore, modules declared to be shared will not be 54 | # included in the config.c file, nor in the list of objects to be 55 | # added to the library archive, and their linker options won't be 56 | # added to the linker options. Rules to create their .o files and 57 | # their shared libraries will still be added to the Makefile, and 58 | # their names will be collected in the Make variable SHAREDMODS. This 59 | # is used to build modules as shared libraries. (They can be 60 | # installed using "make sharedinstall", which is implied by the 61 | # toplevel "make install" target.) (For compatibility, 62 | # *noconfig* has the same effect as *shared*.) 63 | # 64 | # NOTE: As a standard policy, as many modules as can be supported by a 65 | # platform should be present. The distribution comes with all modules 66 | # enabled that are supported by most platforms and don't require you 67 | # to ftp sources from elsewhere. 68 | 69 | 70 | # Some special rules to define PYTHONPATH. 71 | # Edit the definitions below to indicate which options you are using. 72 | # Don't add any whitespace or comments! 73 | 74 | # Directories where library files get installed. 75 | # DESTLIB is for Python modules; MACHDESTLIB for shared libraries. 76 | DESTLIB=$(LIBDEST) 77 | MACHDESTLIB=$(BINLIBDEST) 78 | 79 | # NOTE: all the paths are now relative to the prefix that is computed 80 | # at run time! 81 | 82 | # Standard path -- don't edit. 83 | # No leading colon since this is the first entry. 84 | # Empty since this is now just the runtime prefix. 85 | DESTPATH= 86 | 87 | # Site specific path components -- should begin with : if non-empty 88 | SITEPATH= 89 | 90 | # Standard path components for test modules 91 | TESTPATH= 92 | 93 | COREPYTHONPATH=$(DESTPATH)$(SITEPATH)$(TESTPATH) 94 | PYTHONPATH=$(COREPYTHONPATH) 95 | 96 | 97 | # The modules listed here can't be built as shared libraries for 98 | # various reasons; therefore they are listed here instead of in the 99 | # normal order. 100 | 101 | # This only contains the minimal set of modules required to run the 102 | # setup.py script in the root of the Python source tree. 103 | 104 | posix -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal posixmodule.c # posix (UNIX) system calls 105 | errno errnomodule.c # posix (UNIX) errno values 106 | pwd pwdmodule.c # this is needed to find out the user's home dir 107 | # if $HOME is not set 108 | _sre _sre.c # Fredrik Lundh's new regular expressions 109 | _codecs _codecsmodule.c # access to the builtin codecs and codec registry 110 | _weakref _weakref.c # weak references 111 | _functools -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal _functoolsmodule.c # Tools for working with functions and callable objects 112 | _operator _operator.c # operator.add() and similar goodies 113 | _collections _collectionsmodule.c # Container types 114 | _abc _abc.c # Abstract base classes 115 | itertools itertoolsmodule.c # Functions creating iterators for efficient looping 116 | atexit atexitmodule.c # Register functions to be run at interpreter-shutdown 117 | _signal -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal signalmodule.c 118 | _stat _stat.c # stat.h interface 119 | time -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal timemodule.c # -lm # time operations and variables 120 | _thread -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal _threadmodule.c # low-level threading interface 121 | 122 | # access to ISO C locale support 123 | _locale -DPy_BUILD_CORE_BUILTIN _localemodule.c # -lintl 124 | 125 | # Standard I/O baseline 126 | _io -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal -I$(srcdir)/Modules/_io _io/_iomodule.c _io/iobase.c _io/fileio.c _io/bytesio.c _io/bufferedio.c _io/textio.c _io/stringio.c 127 | 128 | # faulthandler module 129 | faulthandler faulthandler.c 130 | 131 | # debug tool to trace memory blocks allocated by Python 132 | # 133 | # bpo-35053: The module must be builtin since _Py_NewReference() 134 | # can call _PyTraceMalloc_NewReference(). 135 | _tracemalloc _tracemalloc.c hashtable.c 136 | 137 | # The rest of the modules listed in this file are all commented out by 138 | # default. Usually they can be detected and built as dynamically 139 | # loaded modules by the new setup.py script added in Python 2.1. If 140 | # you're on a platform that doesn't support dynamic loading, want to 141 | # compile modules statically into the Python binary, or need to 142 | # specify some odd set of compiler switches, you can uncomment the 143 | # appropriate lines below. 144 | 145 | # ====================================================================== 146 | 147 | # The Python symtable module depends on .h files that setup.py doesn't track 148 | _symtable symtablemodule.c 149 | 150 | # Uncommenting the following line tells makesetup that all following 151 | # modules are to be built as shared libraries (see above for more 152 | # detail; also note that *static* or *disabled* cancels this effect): 153 | 154 | #*shared* 155 | 156 | # GNU readline. Unlike previous Python incarnations, GNU readline is 157 | # now incorporated in an optional module, configured in the Setup file 158 | # instead of by a configure script switch. You may have to insert a 159 | # -L option pointing to the directory where libreadline.* lives, 160 | # and you may have to change -ltermcap to -ltermlib or perhaps remove 161 | # it, depending on your system -- see the GNU readline instructions. 162 | # It's okay for this to be a shared library, too. 163 | 164 | #readline readline.c -lreadline -ltermcap 165 | 166 | 167 | # Modules that should always be present (non UNIX dependent): 168 | 169 | #array arraymodule.c # array objects 170 | #cmath cmathmodule.c _math.c # -lm # complex math library functions 171 | #math mathmodule.c _math.c # -lm # math library functions, e.g. sin() 172 | #_contextvars _contextvarsmodule.c # Context Variables 173 | #_struct _struct.c # binary structure packing/unpacking 174 | #_weakref _weakref.c # basic weak reference support 175 | #_testcapi _testcapimodule.c # Python C API test module 176 | #_testinternalcapi _testinternalcapi.c -I$(srcdir)/Include/internal -DPy_BUILD_CORE_MODULE # Python internal C API test module 177 | #_random _randommodule.c # Random number generator 178 | #_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator 179 | #_pickle _pickle.c # pickle accelerator 180 | #_datetime _datetimemodule.c # datetime accelerator 181 | #_bisect _bisectmodule.c # Bisection algorithms 182 | #_heapq _heapqmodule.c # Heap queue algorithm 183 | #_asyncio _asynciomodule.c # Fast asyncio Future 184 | #_json -I$(srcdir)/Include/internal -DPy_BUILD_CORE_BUILTIN _json.c # _json speedups 185 | #_statistics _statisticsmodule.c # statistics accelerator 186 | 187 | #unicodedata unicodedata.c # static Unicode character database 188 | 189 | 190 | # Modules with some UNIX dependencies -- on by default: 191 | # (If you have a really backward UNIX, select and socket may not be 192 | # supported...) 193 | 194 | #fcntl fcntlmodule.c # fcntl(2) and ioctl(2) 195 | #spwd spwdmodule.c # spwd(3) 196 | #grp grpmodule.c # grp(3) 197 | #select selectmodule.c # select(2); not on ancient System V 198 | 199 | # Memory-mapped files (also works on Win32). 200 | #mmap mmapmodule.c 201 | 202 | # CSV file helper 203 | #_csv _csv.c 204 | 205 | # Socket module helper for socket(2) 206 | #_socket socketmodule.c 207 | 208 | # Socket module helper for SSL support; you must comment out the other 209 | # socket line above, and possibly edit the SSL variable: 210 | SSL=/home/volumio/src/openssl-1.1.1b 211 | _ssl _ssl.c \ 212 | -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ 213 | -L$(SSL)/lib -lssl -lcrypto 214 | 215 | # The crypt module is now disabled by default because it breaks builds 216 | # on many systems (where -lcrypt is needed), e.g. Linux (I believe). 217 | 218 | #_crypt _cryptmodule.c # -lcrypt # crypt(3); needs -lcrypt on some systems 219 | 220 | 221 | # Some more UNIX dependent modules -- off by default, since these 222 | # are not supported by all UNIX systems: 223 | 224 | #nis nismodule.c -lnsl # Sun yellow pages -- not everywhere 225 | #termios termios.c # Steen Lumholt's termios module 226 | #resource resource.c # Jeremy Hylton's rlimit interface 227 | 228 | #_posixsubprocess _posixsubprocess.c # POSIX subprocess module helper 229 | 230 | # Multimedia modules -- off by default. 231 | # These don't work for 64-bit platforms!!! 232 | # #993173 says audioop works on 64-bit platforms, though. 233 | # These represent audio samples or images as strings: 234 | 235 | #audioop audioop.c # Operations on audio samples 236 | 237 | 238 | # Note that the _md5 and _sha modules are normally only built if the 239 | # system does not have the OpenSSL libs containing an optimized version. 240 | 241 | # The _md5 module implements the RSA Data Security, Inc. MD5 242 | # Message-Digest Algorithm, described in RFC 1321. 243 | 244 | #_md5 md5module.c 245 | 246 | 247 | # The _sha module implements the SHA checksum algorithms. 248 | # (NIST's Secure Hash Algorithms.) 249 | #_sha1 sha1module.c 250 | #_sha256 sha256module.c 251 | #_sha512 sha512module.c 252 | #_sha3 _sha3/sha3module.c 253 | 254 | # _blake module 255 | #_blake2 _blake2/blake2module.c _blake2/blake2b_impl.c _blake2/blake2s_impl.c 256 | 257 | # The _tkinter module. 258 | # 259 | # The command for _tkinter is long and site specific. Please 260 | # uncomment and/or edit those parts as indicated. If you don't have a 261 | # specific extension (e.g. Tix or BLT), leave the corresponding line 262 | # commented out. (Leave the trailing backslashes in! If you 263 | # experience strange errors, you may want to join all uncommented 264 | # lines and remove the backslashes -- the backslash interpretation is 265 | # done by the shell's "read" command and it may not be implemented on 266 | # every system. 267 | 268 | # *** Always uncomment this (leave the leading underscore in!): 269 | # _tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \ 270 | # *** Uncomment and edit to reflect where your Tcl/Tk libraries are: 271 | # -L/usr/local/lib \ 272 | # *** Uncomment and edit to reflect where your Tcl/Tk headers are: 273 | # -I/usr/local/include \ 274 | # *** Uncomment and edit to reflect where your X11 header files are: 275 | # -I/usr/X11R6/include \ 276 | # *** Or uncomment this for Solaris: 277 | # -I/usr/openwin/include \ 278 | # *** Uncomment and edit for Tix extension only: 279 | # -DWITH_TIX -ltix8.1.8.2 \ 280 | # *** Uncomment and edit for BLT extension only: 281 | # -DWITH_BLT -I/usr/local/blt/blt8.0-unoff/include -lBLT8.0 \ 282 | # *** Uncomment and edit for PIL (TkImaging) extension only: 283 | # (See http://www.pythonware.com/products/pil/ for more info) 284 | # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \ 285 | # *** Uncomment and edit for TOGL extension only: 286 | # -DWITH_TOGL togl.c \ 287 | # *** Uncomment and edit to reflect your Tcl/Tk versions: 288 | # -ltk8.2 -ltcl8.2 \ 289 | # *** Uncomment and edit to reflect where your X11 libraries are: 290 | # -L/usr/X11R6/lib \ 291 | # *** Or uncomment this for Solaris: 292 | # -L/usr/openwin/lib \ 293 | # *** Uncomment these for TOGL extension only: 294 | # -lGL -lGLU -lXext -lXmu \ 295 | # *** Uncomment for AIX: 296 | # -lld \ 297 | # *** Always uncomment this; X11 libraries to link with: 298 | # -lX11 299 | 300 | # Lance Ellinghaus's syslog module 301 | #syslog syslogmodule.c # syslog daemon interface 302 | 303 | 304 | # Curses support, requiring the System V version of curses, often 305 | # provided by the ncurses library. e.g. on Linux, link with -lncurses 306 | # instead of -lcurses). 307 | 308 | #_curses _cursesmodule.c -lcurses -ltermcap 309 | # Wrapper for the panel library that's part of ncurses and SYSV curses. 310 | #_curses_panel _curses_panel.c -lpanel -lncurses 311 | 312 | 313 | # Modules that provide persistent dictionary-like semantics. You will 314 | # probably want to arrange for at least one of them to be available on 315 | # your machine, though none are defined by default because of library 316 | # dependencies. The Python module dbm/__init__.py provides an 317 | # implementation independent wrapper for these; dbm/dumb.py provides 318 | # similar functionality (but slower of course) implemented in Python. 319 | 320 | #_dbm _dbmmodule.c # dbm(3) may require -lndbm or similar 321 | 322 | # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm: 323 | 324 | #_gdbm _gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm 325 | 326 | 327 | # Helper module for various ascii-encoders 328 | #binascii binascii.c 329 | 330 | # Fred Drake's interface to the Python parser 331 | #parser parsermodule.c 332 | 333 | 334 | # Andrew Kuchling's zlib module. 335 | # This require zlib 1.1.3 (or later). 336 | # See http://www.gzip.org/zlib/ 337 | #zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz 338 | 339 | # Interface to the Expat XML parser 340 | # More information on Expat can be found at www.libexpat.org. 341 | # 342 | #pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY -DUSE_PYEXPAT_CAPI 343 | 344 | # Hye-Shik Chang's CJKCodecs 345 | 346 | # multibytecodec is required for all the other CJK codec modules 347 | #_multibytecodec cjkcodecs/multibytecodec.c 348 | 349 | #_codecs_cn cjkcodecs/_codecs_cn.c 350 | #_codecs_hk cjkcodecs/_codecs_hk.c 351 | #_codecs_iso2022 cjkcodecs/_codecs_iso2022.c 352 | #_codecs_jp cjkcodecs/_codecs_jp.c 353 | #_codecs_kr cjkcodecs/_codecs_kr.c 354 | #_codecs_tw cjkcodecs/_codecs_tw.c 355 | 356 | # Example -- included for reference only: 357 | # xx xxmodule.c 358 | 359 | # Another example -- the 'xxsubtype' module shows C-level subtyping in action 360 | xxsubtype xxsubtype.c 361 | 362 | # Uncommenting the following line tells makesetup that all following modules 363 | # are not built (see above for more detail). 364 | # 365 | #*disabled* 366 | # 367 | #_sqlite3 _tkinter _curses pyexpat 368 | #_codecs_jp _codecs_kr _codecs_tw unicodedata 369 | -------------------------------------------------------------------------------- /ConfigurationFiles/python/test: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ConfigurationFiles/test: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Maschine2501 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | In order to keep things right, here is the license of the origin: 24 | 25 | https://github.com/diehardsk/Volumio-OledUI/issues/3#event-3732766592 26 | -------------------------------------------------------------------------------- /NoCover.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/NoCover.bmp -------------------------------------------------------------------------------- /PreConfiguration.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set +e # 3 | echo -e "\e[92m _ ______ ___ __ ______\e[0m" # 4 | echo -e "\e[92m / | / / __ < / / / / / _/\e[0m" # 5 | echo -e "\e[92m / |/ / /_/ / /_____/ / / // / \e[0m" # 6 | echo -e "\e[92m / /| / _, _/ /_____/ /_/ // / \e[0m" # 7 | echo -e "\e[92m/_/ |_/_/ |_/_/ \____/___/ \e[0m" # 8 | echo "" # 9 | echo -e "\e[92mConfiguration-Utility\e[0m" # 10 | echo "" # 11 | echo "_________________________________________________________ " # 12 | echo " " # 13 | echo -e "\e[4;92mDo you want to use Spectrum/VU-Meter?\e[0;0m" # 14 | echo -e "\e[92m(This enables two CAVA instances)\e[0m" # 15 | echo "" # 16 | echo -e "\e[91m---> This needs some resources!!! " # 17 | echo -e "-> Better use Pi3 or above.\e[0m" # 18 | echo " " # 19 | echo "______________________ " # 20 | echo " " # 21 | echo -e "\e[93mValid selections are: \e[0m" # 22 | echo -e "1 -> \e[92mYes\e[0m" # 23 | echo -e "2 -> \e[91mNo\e[0m" # 24 | echo -e "\e[93m--->\e[0m" #" # 25 | getCAVATag() { # 26 | read -p "Enter your decision: " CAVATag # 27 | case "$CAVATag" in # 28 | 1) # 29 | sed -i 's/\(SpectrumActive = \)\(.*\)/\1True/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 30 | echo " " # 31 | echo -e "\e[92mCAVA/Spectrum will be installed...\e[0m" # 32 | return 0 # 33 | ;; # 34 | 2) # 35 | sed -i 's/\(SpectrumActive = \)\(.*\)/\1False/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 36 | echo " " # 37 | echo -e "\e[92mCAVA/Spectrum won't be installed...\e[0m" # 38 | return 0 # 39 | ;; # 40 | *) # 41 | printf %s\\n "Please enter '1' or '2'" # 42 | return 1 # 43 | ;; # 44 | esac # 45 | } # 46 | until getCAVATag; do : ; done # 47 | echo "________________________________________________________________________ " # 48 | echo " " # 49 | echo " " # 50 | echo -e "\e[4;92mDo you want to activate Album-Art-Tool for NR1-UI-Remote?\e[0;0m" # 51 | echo " " # 52 | echo -e "More informations under: \e[93mhttps://github.com/Maschine2501/NR1-UI-Remote\e[0m" # 53 | echo " " # 54 | echo -e "\e[25;91mIf you select YES you'll get a promt, select: "'"Standalone"'" \e[0;0m" # 55 | echo "______________________ " # 56 | echo " " # 57 | echo -e "\e[93mValid selections are: \e[0m" # 58 | echo -e "1 -> \e[92mYes\e[0m" # 59 | echo -e "2 -> \e[91mNo\e[0m" # 60 | echo -e "\e[93m--->\e[0m" # 61 | cd # 62 | getRemote() { # 63 | read -p "Enter your decision: " Remote # 64 | case "$Remote" in # 65 | 1) # 66 | sed -i 's/\(NR1UIRemoteActive = \)\(.*\)/\1True/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 67 | sudo apt install -y proftpd-basic # 68 | sudo cp /home/volumio/NR1-UI/ConfigurationFiles/proftpd/proftpd.conf /etc/proftpd # 69 | sudo cp /home/volumio/NR1-UI/ConfigurationFiles/proftpd/proftp-custom.conf /etc/proftpd/conf.d # 70 | sudo mkdir /home/volumio/proftpd # 71 | sudo chmod 777 /home/volumio/proftpd # 72 | sudo cp /home/volumio/NR1-UI/ConfigurationFiles/proftpd/controls.log /home/volumio/proftpd # 73 | sudo cp /home/volumio/NR1-UI/ConfigurationFiles/proftpd/proftpd.log /home/volumio/proftpd # 74 | sudo service proftpd restart # 75 | echo " " # 76 | echo -e "\e[92mAlbum-Art-Tool is activated...\e[0m" # 77 | return 0 # 78 | ;; # 79 | 2) # 80 | sed -i 's/\(NR1UIRemoteActive = \)\(.*\)/\1False/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py 81 | echo " " # 82 | echo -e "\e[92mAlbum-Art-Tool is not active...\e[0m" # 83 | return 0 # 84 | ;; # 85 | *) # 86 | printf %s\\n "Please enter '1' or '2'" # 87 | return 1 # 88 | ;; # 89 | esac # 90 | } # 91 | until getRemote; do : ; done # 92 | cd # 93 | if [[ $CAVATag -eq 1 ]]; 94 | then 95 | echo -e "\e[92mInstalling Cava...\e[0m" # 96 | git clone https://github.com/Maschine2501/cava.git # 97 | cd cava # 98 | sudo bash autogen.sh # 99 | ./configure && make -j4 && sudo make install # 100 | cd # 101 | git clone https://github.com/Maschine2501/cava2.git /home/volumio/CAVAinstall # 102 | cd /home/volumio/CAVAinstall # 103 | sudo bash ./autogen.sh # 104 | ./configure --prefix=/home/volumio/CAVA2 && make -j4 && sudo make install # 105 | cd # 106 | sudo cp /home/volumio/NR1-UI/service-files/cava1.service /lib/systemd/system/ # 107 | sudo cp /home/volumio/NR1-UI/service-files/cava2.service /lib/systemd/system/ # 108 | sudo systemctl daemon-reload # 109 | sudo systemctl enable cava1.service # 110 | sudo systemctl enable cava2.service # 111 | fi 112 | if [[ $CAVATag -eq 1 ]]; 113 | then 114 | sudo sudo cp /home/volumio/NR1-UI/ConfigurationFiles/mpd.conf.tmpl /volumio/app/plugins/music_service/mpd # 115 | echo " " # 116 | echo " " # 117 | echo -e "\e[92mFifo-Audio-Outputs for Cava has been added to mpd.conf\e[0m" # 118 | echo " " # 119 | echo " " # 120 | sudo service mpd restart # 121 | fi 122 | echo "_________________________________________________________________ " # 123 | echo " " # 124 | echo " " # 125 | echo -e "\e[4;92mPlease select your Display-Type.\e[0;0m" # 126 | echo " " # 127 | echo " " # 128 | echo "_____________________ " # 129 | echo -e "\e[93mValid selections are:\e[0m" # 130 | echo -e "1 -> for \e[92mssd1306\e[0m" # 131 | echo -e "2 -> for \e[92mssd1322\e[0m" # 132 | echo -e "3 -> for \e[92mBraun-specific\e[0m" # 133 | echo -e "\e[93m---> \e[0m" # 134 | getDisplayType() { # 135 | read -p "Enter your decision: " DisplayNumber # 136 | case "$DisplayNumber" in # 137 | 1) # 138 | sed -i 's/\(DisplayTechnology = \)\(.*\)/\1"'"i2c1306"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 139 | echo " " # 140 | echo -e "\e[92mSet Display-Type as ssd1306\e[0m" # 141 | return 0 # 142 | ;; # 143 | 2) # 144 | sed -i 's/\(DisplayTechnology = \)\(.*\)/\1"'"spi1322"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 145 | echo " " # 146 | echo -e "\e[92mSet Display-Type as ssd1322\e[0m" # 147 | return 0 # 148 | ;; # 149 | 3) # 150 | sed -i 's/\(DisplayTechnology = \)\(.*\)/\1"'"Braun"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 151 | echo " " # 152 | echo -e "\e[92mSet Display-Type as Braun-Specific\e[0m" # 153 | return 0 # 154 | ;; # 155 | *) # 156 | printf %s\\n "Please enter '1' or '2' or '3'" # 157 | return 1 # 158 | ;; # 159 | esac # 160 | } # 161 | until getDisplayType; do : ; done # 162 | echo "_________________________________________________________________ " # 163 | echo " " # 164 | getScreenLayout1306() { # 165 | read -p "Enter your decision: " DisplayNumber # 166 | case "$DisplayNumber" in # 167 | 1) # 168 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"Spectrum-Screen"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 169 | echo "Spectrum-Screen" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 170 | echo " " # 171 | echo -e "\e[92mSet Layout as Spectrum-Screen\e[0m" # 172 | return 0 # 173 | ;; # 174 | 2) # 175 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"Progress-Bar"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 176 | echo "Progress-Bar" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 177 | echo " " # 178 | echo -e "\e[92mSet Layout as Progress-Bar\e[0m" # 179 | return 0 # 180 | ;; # 181 | *) # 182 | printf %s\\n "Please enter a number between '1' and '2'" # 183 | return 1 # 184 | ;; # 185 | esac # 186 | } # 187 | getScreenLayout1322() { # 188 | read -p "Enter your decision: " DisplayNumber # 189 | case "$DisplayNumber" in # 190 | 1) # 191 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"Spectrum-Left"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 192 | echo "Spectrum-Left" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 193 | echo " " # 194 | echo -e "\e[92mSet Screen Layout as Spectrum-Left\e[0m" # 195 | return 0 # 196 | ;; # 197 | 2) # 198 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"Spectrum-Center"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 199 | echo "Spectrum-Center" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 200 | echo " " # 201 | echo -e "\e[92mSet Screen Layout as Spectrum-Center\e[0m" # 202 | return 0 # 203 | ;; # 204 | 3) # 205 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"Spectrum-Right"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 206 | echo "Spectrum-Right" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 207 | echo " " # 208 | echo -e "\e[92mSet Screen Layout as Spcetrum-Right\e[0m" # 209 | return 0 # 210 | ;; # 211 | 4) # 212 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"No-Spectrum"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 213 | echo "No-Spectrum" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 214 | echo " " # 215 | echo -e "\e[92mSet Screen Layout as No-Spectrum\e[0m" # 216 | return 0 # 217 | ;; # 218 | 5) # 219 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"Modern"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 220 | echo "" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 221 | echo " " # 222 | echo -e "\e[92mSet Screen Layout as Modern\e[0m" # 223 | return 0 # 224 | ;; # 225 | 6) # 226 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"VU-Meter-1"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 227 | echo "VU-Meter-1" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 228 | echo " " # 229 | echo -e "\e[92mSet Screen Layout as VU-Meter-1\e[0m" # 230 | return 0 # 231 | ;; # 232 | 7) # 233 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"VU-Meter-2"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 234 | echo "VU-Meter-2" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 235 | echo " " # 236 | echo -e "\e[92mSet Screen Layout as VU-Meter-2\e[0m" # 237 | return 0 # 238 | ;; # 239 | 8) # 240 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"VU-Meter-Bar"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 241 | echo "VU-Meter-Bar" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 242 | echo " " # 243 | echo -e "\e[92mSet Screen Layout as VU-Meter-Bar\e[0m" # 244 | return 0 # 245 | ;; # 246 | 9) # 247 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"Modern-simplistic"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 248 | echo "Modern-simplistic" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 249 | echo " " # 250 | echo -e "\e[92mSet Screen Layout as Modern-simplistic\e[0m" # 251 | return 0 # 252 | ;; # 253 | *) # 254 | printf %s\\n "Please enter a number between '1' and '9'" # 255 | return 1 # 256 | ;; # 257 | esac # 258 | } # 259 | if [[ $CAVATag -eq 2 && $DisplayNumber -eq 1 ]]; 260 | then # 261 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"Progress-Bar"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 262 | echo "Progress-Bar" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 263 | fi 264 | if [[ $CAVATag -eq 2 && $DisplayNumber -eq 2 ]]; 265 | then 266 | #else 267 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"No-Spectrum"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 268 | echo "No-Spectrum" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 269 | fi # 270 | if [[ $CAVATag -eq 1 ]]; 271 | then 272 | echo "" # 273 | echo -e "\e[4;92mPlease select your Screen Layout.\e[0;;0m" # 274 | echo ""# 275 | echo -e "\e[93mYou can find Previews/Screenshots here: \e[0m" # 276 | echo -e "\e[93mhttps://github.com/Maschine2501/NR1-UI \e[0m" # 277 | if [ $DisplayNumber -eq 1 ]; # 278 | then # 279 | echo "_____________________" # 280 | echo -e "\e[93mValid selections are:\e[0m" # 281 | echo -e "1 -> \e[92mSpectrum-Screen\e[0m" # 282 | echo -e "2 -> \e[92mProgress-Bar\e[0m" # 283 | echo -e "\e[93m---> \e[0m" # 284 | until getScreenLayout1306; do : ; done # 285 | else # 286 | echo "_____________________ " # 287 | echo -e "\e[93mValid selections are:\e[0m" # 288 | echo -e "1 -> for \e[92mSpectrum-Left\e[0m" # 289 | echo -e "2 -> for \e[92mSpectrum-Center\e[0m" # 290 | echo -e "3 -> for \e[92mSpectrum-Right\e[0m" # 291 | echo -e "4 -> for \e[92mNo-Spectrum\e[0m" # 292 | echo -e "5 -> for \e[92mModern\e[0m" # 293 | echo -e "6 -> for \e[92mVU-Meter-1\e[0m" # 294 | echo -e "7 -> for \e[92mVU-Meter-2\e[0m" # 295 | echo -e "8 -> for \e[92mVU-Meter-Bar\e[0m" # 296 | echo -e "9 -> for \e[92mModern-simplistic\e[0m" # 297 | echo -e "\e[93m---> \e[0m" # 298 | until getScreenLayout1322; do : ; done # 299 | fi 300 | fi # 301 | if [[ $CAVATag -eq 2 ]]; # 302 | then # 303 | if [ $DisplayNumber -eq 1 ]; 304 | then # 305 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"Progress-Bar"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 306 | echo "Progress-Bar" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 307 | #fi 308 | #if [ $DisplayNumber -eq 2 ]; # 309 | else 310 | sed -i 's/\(NowPlayingLayout = \)\(.*\)/\1"'"No-Spectrum"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 311 | echo "No-Spectrum" > /home/volumio/NR1-UI/ConfigurationFiles/LayoutSet.txt # 312 | fi 313 | fi # 314 | echo "_________________________________________________________________ " # 315 | echo " " # 316 | echo -e "\e[4;92mShould the Display be rotated? \e[0;0m" # 317 | echo " " # 318 | echo "_____________________ " # 319 | echo -e "\e[93mValid selections are:\e[0m" # 320 | echo -e "1 -> \e[92mDisplay not rotated\e[0m" # 321 | echo -e "2 -> \e[92mDisplay rotated 180 degrees \e[0m" # 322 | echo -e "\e[93m---> \e[0m" # 323 | getDisplayRotation() { # 324 | read -p "Enter your decision: " RotationNumber # 325 | case "$RotationNumber" in # 326 | 1) # 327 | sed -i 's/\(oledrotation = \)\(.*\)/\10/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 328 | echo " " # 329 | echo -e "\e[92mSet Display-Rotation to zero Rotation.\e[0m" # 330 | return 0 # 331 | ;; # 332 | 2) # 333 | sed -i 's/\(oledrotation = \)\(.*\)/\12/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 334 | echo " " # 335 | echo -e "\e[92mSet Display-Rotation to 180 degrees Rotation\e[0m" # 336 | return 0 # 337 | ;; # 338 | *) # 339 | printf %s\\n "Please enter '1' or '2'" # 340 | return 1 # 341 | ;; # 342 | esac # 343 | } # 344 | until getDisplayRotation; do : ; done # 345 | echo "_________________________________________________________________ " # 346 | echo " " # 347 | echo -e "\e[4;92mDo you use LED's?\e[0m" # 348 | echo " " # 349 | echo -e "\e[93mMore informations here: \e[0m" # 350 | echo -e "\e[93mhttps://github.com/Maschine2501/NR1-UI/wiki/LED-Wiring \e[0m" # 351 | echo " " # 352 | echo "_____________________ " # 353 | echo -e "\e[93mValid selections are:\e[0m" # 354 | echo -e "1 -> \e[92mYes\e[0m" # 355 | echo -e "2 -> \e[91mNo\e[0m" # 356 | echo -e "\e[93m---> \e[0m" # 357 | getLEDUsage() { # 358 | read -p "Enter your decision: " LEDUsageNumber # 359 | case "$LEDUsageNumber" in # 360 | 1) # 361 | sed -i 's/\(ledActive = \)\(.*\)/\1True/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 362 | echo " " # 363 | echo -e "\e[92mActivated LED-Option\e[0m" # 364 | return 0 # 365 | ;; # 366 | 2) # 367 | sed -i 's/\(ledActive = \)\(.*\)/\1False/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 368 | sed -i 's/\(ledTechnology = \)\(.*\)/\1None/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 369 | echo " " # 370 | echo -e "\e[92mDeactivated LED-Option\e[0m" # 371 | return 0 # 372 | ;; # 373 | *) # 374 | printf %s\\n "Please enter '1' or '2'" # 375 | return 1 # 376 | ;; # 377 | esac # 378 | } # 379 | until getLEDUsage; do : ; done # 380 | getLEDType() { # 381 | read -p "Enter your decision: " LEDTypeNumber # 382 | case "$LEDTypeNumber" in # 383 | 1) # 384 | sed -i 's/\(ledTechnology = \)\(.*\)/\1"'"GPIOusage"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 385 | echo -e "\e[92mActivated LED-Type: GPIO\e[0m" # 386 | return 0 # 387 | ;; # 388 | 2) # 389 | sed -i 's/\(ledTechnology = \)\(.*\)/\1"'"pcf8574usage"'"/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 390 | echo -e "\e[92mActivated LED-Type: PCF8574\e[0m" # 391 | echo " " # 392 | echo " " # 393 | /bin/bash /home/volumio/NR1-UI/pcf-i2c-adress-config.sh 394 | return 0 # 395 | ;; # 396 | *) # 397 | printf %s\\n "Please enter '1' or '2'" # 398 | return 1 # 399 | ;; # 400 | esac # 401 | } # 402 | if [ $LEDUsageNumber -eq 1 ]; then # 403 | echo "_________________________________________________________________ " # 404 | echo " " # 405 | echo -e "\e[4;92mPlease select your LED Technology:\e[0;0m" # 406 | echo " " # 407 | echo -e "\e[93mMore informations here: \e[0m" # 408 | echo -e "\e[93mhttps://github.com/Maschine2501/NR1-UI/wiki/LED-Wiring \e[0;0m" # 409 | echo " " # 410 | echo "_____________________" # 411 | echo -e "\e[93mValid selections are:\e[0m" # 412 | echo -e "1 -> \e[92mif you connect LED's directly to the GPIO's of the Raspberry\e[0m" # 413 | echo -e "2 -> \e[92mif you use an PCF8574 i2c device\e[0m" # 414 | echo -e "\e[93m---> \e[0m" # 415 | until getLEDType; do : ; done # 416 | fi # 417 | echo "_________________________________________________________________ " # 418 | echo " " # 419 | echo -e "\e[4;92mDo you use the Standby-Circuit?\e[0;0m" # 420 | echo " " # 421 | echo -e "\e[93mMore informations here: \e[0m" # 422 | echo -e "\e[93mhttps://github.com/Maschine2501/NR1-UI/wiki/Standby-Module \e[0;0m" # 423 | echo " " # 424 | echo -e "\e[4;91mWARNING: Do not select YES if you do not have connected the circuit!!!\e[0;0m" # 425 | echo " " # 426 | echo "______________________ " # 427 | echo -e "\e[93mValid selections are:\e[0m" # 428 | echo -e "1 -> \e[92mYes\e[0m" # 429 | echo -e "2 -> \e[91mNo\e[0m" # 430 | echo -e "\e[93m----> \e[0m" # 431 | StandbyUsage() { # 432 | read -p "Enter your decision: " StandbyNumber # 433 | case "$StandbyNumber" in # 434 | 1) # 435 | sed -i 's/\(StandbyActive = \)\(.*\)/\1True/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 436 | echo "dtoverlay=gpio-shutdown" >> /boot/userconfig.txt # 437 | echo " " # 438 | echo -e "\e[92mActivated Standby-Function\e[0m" # 439 | return 0 # 440 | ;; # 441 | 2) # 442 | sed -i 's/\(StandbyActive = \)\(.*\)/\1False/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 443 | echo " " # 444 | echo -e "\e[92mDeactivated Standby-Function\e[0m" # 445 | return 0 # 446 | ;; # 447 | *) # 448 | printf %s\\n "Please enter '1' or '2'" # 449 | return 1 # 450 | ;; # 451 | esac # 452 | } # 453 | until StandbyUsage; do : ; done # 454 | echo "_________________________________________________________________ " # 455 | echo " " # 456 | echo -e "\e[4;92mPlease select your Button- / Rotary- configuration\e[0;0m" # 457 | echo " " # 458 | echo -e "\e[93m*standard*-configuration means a conection like this: \e[0m" # 459 | echo -e "\e[93mhttps://raw.githubusercontent.com/Maschine2501/NR1-UI/master/wiki/wiring/Wiring.jpg\e[0m" # 460 | echo " " # 461 | echo "_____________________" # 462 | echo -e "\e[93mValid selections are:\e[0m" # 463 | echo -e "\e[92m1 -> standard\e[0m" # 464 | echo -e "\e[91m2 -> custom\e[0m" # 465 | echo -e "\e[93m--->\e[0m" # 466 | getGPIONumberA() { # 467 | read -p "Please enter the BCM Number for Button A :" ANumber # 468 | case "$ANumber" in # 469 | 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27) # 470 | sed -i "s/\(oledBtnA = \)\(.*\)/\1$ANumber/" /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 471 | echo " " # 472 | return 0 # 473 | ;; # 474 | *) # 475 | printf %s\\n "Number was out of range...(must be 0-27)" # 476 | return 1 # 477 | ;; # 478 | esac # 479 | } # 480 | getGPIONumberB() { # 481 | read -p "Please enter the BCM Number for Button B :" BNumber # 482 | case "$BNumber" in # 483 | 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27) # 484 | sed -i "s/\(oledBtnB = \)\(.*\)/\1$BNumber/" /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 485 | echo " " # 486 | return 0 # 487 | ;; # 488 | *) # 489 | printf %s\\n "Number was out of range...(must be 0-27)" # 490 | return 1 # 491 | ;; # 492 | esac # 493 | } # 494 | getGPIONumberC() { # 495 | read -p "Please enter the BCM Number for Button C :" CNumber # 496 | case "$CNumber" in # 497 | 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27) # 498 | sed -i "s/\(oledBtnC = \)\(.*\)/\1$CNumber/" /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 499 | echo " " # 500 | return 0 # 501 | ;; # 502 | *) # 503 | printf %s\\n "Number was out of range...(must be 0-27)" # 504 | return 1 # 505 | ;; # 506 | esac # 507 | } # 508 | getGPIONumberD() { # 509 | read -p "Please enter the BCM Number for Button D :" DNumber # 510 | case "$DNumber" in # 511 | 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27) # 512 | sed -i "s/\(oledBtnD = \)\(.*\)/\1$DNumber/" /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 513 | echo " " # 514 | return 0 # 515 | ;; # 516 | *) # 517 | printf %s\\n "Number was out of range...(must be 0-27)" # 518 | return 1 # 519 | ;; # 520 | esac # 521 | } # 522 | getGPIONumberL() { # 523 | read -p "Please enter the BCM Number for Rotary-Left :" LNumber # 524 | case "$LNumber" in # 525 | 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27) # 526 | sed -i "s/\(oledRtrLeft = \)\(.*\)/\1$LNumber/" /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 527 | echo " " # 528 | return 0 # 529 | ;; # 530 | *) # 531 | printf %s\\n "Number was out of range...(must be 0-27)" # 532 | return 1 # 533 | ;; # 534 | esac # 535 | } # 536 | getGPIONumberR() { # 537 | read -p "Please enter the BCM Number for Rotary-Right :" RNumber # 538 | case "$RNumber" in # 539 | 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27) # 540 | sed -i "s/\(oledRtrRight = \)\(.*\)/\1$RNumber/" /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 541 | echo " " # 542 | return 0 # 543 | ;; # 544 | *) # 545 | printf %s\\n "Number was out of range...(must be 0-27)" # 546 | return 1 # 547 | ;; # 548 | esac # 549 | } # 550 | getGPIONumberRB() { # 551 | read -p "Please enter the BCM Number for Rotary-Button :" RBNumber # 552 | case "$RBNumber" in # 553 | 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27) # 554 | sed -i "s/\(oledRtrBtn = \)\(.*\)/\1$RBNumber/" /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 555 | echo " " # 556 | return 0 # 557 | ;; # 558 | *) # 559 | printf %s\\n "Number was out of range...(must be 0-27)" # 560 | return 1 # 561 | ;; # 562 | esac # 563 | } 564 | getButtonLayout() { # 565 | read -p "Enter your decision: " ButonNumber # 566 | case "$ButonNumber" in # 567 | 1) # 568 | sed -i 's/\(oledBtn = \)\(.*\)/\14/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 569 | sed -i 's/\(oledBtn = \)\(.*\)/\117/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 570 | sed -i 's/\(oledBtn = \)\(.*\)/\15/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 571 | sed -i 's/\(oledBtn = \)\(.*\)/\16/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 572 | sed -i 's/\(oledRtrLeft = \)\(.*\)/\122/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 573 | sed -i 's/\(oledRtrRight = \)\(.*\)/\123/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 574 | sed -i 's/\(oledRtrBtn = \)\(.*\)/\127/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 575 | echo " " # 576 | echo -e "\e[92mSet standard-buttonlayout\e[0m" # 577 | return 0 # 578 | ;; # 579 | 2) # 580 | echo -e "\e[4;92mPlease Enter the BCM-(GPIO) Number for each Button.\e[0;0m" # 581 | echo " " # 582 | echo -e "\e[93mFor BCM2 enter 2, for BCM17 enter 17...\e[0m" # 583 | echo -e "\e[93mBCM-list: https://de.pinout.xyz/#\e[0m" # 584 | echo " " # 585 | echo -e "\e[91mthe input is not filtered!!!\e[0m" # 586 | echo -e "\e[91m-> if you enter something wrong, something wrong will happen!\e[0m" # 587 | echo " " # 588 | until getGPIONumberA; do : ; done # 589 | until getGPIONumberB; do : ; done # 590 | until getGPIONumberC; do : ; done # 591 | until getGPIONumberD; do : ; done # 592 | until getGPIONumberL; do : ; done # 593 | until getGPIONumberR; do : ; done # 594 | until getGPIONumberRB; do : ; done # 595 | echo " " # 596 | echo -e "\e[92mSet custom-buttonlayout\e[0m" # 597 | return 0 # 598 | ;; # 599 | *) # 600 | printf %s\\n "Please enter '1' or '2'" # 601 | return 1 # 602 | ;; # 603 | esac # 604 | } # 605 | until getButtonLayout; do : ; done # 606 | echo "_________________________________________________________________" # 607 | echo " " # 608 | echo -e "\e[4;92mPlease enter a Value for Pause -> to -> Stop -Time.\e[0;0m" # 609 | echo " " # 610 | echo -e "\e[93mValue is in Seconds = 15 = 15 Seconds.\e[0m" # 611 | echo -e "\e[93mAfter this time, while playback is paused, player will Stop and return to Standby-Screen.\e[0;0m" # 612 | echo " " # 613 | echo "____________________________________________ " # 614 | echo -e "\e[93mValid values are numbers between 1 and 86400\e[0m" # 615 | echo -e "\e[93m86400 seconds are 24 hours...\e[0m" # 616 | echo " " # 617 | getPlay2PauseTime() { # 618 | read -p "Enter a Time (in seconds): " Play2PauseT # 619 | case "$Play2PauseT" in # 620 | [1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-8][0-6][0-3][0-9][0-9]|86400) # 621 | sed -i "s/\(oledPause2StopTime = \)\(.*\)/\1$Play2PauseT.0/" /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 622 | echo " " # 623 | echo -n "Set Play-to-Pause timer to "; echo -n "${Play2PauseT} "; echo -n "seconds" # 624 | return 0 # 625 | ;; # 626 | *) # 627 | printf %s\\n "Please enter a number between '1' and '86400'" # 628 | return 1 # 629 | ;; # 630 | esac # 631 | } # 632 | until getPlay2PauseTime; do : ; done # 633 | echo " " # 634 | echo " " # 635 | echo " " # 636 | echo " " # 637 | echo -e "\e[4;92mConfiguration has finished, congratulations!\e[0;0m" # 638 | echo " " # 639 | echo " " # 640 | echo -e "\e[93mPlease have a look in the Installation instructions to finish setup.\e[0m" # 641 | echo " " # 642 | echo -e "\e[93mhttps://github.com/Maschine2501/NR1-UI/wiki/Installation-Steps-(for-Python3.8.5-Version---Bash-Script)\e[0m" # 643 | echo " " # 644 | echo " " # 645 | echo -e "\e[25;91mIf you use CAVA/Spectrum: \e[0;0m" # 646 | echo " " # 647 | echo -e "\e[91mPlease set Audio-Output to HDMI or Headphones and save setting.\e[0m" # 648 | echo -e "\e[91mNow Select your DAC/Playback device and save aggain.\e[0m" # 649 | exit 0 # -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Inspired by: [diehardsk/Volumio-OledUI](https://github.com/diehardsk/Volumio-OledUI) // 2 | This is the Python3 version of [Maschine2501/Volumio-OledUI](https://github.com/Maschine2501/Volumio-OledUI/) 3 | 4 | # 18.10.2022: The Journey came to an End. 5 | ### I wont push this project any further, cause I do not longer use Volumio. Feel free to fork this Project. I'll leave the Discord Chanel open for you, so you can reach out for each others support. 6 | 7 | ## It was a great time, Thank you! <3 8 | 9 | # 27.03.2022 Volumio 3.xx is now supported: 10 | Today I fixed the installation routine for the new Volumio 3.xx. 11 | I tested the Installation script twice on a fresh installed RPi4 -> Succeeded both times. 12 | If you have an issue, please report it :) 13 | Here is the instruction for the Installation: [Install-Manuall for Volumio 3.xx NR1-UI](https://github.com/Maschine2501/NR1-UI/wiki/Volumio-Buster-Installation) 14 | 15 | ## Supported Displays: 16 | - [x] SSD1306 (monochrome Oled 128x64) 17 | - [x] SSD1322 (grayscale Oled 256x64) 18 | - [x] SSD1351 (full color Oled 128x128) 19 | - [x] ST7735 (full color LCD 160x128) 20 | 21 | ## Wishlist/To-Do: 22 | - [ ] ILI9341 (Maybe ILI9488) display support(Alpha-phase) 23 | 24 | - [ ] SSD1309 (monochrome Oled 128x64) 25 | - [ ] BGR / RGB Selection for ssd1351 displays 26 | - [ ] Sort out / Clean up Setup 27 | - [ ] Investigate Problem with some DAC's 28 | - [ ] Implement Volume Control 29 | - [ ] Implement Source Dialog 30 | - [ ] Implement a "Settings Menu" 31 | 32 | 33 | 34 | # NR1-UI 35 | Im building a Network Hifi Receiver from scratch. Main components are a RaspberryPi4 and an HiFi-Berry-Dac. An old Braun T2 Tuner serves as case for the player. 36 | To keep as much as possible from the look of the device I needed an Interface for Volumio. And especialy one that supports a 3,2" ssd1322 SPI Oled with 256x64Pixel. 37 | After doing some research I found diehrdsk/Volumio-OledUI. It fullfills many points on my "wishlist" but not nearly all. 38 | As we all know, the way is the destination, i spent some time (much time....) in modifying the original code. 39 | The project is not finished yet... but close the the goal! 40 | 41 | I try to assist you, if you got questions or even problems with the code, just contact me. 42 | 43 | Time by time more informations in the [wiki](https://github.com/Maschine2501/NR1-UI/wiki) will follow... 44 | 45 | ## The Code is modular and has a Setup-Process. 46 | 47 | #### [Features](https://github.com/Maschine2501/NR1-UI/wiki/Features) 48 | 49 | 50 | #### [Allready Done](https://github.com/Maschine2501/NR1-UI/wiki/Allready-Done) 51 | 52 | 53 | #### [Project on Volumio-Forum](https://community.volumio.org/t/oled-user-inteface-for-volumio-with-rotary-and-4-buttons-modular-highly-configurable-supports-ssd1306-and-ssd1322/40378?u=maschine2501) 54 | 55 | --- 56 | 57 | ## [1. Installation steps](https://github.com/Maschine2501/NR1-UI/wiki/Volumio-Buster-Installation) 58 | --- 59 | 60 | #### Configuration Manual (will follow soon!) 61 | --- 62 | 63 | #### [wiring / button-layout / truthtable](https://github.com/Maschine2501/NR1-UI/wiki/wiring-and-button-truth-table) 64 | --- 65 | 66 | #### [hardware](https://github.com/Maschine2501/NR1-UI/wiki/hardware) 67 | --- 68 | 69 | #### [dependencies](https://github.com/Maschine2501/NR1-UI/wiki/dependencies) 70 | --- 71 | 72 | #### [font-info and source](https://github.com/Maschine2501/NR1-UI/wiki/font-information-(source)) 73 | --- 74 | 75 | ## Your Display is not supported yet? You have an idea for a function/feature? 76 | ### -> Contact me: 77 | #### [E-Mail](mailto:Maschine2501@gmx.de?subject=[GitHub]%20Source%20Han%20Sans) 78 | #### [Discord Server for direct contact: Click here to join...](https://discord.gg/GJ4ED3F) 79 | 80 | 81 | ### To change the look/layout just press Button-C in "Standby-Screen" (Clock), select the desired Layout with the Rotary-Rotation and push the Rotary once to apply selection -> 82 | ![Screenselect](https://github.com/Maschine2501/NR1-UI/blob/master/wiki/screenshots/ssd1322Screenselect.png) 83 | 84 | ### Screenshots and Layout Overview: 85 | ![Screenshots](https://github.com/Maschine2501/NR1-UI/blob/master/wiki/screenshots/Screenshots.png) 86 | 87 | ### [buy me a coffee, or tip me ;-)](https://paypal.me/maschine2501) 88 | 89 | ![MS2501](https://github.com/Maschine2501/NR1-UI/blob/master/wiki/MadeByGloria.jpg) 90 | [Logo made by glorious @Klassik_Otaku](http://www.instagram.com/klassik_otaku) 91 | 92 | -------------------------------------------------------------------------------- /Standby ATTiny85/Braun-NR1-StandBy.ino: -------------------------------------------------------------------------------- 1 | // ____ ____ ______ _____ _______ ____ __ 2 | // |_ \ / _|.´ ____ \ / ___ `.| _____| .' '. / | 3 | // | \/ | | (___ \_||_/___) || |____ | .--. |`| | 4 | // | |\ /| | _.____'. .'____.''_.____''.| | | | | | 5 | // _| |_\/_| |_ | \____\ \/ /_____ | \____) || `--' |_| |_ 6 | // |_____||_____| \_______||_______| \______.' '.____.'|_____| 7 | // 8 | // www.github.com/Maschine2501 9 | // 10 | // ATTINY85 <-> RaspberryPI StandBy-Logic 11 | // For more Informations visit: https://github.com/Maschine2501/NR1-UI 12 | // 13 | 14 | int Relais = 0; // PB0 -> connected to base of BC548 (circuit under: www.github.com/Maschine2501/NR1-UI/wiki/ ) 15 | int PiStatusSend = 1; // PB1 -> connected to pin 37 (GPIO26) @ raspberry 16 | int Button = 2; // PB2 -> connected to powerbutton (other side +5V) 17 | int PiStatusReceive = 4 ; // PB4 -> connected to pin 33 (GPIO13) @ raspberry 18 | 19 | // Start Variables: 20 | boolean PRS = LOW; // Previous state of therelais 21 | boolean NRS = LOW; // New state of the relais 22 | boolean RS = LOW; // Actuall state of the relais 23 | boolean PS = LOW; // Actuall state of the raspberry 24 | boolean PPS = LOW; // Previous state of the raspberry 25 | boolean NPS = LOW; // New state of the raspberry 26 | 27 | 28 | void setup() 29 | { 30 | pinMode(Relais, OUTPUT); 31 | digitalWrite(Relais, LOW); 32 | 33 | pinMode(PiStatusSend, OUTPUT); 34 | digitalWrite(PiStatusSend, LOW); 35 | 36 | pinMode(Button, INPUT); 37 | 38 | pinMode(PiStatusReceive, INPUT); 39 | } 40 | 41 | void loop() 42 | { 43 | NRS = digitalRead(Button); 44 | 45 | NPS = digitalRead(PiStatusReceive); 46 | 47 | if ( NRS != PRS || NPS != PPS ) 48 | { 49 | if ( NRS == HIGH || NPS == LOW ) 50 | { 51 | if ( RS == LOW ) { // Start Point -> Everything is off/low -> button is pressed 52 | digitalWrite(Relais, HIGH); // Set Relais HIGH 53 | digitalWrite(PiStatusSend, HIGH); // Set PiStatusSend HIGH 54 | delay(80000); // wait 80sec for pi to boot 55 | RS = HIGH; 56 | } 57 | else if ( NPS == LOW ){ // if Relais is on and pi signal is low (pi is shutdown) 58 | delay(30000); // wait 30sec for pi to boot 59 | NPS = digitalRead(PiStatusReceive); // check aggain if pi is off 60 | if ( NPS == LOW ) { 61 | digitalWrite(PiStatusSend, LOW); // Set PiStatusSend LOW 62 | digitalWrite(Relais, LOW); // Set Relais LOW 63 | RS = LOW; 64 | PS = LOW; 65 | } 66 | else { 67 | PS = HIGH; 68 | } 69 | } 70 | else { // If PI an Relais is on and Button is pressed. 71 | digitalWrite(PiStatusSend, LOW); // Set PiStatusSend LOW 72 | delay(30000); // wait 30 Sec to shutdown all services on your Pi 73 | if ( NPS == LOW ) { 74 | digitalWrite(Relais, LOW); // Set Relais LOW 75 | RS = LOW; 76 | PS = LOW; 77 | } 78 | else { 79 | PS = HIGH; 80 | } 81 | } 82 | 83 | } 84 | PRS = NRS; 85 | PPS = NPS; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /Standby ATTiny85/standby.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/Standby ATTiny85/standby.jpg -------------------------------------------------------------------------------- /Standby ATTiny85/stdby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/Standby ATTiny85/stdby.png -------------------------------------------------------------------------------- /fonts/DSEG7Classic-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/DSEG7Classic-Regular.ttf -------------------------------------------------------------------------------- /fonts/DSG.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/DSG.ttf -------------------------------------------------------------------------------- /fonts/FONT_LICENSE.txt: -------------------------------------------------------------------------------- 1 | https://fonts.google.com/specimen/Noto+Sans+TC?preview.text_type=custom#about 2 | https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | https://www.google.com/get/noto/help/cjk/ 4 | https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 5 | 6 | 7 | Apache License 8 | Version 2.0, January 2004 9 | http://www.apache.org/licenses/ 10 | 11 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 12 | 13 | 1. Definitions. 14 | 15 | "License" shall mean the terms and conditions for use, reproduction, 16 | and distribution as defined by Sections 1 through 9 of this document. 17 | 18 | "Licensor" shall mean the copyright owner or entity authorized by 19 | the copyright owner that is granting the License. 20 | 21 | "Legal Entity" shall mean the union of the acting entity and all 22 | other entities that control, are controlled by, or are under common 23 | control with that entity. For the purposes of this definition, 24 | "control" means (i) the power, direct or indirect, to cause the 25 | direction or management of such entity, whether by contract or 26 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 27 | outstanding shares, or (iii) beneficial ownership of such entity. 28 | 29 | "You" (or "Your") shall mean an individual or Legal Entity 30 | exercising permissions granted by this License. 31 | 32 | "Source" form shall mean the preferred form for making modifications, 33 | including but not limited to software source code, documentation 34 | source, and configuration files. 35 | 36 | "Object" form shall mean any form resulting from mechanical 37 | transformation or translation of a Source form, including but 38 | not limited to compiled object code, generated documentation, 39 | and conversions to other media types. 40 | 41 | "Work" shall mean the work of authorship, whether in Source or 42 | Object form, made available under the License, as indicated by a 43 | copyright notice that is included in or attached to the work 44 | (an example is provided in the Appendix below). 45 | 46 | "Derivative Works" shall mean any work, whether in Source or Object 47 | form, that is based on (or derived from) the Work and for which the 48 | editorial revisions, annotations, elaborations, or other modifications 49 | represent, as a whole, an original work of authorship. For the purposes 50 | of this License, Derivative Works shall not include works that remain 51 | separable from, or merely link (or bind by name) to the interfaces of, 52 | the Work and Derivative Works thereof. 53 | 54 | "Contribution" shall mean any work of authorship, including 55 | the original version of the Work and any modifications or additions 56 | to that Work or Derivative Works thereof, that is intentionally 57 | submitted to Licensor for inclusion in the Work by the copyright owner 58 | or by an individual or Legal Entity authorized to submit on behalf of 59 | the copyright owner. For the purposes of this definition, "submitted" 60 | means any form of electronic, verbal, or written communication sent 61 | to the Licensor or its representatives, including but not limited to 62 | communication on electronic mailing lists, source code control systems, 63 | and issue tracking systems that are managed by, or on behalf of, the 64 | Licensor for the purpose of discussing and improving the Work, but 65 | excluding communication that is conspicuously marked or otherwise 66 | designated in writing by the copyright owner as "Not a Contribution." 67 | 68 | "Contributor" shall mean Licensor and any individual or Legal Entity 69 | on behalf of whom a Contribution has been received by Licensor and 70 | subsequently incorporated within the Work. 71 | 72 | 2. Grant of Copyright License. Subject to the terms and conditions of 73 | this License, each Contributor hereby grants to You a perpetual, 74 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 75 | copyright license to reproduce, prepare Derivative Works of, 76 | publicly display, publicly perform, sublicense, and distribute the 77 | Work and such Derivative Works in Source or Object form. 78 | 79 | 3. Grant of Patent License. Subject to the terms and conditions of 80 | this License, each Contributor hereby grants to You a perpetual, 81 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 82 | (except as stated in this section) patent license to make, have made, 83 | use, offer to sell, sell, import, and otherwise transfer the Work, 84 | where such license applies only to those patent claims licensable 85 | by such Contributor that are necessarily infringed by their 86 | Contribution(s) alone or by combination of their Contribution(s) 87 | with the Work to which such Contribution(s) was submitted. If You 88 | institute patent litigation against any entity (including a 89 | cross-claim or counterclaim in a lawsuit) alleging that the Work 90 | or a Contribution incorporated within the Work constitutes direct 91 | or contributory patent infringement, then any patent licenses 92 | granted to You under this License for that Work shall terminate 93 | as of the date such litigation is filed. 94 | 95 | 4. Redistribution. You may reproduce and distribute copies of the 96 | Work or Derivative Works thereof in any medium, with or without 97 | modifications, and in Source or Object form, provided that You 98 | meet the following conditions: 99 | 100 | (a) You must give any other recipients of the Work or 101 | Derivative Works a copy of this License; and 102 | 103 | (b) You must cause any modified files to carry prominent notices 104 | stating that You changed the files; and 105 | 106 | (c) You must retain, in the Source form of any Derivative Works 107 | that You distribute, all copyright, patent, trademark, and 108 | attribution notices from the Source form of the Work, 109 | excluding those notices that do not pertain to any part of 110 | the Derivative Works; and 111 | 112 | (d) If the Work includes a "NOTICE" text file as part of its 113 | distribution, then any Derivative Works that You distribute must 114 | include a readable copy of the attribution notices contained 115 | within such NOTICE file, excluding those notices that do not 116 | pertain to any part of the Derivative Works, in at least one 117 | of the following places: within a NOTICE text file distributed 118 | as part of the Derivative Works; within the Source form or 119 | documentation, if provided along with the Derivative Works; or, 120 | within a display generated by the Derivative Works, if and 121 | wherever such third-party notices normally appear. The contents 122 | of the NOTICE file are for informational purposes only and 123 | do not modify the License. You may add Your own attribution 124 | notices within Derivative Works that You distribute, alongside 125 | or as an addendum to the NOTICE text from the Work, provided 126 | that such additional attribution notices cannot be construed 127 | as modifying the License. 128 | 129 | You may add Your own copyright statement to Your modifications and 130 | may provide additional or different license terms and conditions 131 | for use, reproduction, or distribution of Your modifications, or 132 | for any such Derivative Works as a whole, provided Your use, 133 | reproduction, and distribution of the Work otherwise complies with 134 | the conditions stated in this License. 135 | 136 | 5. Submission of Contributions. Unless You explicitly state otherwise, 137 | any Contribution intentionally submitted for inclusion in the Work 138 | by You to the Licensor shall be under the terms and conditions of 139 | this License, without any additional terms or conditions. 140 | Notwithstanding the above, nothing herein shall supersede or modify 141 | the terms of any separate license agreement you may have executed 142 | with Licensor regarding such Contributions. 143 | 144 | 6. Trademarks. This License does not grant permission to use the trade 145 | names, trademarks, service marks, or product names of the Licensor, 146 | except as required for reasonable and customary use in describing the 147 | origin of the Work and reproducing the content of the NOTICE file. 148 | 149 | 7. Disclaimer of Warranty. Unless required by applicable law or 150 | agreed to in writing, Licensor provides the Work (and each 151 | Contributor provides its Contributions) on an "AS IS" BASIS, 152 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 153 | implied, including, without limitation, any warranties or conditions 154 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 155 | PARTICULAR PURPOSE. You are solely responsible for determining the 156 | appropriateness of using or redistributing the Work and assume any 157 | risks associated with Your exercise of permissions under this License. 158 | 159 | 8. Limitation of Liability. In no event and under no legal theory, 160 | whether in tort (including negligence), contract, or otherwise, 161 | unless required by applicable law (such as deliberate and grossly 162 | negligent acts) or agreed to in writing, shall any Contributor be 163 | liable to You for damages, including any direct, indirect, special, 164 | incidental, or consequential damages of any character arising as a 165 | result of this License or out of the use or inability to use the 166 | Work (including but not limited to damages for loss of goodwill, 167 | work stoppage, computer failure or malfunction, or any and all 168 | other commercial damages or losses), even if such Contributor 169 | has been advised of the possibility of such damages. 170 | 171 | 9. Accepting Warranty or Additional Liability. While redistributing 172 | the Work or Derivative Works thereof, You may choose to offer, 173 | and charge a fee for, acceptance of support, warranty, indemnity, 174 | or other liability obligations and/or rights consistent with this 175 | License. However, in accepting such obligations, You may act only 176 | on Your own behalf and on Your sole responsibility, not on behalf 177 | of any other Contributor, and only if You agree to indemnify, 178 | defend, and hold each Contributor harmless for any liability 179 | incurred by, or claims asserted against, such Contributor by reason 180 | of your accepting any such warranty or additional liability. 181 | 182 | END OF TERMS AND CONDITIONS 183 | 184 | APPENDIX: How to apply the Apache License to your work. 185 | 186 | To apply the Apache License to your work, attach the following 187 | boilerplate notice, with the fields enclosed by brackets "[]" 188 | replaced with your own identifying information. (Don't include 189 | the brackets!) The text should be enclosed in the appropriate 190 | comment syntax for the file format. We also recommend that a 191 | file or class name and description of purpose be included on the 192 | same "printed page" as the copyright notice for easier 193 | identification within third-party archives. 194 | 195 | Copyright [yyyy] [name of copyright owner] 196 | 197 | Licensed under the Apache License, Version 2.0 (the "License"); 198 | you may not use this file except in compliance with the License. 199 | You may obtain a copy of the License at 200 | 201 | http://www.apache.org/licenses/LICENSE-2.0 202 | 203 | Unless required by applicable law or agreed to in writing, software 204 | distributed under the License is distributed on an "AS IS" BASIS, 205 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 206 | See the License for the specific language governing permissions and 207 | limitations under the License. 208 | 209 | -------------------------------------------------------------------------------- /fonts/NotoSansCJK.ttc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/NotoSansCJK.ttc -------------------------------------------------------------------------------- /fonts/NotoSansTC-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/NotoSansTC-Bold.otf -------------------------------------------------------------------------------- /fonts/NotoSansTC-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/NotoSansTC-Light.otf -------------------------------------------------------------------------------- /fonts/NotoSansTC-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/NotoSansTC-Medium.otf -------------------------------------------------------------------------------- /fonts/NotoSansTC-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/NotoSansTC-Regular.otf -------------------------------------------------------------------------------- /fonts/Oxanium-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/Oxanium-Bold.ttf -------------------------------------------------------------------------------- /fonts/Oxanium-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/Oxanium-ExtraBold.ttf -------------------------------------------------------------------------------- /fonts/Oxanium-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/Oxanium-ExtraLight.ttf -------------------------------------------------------------------------------- /fonts/Oxanium-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/Oxanium-Light.ttf -------------------------------------------------------------------------------- /fonts/Oxanium-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/Oxanium-Medium.ttf -------------------------------------------------------------------------------- /fonts/Oxanium-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/Oxanium-Regular.ttf -------------------------------------------------------------------------------- /fonts/Oxanium-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/Oxanium-SemiBold.ttf -------------------------------------------------------------------------------- /fonts/digi.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/digi.ttf -------------------------------------------------------------------------------- /fonts/entypo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/entypo.ttf -------------------------------------------------------------------------------- /fonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/fonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /ftp.sh: -------------------------------------------------------------------------------- 1 | echo "________________________________________________________________________ " # 2 | echo " " # 3 | echo " " # 4 | echo " " # 5 | echo "______________________________________________" # 6 | echo "Do you want to activate Album-Art-Tool for NR1-UI-Remote?" # 7 | echo "______________________________________________" # 8 | echo " " # 9 | echo "More informations under: https://github.com/Maschine2501/NR1-UI-Remote " # 10 | echo " " # 11 | echo " " # 12 | echo "______________________ " # 13 | echo " " # 14 | echo "Valid selections are: " # 15 | echo "1 -> Yes" # 16 | echo "2 -> No" # 17 | echo "--->" # 18 | cd # 19 | getRemote() { # 20 | read -p "Enter your decision: " Remote # 21 | case "$Remote" in # 22 | 1) # 23 | sed -i 's/\(NR1UIRemoteActive = \)\(.*\)/\1True/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py # 24 | sudo apt install proftpd-basic # 25 | sudo cp /home/volumio/NR1-UI/ConfigurationFiles/proftpd/proftpd.conf /etc/proftpd # 26 | sudo cp /home/volumio/NR1-UI/ConfigurationFiles/proftpd/proftp-custom.conf /etc/proftpd/conf.d # 27 | sudo mkdir /home/volumio/proftpd # 28 | sudo chmod 777 /home/volumio/proftpd # 29 | sudo cp /home/volumio/NR1-UI/ConfigurationFiles/proftpd/controls.log /home/volumio/proftpd # 30 | sudo cp /home/volumio/NR1-UI/ConfigurationFiles/proftpd/proftpd.log /home/volumio/proftpd # 31 | sudo service proftpd restart # 32 | echo " " # 33 | echo "Album-Art-Tool is activated..." # 34 | return 0 # 35 | ;; # 36 | 2) # 37 | sed -i 's/\(NR1UIRemoteActive = \)\(.*\)/\1False/' /home/volumio/NR1-UI/ConfigurationFiles/PreConfiguration.py 38 | echo " " # 39 | echo "Album-Art-Tool is not active..." # 40 | return 0 # 41 | ;; # 42 | *) # 43 | printf %s\\n "Please enter '1' or '2'" # 44 | return 1 # 45 | ;; # 46 | esac # 47 | } # 48 | until getRemote; do : ; done # -------------------------------------------------------------------------------- /img/ShutdownScreen1306.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/ShutdownScreen1306.bmp -------------------------------------------------------------------------------- /img/ShutdownScreen1322.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/ShutdownScreen1322.bmp -------------------------------------------------------------------------------- /img/StartScreen1306.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/StartScreen1306.bmp -------------------------------------------------------------------------------- /img/StartScreen1322.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/StartScreen1322.bmp -------------------------------------------------------------------------------- /img/shutdown.ppm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/shutdown.ppm -------------------------------------------------------------------------------- /img/st7735start.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/st7735start.bmp -------------------------------------------------------------------------------- /img/st7735start2.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/st7735start2.bmp -------------------------------------------------------------------------------- /img/st7735stop.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/st7735stop.bmp -------------------------------------------------------------------------------- /img/volumio_logo.ppm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/volumio_logo.ppm -------------------------------------------------------------------------------- /img/vu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/vu.png -------------------------------------------------------------------------------- /img/vu1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/vu1.png -------------------------------------------------------------------------------- /img/vu2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/vu2.png -------------------------------------------------------------------------------- /img/vudig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/img/vudig.png -------------------------------------------------------------------------------- /modules/StatusLEDempty.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin//python3 2 | 3 | import sys 4 | import os 5 | from time import sleep 6 | import psutil 7 | 8 | 9 | def SysStart(): 10 | print('System started...)') 11 | sleep(0.5) 12 | 13 | def CPUload(): 14 | while True: 15 | CPUpercent = psutil.cpu_percent(interval=0.2, percpu=False) 16 | if CPUpercent > 75: 17 | print('CPU Load over 75%') 18 | sleep(10) 19 | elif CPUpercent > 50 : 20 | print('CPU Load between 75perc. and 50perc.%') 21 | sleep(10) 22 | elif CPUpercent > 25: 23 | print('CPU Load between 50perc. and 25perc.%') 24 | sleep(10) 25 | elif CPUpercent > 10: 26 | print('CPU Load between 25perc. and 10perc.') 27 | sleep(10) 28 | elif CPUpercent > 2: 29 | print('CPU Load between 10perc. and 2perc.') 30 | sleep(10) 31 | elif CPUpercent < 2: 32 | print('CPU Load under 2%') 33 | sleep(10) 34 | 35 | def PlayLEDon(): 36 | print('Playback started') 37 | 38 | def StereoLEDon(): 39 | print('Stereo-Signal') 40 | 41 | def PlayLEDoff(): 42 | print('Playback stoped') 43 | 44 | def StereoLEDoff(): 45 | print('No Stereo-Signal') -------------------------------------------------------------------------------- /modules/StatusLEDgpio.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin//python3 2 | 3 | im sys, tty, termios, os, readchar 4 | from time im sleep 5 | im psutil 6 | from gpiozero im LED 7 | 8 | led1 = LED(xx) 9 | led2 = LED(xx) 10 | led3 = LED(xx) 11 | led4 = LED(xx) 12 | led5 = LED(xx) 13 | led6 = LED(xx) 14 | led7 = LED(xx) 15 | led8 = LED(xx) 16 | 17 | # Usage of The LEDs: 18 | # led7 = more than 02% CPU load 19 | # led6 = more than 10% CPU load 20 | # led5 = more than 25% CPU load 21 | # led4 = more than 50% CPU load 22 | # led3 = more than 75% CPU load 23 | # led2 = Power LED 24 | # led1 = Play LED 25 | # led0 = Stereo LED 26 | 27 | def SysStart(): 28 | led0.off() 29 | led1.off() 30 | led2.off() 31 | led3.off() 32 | led4.off() 33 | led5.off() 34 | led6.off() 35 | led7.off() 36 | sleep(0.1) 37 | led2.on() 38 | sleep(0.5) 39 | led7.on() 40 | sleep(0.5) 41 | led6.on() 42 | sleep(0.5) 43 | led5.on() 44 | sleep(0.5) 45 | led4.on() 46 | sleep(0.5) 47 | led3.on() 48 | sleep(0.5) 49 | led1.on() 50 | sleep(0.5) 51 | led0.on() 52 | sleep(0.5) 53 | led3.off() 54 | sleep(0.5) 55 | led4.off() 56 | sleep(0.5) 57 | led5.off() 58 | sleep(0.5) 59 | led6.off() 60 | led0.off() 61 | sleep(0.5) 62 | led7.off() 63 | led1.off() 64 | sleep(0.5) 65 | 66 | def CPUload(): 67 | while True: 68 | CPUpercent = psutil.cpu_percent(interval=0.2, percpu=False) 69 | led7.off() 70 | led6.off() 71 | led5.off() 72 | led4.off() 73 | led3.off() 74 | if CPUpercent > 75: 75 | led7.on() 76 | led6.on() 77 | led5.on() 78 | led4.on() 79 | led3.on() 80 | elif CPUpercent > 50 : 81 | led7.on() 82 | led6.on() 83 | led5.on() 84 | led4.on() 85 | led3.off() 86 | elif CPUpercent > 25: 87 | led7.on() 88 | led6.on() 89 | led5.on() 90 | led4.off() 91 | led3.off() 92 | elif CPUpercent > 10: 93 | led7.on() 94 | led6.on() 95 | led5.off() 96 | led4.off() 97 | led3.off() 98 | elif CPUpercent > 2: 99 | led7.on() 100 | led6.off() 101 | led5.off() 102 | led4.off() 103 | led3.off() 104 | elif CPUpercent < 2: 105 | led7.off() 106 | led6.off() 107 | led5.off() 108 | led4.off() 109 | led3.off() 110 | 111 | def PlayLEDon(): 112 | led.[1] = False 113 | 114 | def StereoLEDon(): 115 | led.[0] = False 116 | 117 | def PlayLEDoff(): 118 | led.[1] = True 119 | 120 | def StereoLEDoff(): 121 | led.[0] = True 122 | -------------------------------------------------------------------------------- /modules/StatusLEDpcf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin//python3 2 | 3 | import sys, tty, termios, os, readchar 4 | from time import sleep 5 | import psutil 6 | from pcf8574 import PCF8574 7 | 8 | i2c_port_num = 1 9 | pcf_address = 0x20 10 | pcf = PCF8574(i2c_port_num, pcf_address) 11 | 12 | def SysStart(): 13 | pcf.port[7] = True 14 | pcf.port[6] = True 15 | pcf.port[5] = True 16 | pcf.port[4] = True 17 | pcf.port[3] = True 18 | pcf.port[2] = True 19 | pcf.port[1] = True 20 | pcf.port[0] = True 21 | sleep(0.1) 22 | pcf.port[2] = False 23 | sleep(0.5) 24 | pcf.port[7] = False 25 | sleep(0.5) 26 | pcf.port[6] = False 27 | sleep(0.5) 28 | pcf.port[5] = False 29 | sleep(0.5) 30 | pcf.port[4] = False 31 | sleep(0.5) 32 | pcf.port[3] = False 33 | sleep(0.5) 34 | pcf.port[1] = False 35 | sleep(0.5) 36 | pcf.port[0] = False 37 | sleep(0.5) 38 | pcf.port[3] = True 39 | sleep(0.5) 40 | pcf.port[4] = True 41 | sleep(0.5) 42 | pcf.port[5] = True 43 | sleep(0.5) 44 | pcf.port[6] = True 45 | pcf.port[0] = True 46 | sleep(0.5) 47 | pcf.port[7] = True 48 | pcf.port[1] = True 49 | sleep(0.5) 50 | 51 | def CPUload(): 52 | while True: 53 | CPUpercent = psutil.cpu_percent(interval=0.2, percpu=False) 54 | pcf.port[7] = True 55 | pcf.port[6] = True 56 | pcf.port[5] = True 57 | pcf.port[4] = True 58 | pcf.port[3] = True 59 | if CPUpercent > 75: 60 | pcf.port[7] = False 61 | pcf.port[6] = False 62 | pcf.port[5] = False 63 | pcf.port[4] = False 64 | pcf.port[3] = False 65 | elif CPUpercent > 50 : 66 | pcf.port[7] = False 67 | pcf.port[6] = False 68 | pcf.port[5] = False 69 | pcf.port[4] = False 70 | pcf.port[3] = True 71 | elif CPUpercent > 25: 72 | pcf.port[7] = False 73 | pcf.port[6] = False 74 | pcf.port[5] = False 75 | pcf.port[4] = True 76 | pcf.port[3] = True 77 | elif CPUpercent > 10: 78 | pcf.port[7] = False 79 | pcf.port[6] = False 80 | pcf.port[5] = True 81 | pcf.port[4] = True 82 | pcf.port[3] = True 83 | elif CPUpercent > 2: 84 | pcf.port[7] = False 85 | pcf.port[6] = True 86 | pcf.port[5] = True 87 | pcf.port[4] = True 88 | pcf.port[3] = True 89 | elif CPUpercent < 2: 90 | pcf.port[7] = True 91 | pcf.port[6] = True 92 | pcf.port[5] = True 93 | pcf.port[4] = True 94 | pcf.port[3] = True 95 | 96 | def PlayLEDon(): 97 | pcf.port[1] = False 98 | 99 | def StereoLEDon(): 100 | pcf.port[0] = False 101 | 102 | def PlayLEDoff(): 103 | pcf.port[1] = True 104 | 105 | def StereoLEDoff(): 106 | pcf.port[0] = True 107 | -------------------------------------------------------------------------------- /modules/display1306.py: -------------------------------------------------------------------------------- 1 | #from threading import Thread 2 | import os 3 | from PIL import Image 4 | from PIL import ImageDraw 5 | from PIL import ImageFont 6 | 7 | def show_logo(filename, device): 8 | logoImage = Image.new('1', (device.width, device.height)) 9 | img_path = os.path.dirname(os.path.realpath(__file__)) + '/../img/' 10 | try: 11 | logoImage = Image.open(img_path + filename).convert('1') #.resize((device.width, device.height), Image.ANTIALIAS) 12 | except IOError: 13 | print("Cannot open file %s" % filename) 14 | pass 15 | device.display(logoImage) 16 | 17 | def load_font(filename, font_size): 18 | font_path = os.path.dirname(os.path.realpath(__file__)) + '/../fonts/' 19 | try: 20 | font = ImageFont.truetype(font_path + filename, font_size) 21 | except IOError: 22 | print('font file not found -> using default font') 23 | font = ImageFont.load_default() 24 | return font 25 | 26 | class Screen(object): # screen base class 27 | def __init__(self, width, height): 28 | 29 | self.width = width 30 | self.height = height 31 | 32 | self.image = Image.new('1', (self.width, self.height)) 33 | self.draw = ImageDraw.Draw(self.image) 34 | 35 | self.draw.rectangle((0, 0, self.width - 1, self.height - 1), outline="white", fill="black") 36 | 37 | def Image(self): 38 | return self.image 39 | 40 | class StaticText(Screen): 41 | def __init__(self, height, width, textlabel, font, center=False, fill="white", bgcolor="black"): 42 | super(StaticText, self).__init__(height, width) 43 | 44 | self.textlabel = textlabel 45 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 46 | self.center = center 47 | self.image = Image.new('1', (self.textwidth+2, self.textheight+2), bgcolor) #Need to investigate what are the result of +2 is 48 | self.draw = ImageDraw.Draw(self.image) 49 | #self.draw.fontmode = "1" #no antialiasing 50 | self.draw.text((0, 0), textlabel, font=font, fill=fill) 51 | 52 | def DrawOn(self, image, position): 53 | if self.center: 54 | width, height = image.size 55 | if self.textwidth < width: 56 | position = (int((width-self.textwidth)/2 + 42), position[1]) #original -> "position = (int((width-self.textwidth)/2 + 42), position[1]) " 57 | image.paste(self.image, position) 58 | 59 | class ScrollText(Screen): 60 | def __init__(self, height, width, textlabel, font): 61 | super(ScrollText, self).__init__(height, width) 62 | 63 | self.startScrollDelay = 30 #time value 64 | self.endScrollDelay = 20 #time value 65 | self.offset = -self.startScrollDelay 66 | self.scrollSpeed = 1 67 | self.endScrollMargin = 2 #could not see a difference when set to 4. Maybe a higher number? 68 | 69 | self.textlabel = textlabel 70 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 71 | self.stopPosition = self.textwidth - width + self.endScrollMargin 72 | 73 | self.image = Image.new('1', (self.textwidth + 4, self.textheight + 4)) #Need to investigate what are the result of +4 is 74 | self.draw = ImageDraw.Draw(self.image) 75 | self.draw.text((0, 0), textlabel, font=font, fill="white") 76 | 77 | def DrawOn(self, image, position): 78 | """ Draw the label on (x,y) position of an image with starting at """ 79 | width, height = image.size 80 | 81 | self.offset += self.scrollSpeed 82 | if self.offset > self.stopPosition + self.endScrollDelay: 83 | self.offset = -self.startScrollDelay #scrolling start is delayed 84 | 85 | i = 0 86 | if self.textwidth <= width: # center text 87 | position = (int((width-self.textwidth)/2), position[1]) #original-> "position = (int((width-self.textwidth)/2), position[1])" 88 | elif self.offset <= 0: # start position before scrolling 89 | i = 0 90 | elif self.offset < self.stopPosition: # scroll text by offset 91 | i = int(self.offset) 92 | else: # stop position when scrolling ended 93 | i = self.stopPosition 94 | 95 | temp = self.image.crop((i, 0, width+i, self.textheight)) 96 | image.paste(temp, position) 97 | 98 | #class Bar(Screen): 99 | # def __init__(self, height, width, barHeight, barWidth): 100 | # super(Bar, self).__init__(height, width) 101 | # 102 | # self.barHeight = barHeight 103 | # self.barWidth = barWidth 104 | # self.filledPixels = 0 105 | # 106 | # self.image = Image.new('1', (self.barWidth, self.barHeight)) 107 | # self.draw = ImageDraw.Draw(self.image) 108 | # 109 | # def SetFilledPercentage(self, percent): 110 | # self.filledPixels = int(self.barWidth*percent/100) 111 | # 112 | # def DrawOn(self, image, position): 113 | # self.draw.rectangle((0, 0, self.barWidth-1 , self.barHeight-1), outline="white", fill="black") 114 | # self.draw.rectangle((1, 1, self.filledPixels-2 , self.barHeight-2), fill="white") 115 | # image.paste(self.image, position) 116 | 117 | -------------------------------------------------------------------------------- /modules/display1322.py: -------------------------------------------------------------------------------- 1 | #from threading import Thread 2 | import os 3 | from PIL import Image 4 | from PIL import ImageDraw 5 | from PIL import ImageFont 6 | 7 | def show_logo(filename, device): 8 | logoImage = Image.new('RGB', (device.width, device.height)) 9 | img_path = os.path.dirname(os.path.realpath(__file__)) + '/../img/' 10 | try: 11 | logoImage = Image.open(img_path + filename).convert('RGB') #.resize((device.width, device.height), Image.ANTIALIAS) 12 | except IOError: 13 | print("Cannot open file %s" % filename) 14 | pass 15 | device.display(logoImage) 16 | 17 | def load_font(filename, font_size): 18 | font_path = os.path.dirname(os.path.realpath(__file__)) + '/../fonts/' 19 | try: 20 | font = ImageFont.truetype(font_path + filename, font_size) 21 | except IOError: 22 | print('font file not found -> using default font') 23 | font = ImageFont.load_default() 24 | return font 25 | 26 | class Screen(object): # screen base class 27 | def __init__(self, width, height): 28 | 29 | self.width = width 30 | self.height = height 31 | 32 | self.image = Image.new('RGB', (self.width, self.height)) 33 | self.draw = ImageDraw.Draw(self.image) 34 | 35 | self.draw.rectangle((0, 0, self.width - 1, self.height - 1), outline="white", fill="black") 36 | 37 | def Image(self): 38 | return self.image 39 | 40 | class StaticText(Screen): 41 | def __init__(self, height, width, textlabel, font, center=False, fill="white", bgcolor="black"): 42 | super(StaticText, self).__init__(height, width) 43 | 44 | self.textlabel = textlabel 45 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 46 | self.center = center 47 | self.image = Image.new('RGB', (self.textwidth+2, self.textheight+2), bgcolor) #Need to investigate what are the result of +2 is 48 | self.draw = ImageDraw.Draw(self.image) 49 | #self.draw.fontmode = "1" #no antialiasing 50 | self.draw.text((0, 0), textlabel, font=font, fill=fill) 51 | 52 | def DrawOn(self, image, position): 53 | if self.center: 54 | width, height = image.size 55 | if self.textwidth < width: 56 | position = (int((width-self.textwidth)/2), position[1]) #original -> "position = (int((width-self.textwidth)/2 + 42), position[1]) " 57 | image.paste(self.image, position) 58 | 59 | class ScrollText(Screen): 60 | def __init__(self, height, width, textlabel, font): 61 | super(ScrollText, self).__init__(height, width) 62 | 63 | self.startScrollDelay = 80 #time value 64 | self.endScrollDelay = 50 #time value 65 | self.offset = -self.startScrollDelay 66 | self.scrollSpeed = 1 67 | self.endScrollMargin = 2 #could not see a difference when set to 4. Maybe a higher number? 68 | 69 | self.textlabel = textlabel 70 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 71 | self.stopPosition = self.textwidth - width + self.endScrollMargin 72 | 73 | self.image = Image.new('RGB', (self.textwidth + 4, self.textheight + 4)) #Need to investigate what are the result of +4 is 74 | self.draw = ImageDraw.Draw(self.image) 75 | self.draw.text((0, 0), textlabel, font=font, fill="white") 76 | 77 | def DrawOn(self, image, position): 78 | """ Draw the label on (x,y) position of an image with starting at """ 79 | width, height = image.size 80 | 81 | self.offset += self.scrollSpeed 82 | if self.offset > self.stopPosition + self.endScrollDelay: 83 | self.offset = -self.startScrollDelay #scrolling start is delayed 84 | 85 | i = 0 86 | if self.textwidth <= width: # center text 87 | position = (int((width-self.textwidth)/2), position[1]) #original-> "position = (int((width-self.textwidth)/2), position[1])" 88 | elif self.offset <= 0: # start position before scrolling 89 | i = 0 90 | elif self.offset < self.stopPosition: # scroll text by offset 91 | i = int(self.offset) 92 | else: # stop position when scrolling ended 93 | i = self.stopPosition 94 | 95 | temp = self.image.crop((i, 0, width+i, self.textheight)) 96 | image.paste(temp, position) 97 | 98 | class Bar(Screen): 99 | def __init__(self, height, width, barHeight, barWidth): 100 | super(Bar, self).__init__(height, width) 101 | 102 | self.barHeight = barHeight 103 | self.barWidth = barWidth 104 | self.filledPixels = 0 105 | 106 | self.image = Image.new('RGB', (self.barWidth, self.barHeight)) 107 | self.draw = ImageDraw.Draw(self.image) 108 | 109 | def SetFilledPercentage(self, percent): 110 | self.filledPixels = int(self.barWidth*percent/100) 111 | 112 | def DrawOn(self, image, position): 113 | self.draw.rectangle((0, 0, self.barWidth-1 , self.barHeight-1), outline="white", fill="#2f2f2f") 114 | self.draw.rectangle((1, 1, self.filledPixels-2 , self.barHeight-2), fill="white") 115 | image.paste(self.image, position) 116 | 117 | -------------------------------------------------------------------------------- /modules/display1351.py: -------------------------------------------------------------------------------- 1 | #from threading import Thread 2 | import os 3 | from PIL import Image 4 | from PIL import ImageDraw 5 | from PIL import ImageFont 6 | 7 | def show_logo(filename, device): 8 | logoImage = Image.new('RGB', (device.width, device.height)) 9 | img_path = os.path.dirname(os.path.realpath(__file__)) + '/../img/' 10 | try: 11 | logoImage = Image.open(img_path + filename).convert('RGB') #.resize((device.width, device.height), Image.ANTIALIAS) 12 | except IOError: 13 | print("Cannot open file %s" % filename) 14 | pass 15 | device.display(logoImage) 16 | 17 | def load_font(filename, font_size): 18 | font_path = "/home/volumio/NR1-UI/fonts/" #os.path.dirname(os.path.realpath(__file__)) + '/../fonts/' 19 | try: 20 | font = ImageFont.truetype(font_path + filename, font_size) 21 | except IOError: 22 | print('font file not found -> using default font') 23 | font = ImageFont.load_default() 24 | return font 25 | 26 | class Screen(object): # screen base class 27 | def __init__(self, width, height): 28 | 29 | self.width = width 30 | self.height = height 31 | 32 | self.image = Image.new('RGB', (self.width, self.height)) 33 | self.draw = ImageDraw.Draw(self.image) 34 | 35 | self.draw.rectangle((0, 0, self.width - 1, self.height - 1), outline="white", fill="black") 36 | 37 | def Image(self): 38 | return self.image 39 | 40 | class StaticText(Screen): 41 | def __init__(self, height, width, textlabel, font, center=False, fill="white", bgcolor="black"): 42 | super(StaticText, self).__init__(height, width) 43 | 44 | self.textlabel = textlabel 45 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 46 | self.center = center 47 | self.image = Image.new('RGB', (self.textwidth+2, self.textheight+2), bgcolor) #Need to investigate what are the result of +2 is 48 | self.draw = ImageDraw.Draw(self.image) 49 | #self.draw.fontmode = "1" #no antialiasing 50 | self.draw.text((0, 0), textlabel, font=font, fill=fill) 51 | 52 | def DrawOn(self, image, position): 53 | if self.center: 54 | width, height = image.size 55 | if self.textwidth < width: 56 | position = (int((width-self.textwidth)/2), position[1]) #original -> "position = (int((width-self.textwidth)/2 + 42), position[1]) " 57 | image.paste(self.image, position) 58 | 59 | class ScrollText(Screen): 60 | def __init__(self, height, width, textlabel, font): 61 | super(ScrollText, self).__init__(height, width) 62 | 63 | self.startScrollDelay = 80 #time value 64 | self.endScrollDelay = 50 #time value 65 | self.offset = -self.startScrollDelay 66 | self.scrollSpeed = 1 67 | self.endScrollMargin = 2 #could not see a difference when set to 4. Maybe a higher number? 68 | 69 | self.textlabel = textlabel 70 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 71 | self.stopPosition = self.textwidth - width + self.endScrollMargin 72 | 73 | self.image = Image.new('RGB', (self.textwidth + 4, self.textheight + 4)) #Need to investigate what are the result of +4 is 74 | self.draw = ImageDraw.Draw(self.image) 75 | self.draw.text((0, 0), textlabel, font=font, fill="white") 76 | 77 | def DrawOn(self, image, position): 78 | """ Draw the label on (x,y) position of an image with starting at """ 79 | width, height = image.size 80 | 81 | self.offset += self.scrollSpeed 82 | if self.offset > self.stopPosition + self.endScrollDelay: 83 | self.offset = -self.startScrollDelay #scrolling start is delayed 84 | 85 | i = 0 86 | if self.textwidth <= width: # center text 87 | position = (int((width-self.textwidth)/2), position[1]) #original-> "position = (int((width-self.textwidth)/2), position[1])" 88 | elif self.offset <= 0: # start position before scrolling 89 | i = 0 90 | elif self.offset < self.stopPosition: # scroll text by offset 91 | i = int(self.offset) 92 | else: # stop position when scrolling ended 93 | i = self.stopPosition 94 | 95 | temp = self.image.crop((i, 0, width+i, self.textheight)) 96 | image.paste(temp, position) 97 | 98 | class Bar(Screen): 99 | def __init__(self, height, width, barHeight, barWidth): 100 | super(Bar, self).__init__(height, width) 101 | 102 | self.barHeight = barHeight 103 | self.barWidth = barWidth 104 | self.filledPixels = 0 105 | 106 | self.image = Image.new('RGB', (self.barWidth, self.barHeight)) 107 | self.draw = ImageDraw.Draw(self.image) 108 | 109 | def SetFilledPercentage(self, percent): 110 | self.filledPixels = int(self.barWidth*percent/100) 111 | 112 | def DrawOn(self, image, position): 113 | self.draw.rectangle((0, 0, self.barWidth-1 , self.barHeight-1), outline="white", fill="black") 114 | self.draw.rectangle((1, 1, self.filledPixels-2 , self.barHeight-2), fill=(0, 255, 0)) 115 | image.paste(self.image, position) 116 | 117 | -------------------------------------------------------------------------------- /modules/display7735.py: -------------------------------------------------------------------------------- 1 | #from threading import Thread 2 | import os 3 | from PIL import Image 4 | from PIL import ImageDraw 5 | from PIL import ImageFont 6 | 7 | def show_logo(filename, device): 8 | print(device.width) 9 | print(device.height) 10 | logoImage = Image.new('RGB', (device.width, device.height)) 11 | img_path = os.path.dirname(os.path.realpath(__file__)) + '/../img/' 12 | try: 13 | logoImage = Image.open(img_path + filename).convert('RGB') #.resize((device.width, device.height), Image.ANTIALIAS) 14 | except IOError: 15 | print("Cannot open file %s" % filename) 16 | pass 17 | device.display(logoImage) 18 | 19 | def load_font(filename, font_size): 20 | font_path = "/home/volumio/NR1-UI/fonts/" #os.path.dirname(os.path.realpath(__file__)) + '/../fonts/' 21 | try: 22 | font = ImageFont.truetype(font_path + filename, font_size) 23 | except IOError: 24 | print('font file not found -> using default font') 25 | font = ImageFont.load_default() 26 | return font 27 | 28 | class Screen(object): # screen base class 29 | def __init__(self, width, height): 30 | 31 | self.width = width 32 | self.height = height 33 | 34 | self.image = Image.new('RGB', (self.width, self.height)) 35 | self.draw = ImageDraw.Draw(self.image) 36 | 37 | self.draw.rectangle((0, 0, self.width - 1, self.height - 1), outline="white", fill="black") 38 | 39 | def Image(self): 40 | return self.image 41 | 42 | class StaticText(Screen): 43 | def __init__(self, height, width, textlabel, font, center=False, fill="white", bgcolor="black"): 44 | super(StaticText, self).__init__(height, width) 45 | 46 | self.textlabel = textlabel 47 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 48 | self.center = center 49 | self.image = Image.new('RGB', (self.textwidth+2, self.textheight+2), bgcolor) #Need to investigate what are the result of +2 is 50 | self.draw = ImageDraw.Draw(self.image) 51 | #self.draw.fontmode = "1" #no antialiasing 52 | self.draw.text((0, 0), textlabel, font=font, fill=fill) 53 | 54 | def DrawOn(self, image, position): 55 | if self.center: 56 | width, height = image.size 57 | if self.textwidth < width: 58 | position = (int((width-self.textwidth)/2), position[1]) #original -> "position = (int((width-self.textwidth)/2 + 42), position[1]) " 59 | image.paste(self.image, position) 60 | 61 | class ScrollText(Screen): 62 | def __init__(self, height, width, textlabel, font): 63 | super(ScrollText, self).__init__(height, width) 64 | 65 | self.startScrollDelay = 80 #time value 66 | self.endScrollDelay = 50 #time value 67 | self.offset = -self.startScrollDelay 68 | self.scrollSpeed = 1 69 | self.endScrollMargin = 2 #could not see a difference when set to 4. Maybe a higher number? 70 | 71 | self.textlabel = textlabel 72 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 73 | self.stopPosition = self.textwidth - width + self.endScrollMargin 74 | 75 | self.image = Image.new('RGB', (self.textwidth + 4, self.textheight + 4)) #Need to investigate what are the result of +4 is 76 | self.draw = ImageDraw.Draw(self.image) 77 | self.draw.text((0, 0), textlabel, font=font, fill="white") 78 | 79 | def DrawOn(self, image, position): 80 | """ Draw the label on (x,y) position of an image with starting at """ 81 | width, height = image.size 82 | 83 | self.offset += self.scrollSpeed 84 | if self.offset > self.stopPosition + self.endScrollDelay: 85 | self.offset = -self.startScrollDelay #scrolling start is delayed 86 | 87 | i = 0 88 | if self.textwidth <= width: # center text 89 | position = (int((width-self.textwidth)/2), position[1]) #original-> "position = (int((width-self.textwidth)/2), position[1])" 90 | elif self.offset <= 0: # start position before scrolling 91 | i = 0 92 | elif self.offset < self.stopPosition: # scroll text by offset 93 | i = int(self.offset) 94 | else: # stop position when scrolling ended 95 | i = self.stopPosition 96 | 97 | temp = self.image.crop((i, 0, width+i, self.textheight)) 98 | image.paste(temp, position) 99 | 100 | class Bar(Screen): 101 | def __init__(self, height, width, barHeight, barWidth): 102 | super(Bar, self).__init__(height, width) 103 | 104 | self.barHeight = barHeight 105 | self.barWidth = barWidth 106 | self.filledPixels = 0 107 | 108 | self.image = Image.new('RGB', (self.barWidth, self.barHeight)) 109 | self.draw = ImageDraw.Draw(self.image) 110 | 111 | def SetFilledPercentage(self, percent): 112 | self.filledPixels = int(self.barWidth*percent/100) 113 | 114 | def DrawOn(self, image, position): 115 | self.draw.rectangle((0, 0, self.barWidth-1 , self.barHeight-1), outline="white", fill="black") 116 | self.draw.rectangle((1, 1, self.filledPixels-2 , self.barHeight-2), fill=(0, 255, 0)) 117 | image.paste(self.image, position) 118 | 119 | -------------------------------------------------------------------------------- /modules/displayBraun.py: -------------------------------------------------------------------------------- 1 | #from threading import Thread 2 | import os 3 | from PIL import Image 4 | from PIL import ImageDraw 5 | from PIL import ImageFont 6 | 7 | def show_logo(filename, device): 8 | logoImage = Image.new('RGB', (device.width, device.height)) 9 | img_path = os.path.dirname(os.path.realpath(__file__)) + '/../img/' 10 | try: 11 | logoImage = Image.open(img_path + filename).convert('RGB') #.resize((device.width, device.height), Image.ANTIALIAS) 12 | except IOError: 13 | print("Cannot open file %s" % filename) 14 | pass 15 | device.display(logoImage) 16 | 17 | def load_font(filename, font_size): 18 | font_path = os.path.dirname(os.path.realpath(__file__)) + '/../fonts/' 19 | try: 20 | font = ImageFont.truetype(font_path + filename, font_size) 21 | except IOError: 22 | print('font file not found -> using default font') 23 | font = ImageFont.load_default() 24 | return font 25 | 26 | class Screen(object): # screen base class 27 | def __init__(self, width, height): 28 | 29 | self.width = width 30 | self.height = height 31 | 32 | self.image = Image.new('RGB', (self.width, self.height)) 33 | self.draw = ImageDraw.Draw(self.image) 34 | 35 | self.draw.rectangle((0, 0, self.width - 1, self.height - 1), outline="white", fill="black") 36 | 37 | def Image(self): 38 | return self.image 39 | 40 | class StaticText(Screen): 41 | def __init__(self, height, width, textlabel, font, center=False, fill="white", bgcolor="black"): 42 | super(StaticText, self).__init__(height, width) 43 | 44 | self.textlabel = textlabel 45 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 46 | self.center = center 47 | self.image = Image.new('RGB', (self.textwidth+2, self.textheight+2), bgcolor) #Need to investigate what are the result of +2 is 48 | self.draw = ImageDraw.Draw(self.image) 49 | #self.draw.fontmode = "1" #no antialiasing 50 | self.draw.text((0, 0), textlabel, font=font, fill=fill) 51 | 52 | def DrawOn(self, image, position): 53 | if self.center: 54 | width, height = image.size 55 | if self.textwidth < width: 56 | position = (int((width-self.textwidth)/2 + 36), position[1]) #original -> "position = (int((width-self.textwidth)/2 + 42), position[1]) " 57 | image.paste(self.image, position) 58 | 59 | class ScrollText(Screen): 60 | def __init__(self, height, width, textlabel, font): 61 | super(ScrollText, self).__init__(height, width) 62 | 63 | self.startScrollDelay = 80 #time value 64 | self.endScrollDelay = 50 #time value 65 | self.offset = -self.startScrollDelay 66 | self.scrollSpeed = 1 67 | self.endScrollMargin = 2 #could not see a difference when set to 4. Maybe a higher number? 68 | 69 | self.textlabel = textlabel 70 | self.textwidth, self.textheight = self.draw.textsize(textlabel, font=font) 71 | self.stopPosition = self.textwidth - width + self.endScrollMargin 72 | 73 | self.image = Image.new('RGB', (self.textwidth + 4, self.textheight + 4)) #Need to investigate what are the result of +4 is 74 | self.draw = ImageDraw.Draw(self.image) 75 | self.draw.text((0, 0), textlabel, font=font, fill="white") 76 | 77 | def DrawOn(self, image, position): 78 | """ Draw the label on (x,y) position of an image with starting at """ 79 | width, height = image.size 80 | 81 | self.offset += self.scrollSpeed 82 | if self.offset > self.stopPosition + self.endScrollDelay: 83 | self.offset = -self.startScrollDelay #scrolling start is delayed 84 | 85 | i = 0 86 | if self.textwidth <= width: # center text 87 | position = (int(((width-self.textwidth)/2)+36), position[1]) #original-> "position = (int((width-self.textwidth)/2), position[1])" 88 | elif self.offset <= 0: # start position before scrolling 89 | i = 0 90 | elif self.offset < self.stopPosition: # scroll text by offset 91 | i = int(self.offset) 92 | else: # stop position when scrolling ended 93 | i = self.stopPosition 94 | 95 | temp = self.image.crop((i, 0, width+i, self.textheight)) 96 | image.paste(temp, position) 97 | 98 | class Bar(Screen): 99 | def __init__(self, height, width, barHeight, barWidth): 100 | super(Bar, self).__init__(height, width) 101 | 102 | self.barHeight = barHeight 103 | self.barWidth = barWidth 104 | self.filledPixels = 0 105 | 106 | self.image = Image.new('RGB', (self.barWidth, self.barHeight)) 107 | self.draw = ImageDraw.Draw(self.image) 108 | 109 | def SetFilledPercentage(self, percent): 110 | self.filledPixels = int(self.barWidth*percent/100) 111 | 112 | def DrawOn(self, image, position): 113 | self.draw.rectangle((0, 0, self.barWidth-1 , self.barHeight-1), outline="white", fill="#2f2f2f") 114 | self.draw.rectangle((1, 1, self.filledPixels-2 , self.barHeight-2), fill="white") 115 | image.paste(self.image, position) 116 | 117 | -------------------------------------------------------------------------------- /modules/pushbutton.py: -------------------------------------------------------------------------------- 1 | from time import sleep 2 | import RPi.GPIO as GPIO 3 | GPIO.setmode(GPIO.BCM) 4 | 5 | class PushButton: 6 | 7 | def __init__(self, gpioPin, min_time=0.1, max_time=0.1): 8 | self.pin = gpioPin 9 | self.callbackFunction = False 10 | self.minimum_time = min_time 11 | self.maximum_time = max(max_time, min_time) 12 | 13 | GPIO.setup(self.pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 14 | 15 | def setCallback(self, callback_function): 16 | self.callbackFunction = callback_function 17 | GPIO.add_event_detect(self.pin, GPIO.BOTH, callback=self.callback) 18 | 19 | def callback(self, channel): 20 | measured_time = self.minimum_time/2 21 | sleep(self.minimum_time/2) 22 | if (GPIO.input(self.pin)): # false detect 23 | return 24 | for i in range(int(self.maximum_time*50 - self.minimum_time*25 + 0.5)): # count max_time seconds when button held down 25 | if (GPIO.input(self.pin)): # When button is released, go on. 26 | break 27 | measured_time += 0.02 28 | sleep(0.02) 29 | if measured_time >= self.minimum_time and channel == self.pin and self.callbackFunction: 30 | print('PIN: '+str(self.pin)+', time: '+str(measured_time)) 31 | return self.callbackFunction(measured_time) 32 | -------------------------------------------------------------------------------- /modules/rotaryencoder.py: -------------------------------------------------------------------------------- 1 | import RPi.GPIO as GPIO 2 | 3 | class RotaryEncoder: 4 | 5 | UNKNOWN = 0 6 | LEFT = 1 7 | RIGHT = 2 8 | 9 | def __init__(self, pinA, pinB, pulses_per_cycle=4): 10 | self.pinA = pinA 11 | self.pinB = pinB 12 | self.callbackFunction = False 13 | self.ppc = pulses_per_cycle 14 | self.direction = RotaryEncoder.UNKNOWN 15 | self.prevState = 0b11 16 | self.relposition = 0; 17 | 18 | GPIO.setup(self.pinA, GPIO.IN, pull_up_down=GPIO.PUD_UP) 19 | GPIO.setup(self.pinB, GPIO.IN, pull_up_down=GPIO.PUD_UP) 20 | 21 | def setCallback(self, callback_function): 22 | self.callbackFunction = callback_function 23 | GPIO.add_event_detect(self.pinA, GPIO.BOTH, callback=self.decodeRotation) 24 | GPIO.add_event_detect(self.pinB, GPIO.BOTH, callback=self.decodeRotation) 25 | 26 | def decodeRotation(self, channel): 27 | self.direction = RotaryEncoder.UNKNOWN 28 | MSB = int(GPIO.input(self.pinA)) 29 | LSB = int(GPIO.input(self.pinB)) 30 | 31 | newState = (MSB << 1) | LSB 32 | sm = (self.prevState << 2) | newState 33 | self.prevState = newState 34 | 35 | if(sm == 0b1101 or sm == 0b0100 or sm == 0b0010 or sm == 0b1011): 36 | self.relposition -= 1 37 | if self.relposition <= -self.ppc: 38 | self.relposition = 0 39 | self.direction = RotaryEncoder.LEFT 40 | elif (sm == 0b1110 or sm == 0b0111 or sm == 0b0001 or sm == 0b1000): 41 | self.relposition += 1 42 | if self.relposition >= self.ppc: 43 | self.relposition = 0 44 | self.direction = RotaryEncoder.RIGHT 45 | 46 | if newState == 0b11: #locking position 47 | self.relposition = 0 48 | if self.callbackFunction and self.direction != RotaryEncoder.UNKNOWN: 49 | return self.callbackFunction(self.direction) 50 | -------------------------------------------------------------------------------- /pcf-i2c-adress-config.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | sudo apt-get install -y python-smbus # 3 | sudo apt-get install -y i2c-tools # 4 | echo "_________________________________________________________________ " # 5 | echo " " # 6 | echo -e "\e[4;92mThis is the Configuration for the I2C-adress of the PCFxxxx Controller.\e[0;0m" # 7 | echo " " # 8 | echo -e "\e[4;91mPlease make sure that your PCF8574 module is cocnnected! \e[0;0m" # 9 | echo "" # 10 | echo -e "\e[93mSDA <-> BCM2 (Physical Pin 3) \e[0m" # 11 | echo -e "\e[93mSCL <-> BCM3 (Physical Pin 5) \e[0m" # 12 | echo -e "\e[93m+5V and GND also connected\e[0m" # 13 | echo " " # 14 | sudo i2cdetect -y 1 # 15 | echo "_______________________________________________" # 16 | echo "" # 17 | echo -e "\e[4;92mNow, note your I2C-adress! (displayed above...)\e[0m" # 18 | echo " " # 19 | echo -e "\e[93mDo you use a PCF8574 or a PCF8574A?\e[0m" # 20 | echo -e "\e[93mValid selections are: \e[0m" # 21 | echo -e "1 -> \e[92mPCF8574\e[0m" # 22 | echo -e "2 -> \e[92mPCF8574A\e[0m" # 23 | echo -e "\e[93m--->\e[0m" # 24 | getPCF8574() { # 25 | echo -e "\e[93mPlease enter the adress...\e[0m" # 26 | echo -e "\e[93mJust enter the number behind the 0x.\e[0m" # 27 | echo -e "\e[93m(For 0x20 just type 20)\e[0m" # 28 | read -p "Enter your decision: " PCF8574 # 29 | case "$PCF8574" in # 30 | 20) # 31 | echo " " # 32 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\120/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 33 | echo -e "\e[92m0x20 is selected...\e[0m" # 34 | echo " " # 35 | return 0 # 36 | ;; # 37 | 21) # 38 | echo " " # 39 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\121/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 40 | echo -e "\e[92m0x21 is selected...\e[0m" # 41 | echo " " # 42 | return 0 # 43 | ;; # 44 | 22) 45 | echo " " # 46 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\122/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 47 | echo -e "\e[92m0x22 is selected...\e[0m" # 48 | echo " " # 49 | return 0 # 50 | ;; 51 | 23) 52 | echo " " # 53 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\123/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 54 | echo -e "\e[92m0x23 is selected...\e[0m" # 55 | echo " " # 56 | return 0 # 57 | ;; 58 | 24) 59 | echo " " # 60 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\124/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 61 | echo -e "\e[92m0x24 is selected...\e[0m" # 62 | echo " " # 63 | return 0 # 64 | ;; 65 | 25) 66 | echo " " # 67 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\125/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 68 | echo -e "\e[92m0x25 is selected...\e[0m" # 69 | echo " " # 70 | return 0 # 71 | ;; 72 | 26) 73 | echo " " # 74 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\126/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 75 | echo -e "\e[92m0x26 is selected...\e[0m" # 76 | echo " " # 77 | return 0 # 78 | ;; 79 | 27) 80 | echo " " # 81 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\127/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 82 | echo -e "\e[92m0x27 is selected...\e[0m" # 83 | echo " " # 84 | return 0 # 85 | ;; 86 | *) # 87 | printf %s\\n "Please enter a '20', '21', '22', '23', '24', '25', '26' or '27'" # 88 | return 1 # 89 | ;; # 90 | esac # 91 | } # 92 | getPCF8574A() { # 93 | echo -e "\e[93mPlease enter the adress...\e[0m" # 94 | echo -e "\e[93mJust enter the number behind the 0x.\e[0m" # 95 | echo -e "\e[93m(For 0x38 just type 38)\e[0m" # 96 | read -p "Enter your decision: " PCF8574A # 97 | case "$PCF8574A" in # 98 | 38) # 99 | echo " " # 100 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\138/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 101 | echo -e "\e[92m0x38 is selected...\e[0m" # 102 | echo " " # 103 | return 0 # 104 | ;; # 105 | 39) # 106 | echo " " # 107 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\139/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 108 | echo -e "\e[92m0x39 is selected...\e[0m" # 109 | echo " " # 110 | return 0 # 111 | ;; # 112 | 3A) 113 | echo " " # 114 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\13A/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 115 | echo -e "\e[92m0x3A is selected...\e[0m" # 116 | echo " " # 117 | return 0 # 118 | ;; 119 | 3B) 120 | echo " " # 121 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\13B/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 122 | echo -e "\e[92m0x3B is selected...\e[0m" # 123 | echo " " # 124 | return 0 # 125 | ;; 126 | 3C) 127 | echo " " # 128 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\13C/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 129 | echo -e "\e[92m0x3C is selected...\e[0m" # 130 | echo " " # 131 | return 0 # 132 | ;; 133 | 3D) 134 | echo " " # 135 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\13D/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 136 | echo -e "\e[92m0x3D is selected...\e[0m" # 137 | echo " " # 138 | return 0 # 139 | ;; 140 | 3E) 141 | echo " " # 142 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\13E/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 143 | echo -e "\e[92m0x3E is selected...\e[0m" # 144 | return 0 # 145 | ;; 146 | 3F) 147 | echo " " # 148 | sed -i 's/\(pcf_address = 0x\)\(.*\)/\13F/' /home/volumio/NR1-UI/modules/StatusLEDpcf.py # 149 | echo -e "\e[92m0x3F is selected...\e[0m" # 150 | echo " " # 151 | return 0 # 152 | ;; 153 | *) # 154 | printf %s\\n "Please enter a '38', '39', '3A', '3B', '3C', '3D', '3E' or '3F'" # 155 | return 1 # 156 | ;; # 157 | esac # 158 | } # 159 | getPCF() { # 160 | read -p "Enter your decision: " PCF # 161 | case "$PCF" in # 162 | 1) # 163 | echo " " # 164 | echo -e "\e[92mPCF8574 is selected...\e[0m" # 165 | echo " " # 166 | until getPCF8574; do : ; done # 167 | return 0 # 168 | ;; # 169 | 2) # 170 | echo " " # 171 | echo -e "\e[92mPCF8574 is selected...\e[0m" # 172 | echo " " # 173 | until getPCF8574A; do : ; done # 174 | return 0 # 175 | ;; # 176 | *) # 177 | printf %s\\n "Please enter '1' or '2'" # 178 | return 1 # 179 | ;; # 180 | esac # 181 | } # 182 | until getPCF; do : ; done # -------------------------------------------------------------------------------- /samba.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | sudo apt-get update # 3 | sudo apt-get install -y samba samba-common smbclient # 4 | echo "[global]" > /etc/samba/smb.conf 5 | echo "workgroup = WORKGROUP" >> /etc/samba/smb.conf 6 | echo "security = user" >> /etc/samba/smb.conf 7 | echo "encrypt passwords = yes" >> /etc/samba/smb.conf 8 | echo "client min protocol = SMB2" >> /etc/samba/smb.conf 9 | echo "client max protocol = SMB3" >> /etc/samba/smb.conf 10 | echo "[NR1-Samba]" >> /etc/samba/smb.conf 11 | echo "comment = NR1-Sambashare" >> /etc/samba/smb.conf 12 | echo "path = /home/volumio" >> /etc/samba/smb.conf 13 | echo "read only = no" >> /etc/samba/smb.conf 14 | sudo smbpasswd -a volumio 15 | sudo service smbd restart 16 | sudo service nmbd restart -------------------------------------------------------------------------------- /service-files/cava1.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=cava1 3 | 4 | [Service] 5 | Type=simple 6 | WorkingDirectory=/home/volumio 7 | ExecStart=/usr/local/bin/cava -p /home/volumio/NR1-UI/ConfigurationFiles/cava1/config 8 | StandardOutput=syslog 9 | StandardError=syslog 10 | SyslogIdentifier=cava1 11 | User=volumio 12 | Group=volumio 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /service-files/cava2.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=cava2 3 | 4 | [Service] 5 | Type=simple 6 | WorkingDirectory=/home/volumio 7 | ExecStart=/home/volumio/CAVA2/bin/cava -p /home/volumio/NR1-UI/ConfigurationFiles/cava2/config 8 | StandardOutput=syslog 9 | StandardError=syslog 10 | SyslogIdentifier=cava2 11 | User=volumio 12 | Group=volumio 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /service-files/nr1ui.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=NR1-UI 3 | 4 | [Service] 5 | Type=simple 6 | WorkingDirectory=/home/volumio 7 | ExecStart=/home/volumio/src/Python-3.8.5/bin/python3.8 -u /home/volumio/NR1-UI/nr1ui.py 8 | StandardOutput=syslog 9 | StandardError=syslog 10 | SyslogIdentifier=nr1ui 11 | User=volumio 12 | Group=volumio 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /service-files/nr1uibuster.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=NR1-UI 3 | 4 | [Service] 5 | Type=simple 6 | WorkingDirectory=/home/volumio 7 | ExecStart=python3 -u /home/volumio/NR1-UI/nr1ui.py 8 | StandardOutput=syslog 9 | StandardError=syslog 10 | SyslogIdentifier=nr1ui 11 | User=volumio 12 | Group=volumio 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /wiki/MS2501.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/MS2501.png -------------------------------------------------------------------------------- /wiki/MadeByGloria.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/MadeByGloria.jpg -------------------------------------------------------------------------------- /wiki/fonts/Oxanium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fonts/Oxanium.png -------------------------------------------------------------------------------- /wiki/fonts/dseg_sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fonts/dseg_sample.png -------------------------------------------------------------------------------- /wiki/fonts/entypo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fonts/entypo.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200605_211206.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200605_211206.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200605_211215.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200605_211215.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_220630.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_220630.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_221909.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_221909.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_221915.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_221915.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_221921.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_221921.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_221927.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_221927.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_221932.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_221932.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_221937.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_221937.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_221942.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_221942.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_222003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_222003.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_222135.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_222135.jpg -------------------------------------------------------------------------------- /wiki/fotos/20200610_222143.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/fotos/20200610_222143.jpg -------------------------------------------------------------------------------- /wiki/screenshots/Screenshots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/Screenshots.png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1306 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1306 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1306 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1306 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1306 (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1306 (3).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1306Screen1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1306Screen1 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1306Screen1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1306Screen1 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1306Screen2 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1306Screen2 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1306Screen2 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1306Screen2 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322 (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322 (3).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen1 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen1 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen2 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen2 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen2 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen2 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen3 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen3 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen3 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen3 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen4 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen4 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen4 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen4 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen5 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen5 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen5 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen5 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen6 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen6 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen6 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen6 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen7 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen7 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen7 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen7 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen8 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen8 (1).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screen8 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screen8 (2).png -------------------------------------------------------------------------------- /wiki/screenshots/ssd1322Screenselect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/screenshots/ssd1322Screenselect.png -------------------------------------------------------------------------------- /wiki/screenshots/test.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /wiki/truthtable/test.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /wiki/wiring/Screenshot - 01.03.2020 , 15_54_59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/wiring/Screenshot - 01.03.2020 , 15_54_59.png -------------------------------------------------------------------------------- /wiki/wiring/Wiring.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/wiring/Wiring.jpg -------------------------------------------------------------------------------- /wiki/wiring/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/wiring/button.png -------------------------------------------------------------------------------- /wiki/wiring/button2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/wiring/button2.png -------------------------------------------------------------------------------- /wiki/wiring/connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/wiring/connection.png -------------------------------------------------------------------------------- /wiki/wiring/standby.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/wiring/standby.jpg -------------------------------------------------------------------------------- /wiki/wiring/wiring.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/wiring/wiring.jpg -------------------------------------------------------------------------------- /wiki/wiring/wiring1306.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/wiring/wiring1306.png -------------------------------------------------------------------------------- /wiki/wiring/wiring7735.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maschine2501/NR1-UI/ef6aa100666a97b519650c6225e925ed2043d1bb/wiki/wiring/wiring7735.png --------------------------------------------------------------------------------