├── .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 | 
83 |
84 | ### Screenshots and Layout Overview:
85 | 
86 |
87 | ### [buy me a coffee, or tip me ;-)](https://paypal.me/maschine2501)
88 |
89 | 
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
--------------------------------------------------------------------------------