mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00:00 
			
		
		
		
	Matrix Layout enhancements (#1701)
* Support gaps on Matrix Layout * Ensure BlackBorder objects are initialised * Update Changelog * Fix automated semicolon insertion * Fix automated semicolon insertion * Remove SPI activation from post install script (#1708)
This commit is contained in:
		| @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | ||||
|  | ||||
| ### Added | ||||
|  | ||||
| - Support gaps on Matrix Layout (#1696) | ||||
|  | ||||
| ### Changed | ||||
|  | ||||
| ### Removed | ||||
|   | ||||
| @@ -327,7 +327,7 @@ | ||||
|                       </tr> | ||||
|                       <tr> | ||||
|                         <td class="ltd"> | ||||
|                           <label class="ltdlabel" for="ip_ma_direction" data-i18n="conf_leds_layout_ma_direction">Cabling</label> | ||||
|                           <label class="ltdlabel" for="ip_ma_direction" data-i18n="conf_leds_layout_ma_direction">Direction</label> | ||||
|                         </td> | ||||
|                         <td class="itd"> | ||||
|                           <select class="form-control ledMAconstr" id="ip_ma_direction"> | ||||
| @@ -352,6 +352,61 @@ | ||||
|                     </tbody> | ||||
|                   </table> | ||||
|                 </div> | ||||
|                   <div class="panel panel-default"> | ||||
|                     <div class="panel-heading headcollapse" data-toggle="collapse" data-target="#collapse-maadv" id="ma_advanced_settings"> | ||||
|                       <h4 class="panel-title"> | ||||
|                         <a> | ||||
|                           <i class="fa fa-fw fa-cogs"></i> | ||||
|                           <span data-i18n="conf_leds_layout_advanced">Advanced settings</span> | ||||
|                           <i class="fa fa-angle-down pull-right" id="ma_advanced_settings_right_icon"></i> | ||||
|                         </a> | ||||
|                       </h4> | ||||
|                     </div> | ||||
|                     <div id="collapse-maadv" class="panel-collapse collapse"> | ||||
|                       <div class="panel-body "> | ||||
|                         <table class="tableform borderless"> | ||||
|                           <tbody> | ||||
|                             <tr> | ||||
|                               <td class="ltd"> | ||||
|                                 <label class="ltdlabel" for="ip_ma_gapleft" data-i18n="conf_leds_layout_gapleft">Gap Left</label> | ||||
|                               </td> | ||||
|                               <td class="itd input-group"> | ||||
|                                 <input class="form-control ledMAconstr" id="ip_ma_gapleft" type="number" value="0" min="0" max="100" step="1"></input> | ||||
|                                 <div class="input-group-addon" data-i18n="edt_append_percent">%h</div> | ||||
|                               </td> | ||||
|                             </tr> | ||||
|                             <tr> | ||||
|                               <td class="ltd"> | ||||
|                                 <label class="ltdlabel" for="ip_ma_gapright" data-i18n="conf_leds_layout_gapright">Gap Right</label> | ||||
|                               </td> | ||||
|                               <td class="itd input-group"> | ||||
|                                 <input class="form-control ledMAconstr" id="ip_ma_gapright" type="number" value="0" min="0" max="100" step="1"></input> | ||||
|                                 <div class="input-group-addon" data-i18n="edt_append_percent">%v</div> | ||||
|                               </td> | ||||
|                             </tr> | ||||
|                             <tr> | ||||
|                               <td class="ltd"> | ||||
|                                 <label class="ltdlabel" for="ip_ma_gaptop" data-i18n="conf_leds_layout_gaptop">Gap Left</label> | ||||
|                               </td> | ||||
|                               <td class="itd input-group"> | ||||
|                                 <input class="form-control ledMAconstr" id="ip_ma_gaptop" type="number" value="0" min="0" max="100" step="1"></input> | ||||
|                                 <div class="input-group-addon" data-i18n="edt_append_percent">%h</div> | ||||
|                               </td> | ||||
|                             </tr> | ||||
|                             <tr> | ||||
|                               <td class="ltd"> | ||||
|                                 <label class="ltdlabel" for="ip_ma_gapbottom" data-i18n="conf_leds_layout_gapbottom">Gap Right</label> | ||||
|                               </td> | ||||
|                               <td class="itd input-group"> | ||||
|                                 <input class="form-control ledMAconstr" id="ip_ma_gapbottom" type="number" value="0" min="0" max="100" step="1"></input> | ||||
|                                 <div class="input-group-addon" data-i18n="edt_append_percent">%v</div> | ||||
|                               </td> | ||||
|                             </tr> | ||||
|                           </tbody> | ||||
|                         </table> | ||||
|                       </div> | ||||
|                     </div> | ||||
|                   </div> | ||||
|                 <div class="panel-footer" style="text-align:right;"> | ||||
|                   <button id="btn_ma_save" class="btn btn-primary"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button> | ||||
|                 </div> | ||||
|   | ||||
| @@ -117,6 +117,10 @@ | ||||
|     "conf_leds_layout_cl_topright": "Top Right (Corner)", | ||||
|     "conf_leds_layout_cl_vleddepth": "Vertical LED depth", | ||||
|     "conf_leds_layout_frame": "Classic Layout (LED Frame)", | ||||
|     "conf_leds_layout_gapleft": "Left gap", | ||||
|     "conf_leds_layout_gapright": "Right gap", | ||||
|     "conf_leds_layout_gaptop": "Top gap", | ||||
|     "conf_leds_layout_gapbottom": "Bottom gap", | ||||
|     "conf_leds_layout_generatedconf": "Generated/Current LED Configuration", | ||||
|     "conf_leds_layout_generation_success": "LED Layout generated sucessfully", | ||||
|     "conf_leds_layout_generation_error": "LED Layout was not generated", | ||||
|   | ||||
| @@ -468,17 +468,18 @@ function createClassicLeds() { | ||||
|   aceEdt.set(finalLedArray); | ||||
| } | ||||
|  | ||||
| function createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction) { | ||||
| function createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction, gap) { | ||||
|   // Big thank you to RanzQ (Juha Rantanen) from Github for this script | ||||
|   // https://raw.githubusercontent.com/RanzQ/hyperion-audio-effects/master/matrix-config.js | ||||
|  | ||||
|   var parallel = false | ||||
|   var leds = [] | ||||
|   var hblock = 1.0 / ledshoriz | ||||
|   var vblock = 1.0 / ledsvert | ||||
|   let parallel = false; | ||||
|   const leds = []; | ||||
|  | ||||
|   const hblock = (1.0 - gap.left - gap.right) / ledshoriz; | ||||
|   const vblock = (1.0 - gap.top - gap.bottom) / ledsvert; | ||||
|  | ||||
|   if (cabling == "parallel") { | ||||
|     parallel = true | ||||
|     parallel = true; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
| @@ -487,10 +488,10 @@ function createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction) { | ||||
|    * @param {Number} y     Vertical position in matrix | ||||
|    */ | ||||
|   function addLed(x, y) { | ||||
|     var hscanMin = x * hblock | ||||
|     var hscanMax = (x + 1) * hblock | ||||
|     var vscanMin = y * vblock | ||||
|     var vscanMax = (y + 1) * vblock | ||||
|     let hscanMin = gap.left + (x * hblock); | ||||
|     let hscanMax = gap.left + (x + 1) * hblock; | ||||
|     let vscanMin = gap.top + y * vblock; | ||||
|     let vscanMax = gap.top + (y + 1) * vblock; | ||||
|  | ||||
|     hscanMin = round(hscanMin); | ||||
|     hscanMax = round(hscanMax); | ||||
| @@ -502,43 +503,41 @@ function createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction) { | ||||
|       hmax: hscanMax, | ||||
|       vmin: vscanMin, | ||||
|       vmax: vscanMax | ||||
|     }) | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   var startYX = start.split('-') | ||||
|   var startX = startYX[1] === 'right' ? ledshoriz - 1 : 0 | ||||
|   var startY = startYX[0] === 'bottom' ? ledsvert - 1 : 0 | ||||
|   var endX = startX === 0 ? ledshoriz - 1 : 0 | ||||
|   var endY = startY === 0 ? ledsvert - 1 : 0 | ||||
|   var forward = startX < endX | ||||
|   const startYX = start.split('-'); | ||||
|   let startX = startYX[1] === 'right' ? ledshoriz - 1 : 0; | ||||
|   let startY = startYX[0] === 'bottom' ? ledsvert - 1 : 0; | ||||
|   let endX = startX === 0 ? ledshoriz - 1 : 0; | ||||
|   let endY = startY === 0 ? ledsvert - 1 : 0; | ||||
|   let forward = startX < endX; | ||||
|   let downward = startY < endY; | ||||
|  | ||||
|   var downward = startY < endY | ||||
|  | ||||
|   var x, y | ||||
|   let x, y; | ||||
|  | ||||
|   if (direction === 'vertical') { | ||||
|     for (x = startX; forward && x <= endX || !forward && x >= endX; x += forward ? 1 : -1) { | ||||
|       for (y = startY; downward && y <= endY || !downward && y >= endY; y += downward ? 1 : -1) { | ||||
|  | ||||
|         addLed(x, y) | ||||
|         addLed(x, y); | ||||
|       } | ||||
|       if (!parallel) { | ||||
|         downward = !downward | ||||
|         var tmp = startY | ||||
|         startY = endY | ||||
|         endY = tmp | ||||
|         downward = !downward; | ||||
|         const tmp = startY; | ||||
|         startY = endY; | ||||
|         endY = tmp; | ||||
|       } | ||||
|     } | ||||
|   } else { | ||||
|     for (y = startY; downward && y <= endY || !downward && y >= endY; y += downward ? 1 : -1) { | ||||
|       for (x = startX; forward && x <= endX || !forward && x >= endX; x += forward ? 1 : -1) { | ||||
|         addLed(x, y) | ||||
|         addLed(x, y); | ||||
|       } | ||||
|       if (!parallel) { | ||||
|         forward = !forward | ||||
|         var tmp = startX | ||||
|         startX = endX | ||||
|         endX = tmp | ||||
|         forward = !forward; | ||||
|         const tmp = startX; | ||||
|         startX = endX; | ||||
|         endX = tmp; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| @@ -551,13 +550,20 @@ function createMatrixLeds() { | ||||
|   // https://raw.githubusercontent.com/RanzQ/hyperion-audio-effects/master/matrix-config.js | ||||
|  | ||||
|   //get values | ||||
|   var ledshoriz = parseInt($("#ip_ma_ledshoriz").val()); | ||||
|   var ledsvert = parseInt($("#ip_ma_ledsvert").val()); | ||||
|   var cabling = $("#ip_ma_cabling").val(); | ||||
|   var direction = $("#ip_ma_direction").val(); | ||||
|   var start = $("#ip_ma_start").val(); | ||||
|   const ledshoriz = parseInt($("#ip_ma_ledshoriz").val()); | ||||
|   const ledsvert = parseInt($("#ip_ma_ledsvert").val()); | ||||
|   const cabling = $("#ip_ma_cabling").val(); | ||||
|   const direction = $("#ip_ma_direction").val(); | ||||
|   const start = $("#ip_ma_start").val(); | ||||
|   const gap = { | ||||
|     //gap values % -> float | ||||
|     left: parseInt($("#ip_ma_gapleft").val()) / 100, | ||||
|     right: parseInt($("#ip_ma_gapright").val()) / 100, | ||||
|     top: parseInt($("#ip_ma_gaptop").val()) / 100, | ||||
|     bottom: parseInt($("#ip_ma_gapbottom").val()) / 100, | ||||
|   }; | ||||
|  | ||||
|   nonBlacklistLedArray = createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction); | ||||
|   nonBlacklistLedArray = createMatrixLayout(ledshoriz, ledsvert, cabling, start, direction, gap); | ||||
|   finalLedArray = blackListLeds(nonBlacklistLedArray, ledBlacklist); | ||||
|  | ||||
|   createLedPreview(finalLedArray); | ||||
| @@ -797,6 +803,35 @@ $(document).ready(function () { | ||||
|  | ||||
|   $('.ledMAconstr').on("change", function () { | ||||
|     valValue(this.id, this.value, this.min, this.max); | ||||
|  | ||||
|     // top/bottom and left/right must not overlap | ||||
|     switch (this.id) { | ||||
|       case "ip_ma_gapleft": | ||||
|         let left = 100 - parseInt($("#ip_ma_gapright").val()); | ||||
|         if (this.value > left) { | ||||
|           $(this).val(left); | ||||
|         } | ||||
|         break; | ||||
|       case "ip_ma_gapright": | ||||
|         let right = 100 - parseInt($("#ip_ma_gapleft").val()); | ||||
|         if (this.value > right) { | ||||
|           $(this).val(right); | ||||
|         } | ||||
|         break; | ||||
|       case "ip_ma_gaptop": | ||||
|         let top = 100 - parseInt($("#ip_ma_gapbottom").val()); | ||||
|         if (this.value > top) { | ||||
|           $(this).val(top); | ||||
|         } | ||||
|         break; | ||||
|       case "ip_ma_gapbottom": | ||||
|         let bottom = 100 - parseInt($("#ip_ma_gaptop").val()); | ||||
|         if (this.value > bottom) { | ||||
|           $(this).val(bottom); | ||||
|         } | ||||
|         break; | ||||
|       default: | ||||
|     } | ||||
|     createMatrixLeds(); | ||||
|   }); | ||||
|  | ||||
|   | ||||
| @@ -26,13 +26,6 @@ install_file() | ||||
|  | ||||
| echo "--- Hyperion ambient light postinstall ---" | ||||
|  | ||||
| #check system | ||||
| CPU_RPI=`grep -m1 -c 'BCM2708\|BCM2709\|BCM2710\|BCM2835\|BCM2836\|BCM2837\|BCM2711' /proc/cpuinfo` | ||||
| CPU_X32X64=`uname -m | grep 'x86_32\|i686\|x86_64' | wc -l` | ||||
|  | ||||
| #Check for a bootloader as Berryboot | ||||
| BOOT_BERRYBOOT=$(grep -m1 -c '\(/var/media\|/media/pi\)/berryboot' /etc/mtab) | ||||
|  | ||||
| #get current system ip | ||||
| NET_IP=`hostname -I | cut -d " " -f1` | ||||
|  | ||||
| @@ -128,25 +121,6 @@ fi | ||||
| rm -r /usr/share/hyperion/desktop 2>/dev/null | ||||
| rm -r /usr/share/hyperion/icons 2>/dev/null | ||||
|  | ||||
| #Check, if dtparam=spi=on is in place | ||||
| if [ $CPU_RPI -eq 1 ]; then | ||||
| 	BOOT_DIR="/boot" | ||||
| 	if [ $BOOT_BERRYBOOT -eq 1 ]; then | ||||
| 		BOOT_DIR=$(sed -ne "s#/dev/mmcblk0p1 \([^ ]*\) vfat rw,.*#\1#p" /etc/mtab) | ||||
| 	fi | ||||
| 	if [ -z "$BOOT_DIR" -o ! -f "$BOOT_DIR/config.txt" ]; then | ||||
| 		echo '---> Warning: RPi using BERRYBOOT found but can not locate where config.txt is to enable SPI. (BOOT_DIR='"$BOOT_DIR)" | ||||
| 		SPIOK=1 # Not sure if OK, but don't ask to reboot | ||||
| 	else | ||||
| 		SPIOK=`grep '^\dtparam=spi=on' "$BOOT_DIR/config.txt" | wc -l` | ||||
| 		if [ $SPIOK -ne 1 ]; then | ||||
| 			echo '---> Raspberry Pi found, but SPI is not set, we write "dtparam=spi=on" to '"$BOOT_DIR/config.txt" | ||||
| 			sed -i '$a dtparam=spi=on' "$BOOT_DIR/config.txt" | ||||
| 			REBOOTMESSAGE="echo Please reboot your Raspberry Pi, we inserted dtparam=spi=on to $BOOT_DIR/config.txt" | ||||
| 		fi | ||||
| 	fi | ||||
| fi | ||||
|  | ||||
| echo ${START_MSG} | ||||
|  | ||||
| echo "-----------------------------------------------------------------------------" | ||||
| @@ -171,7 +145,7 @@ if [ -e /opt/hyperion/ ] | ||||
| then | ||||
| 	echo | ||||
| 	echo "---------------------------------------------------------------------------------" | ||||
| 	echo "- It seemd that you have an older version of hyperion installed in /opt/hyperion -" | ||||
| 	echo "- It seems that you have an older version of hyperion installed in /opt/hyperion -" | ||||
| 	echo "- please remove it to avoid problems                                            -" | ||||
| 	echo "---------------------------------------------------------------------------------" | ||||
| fi | ||||
|   | ||||
| @@ -110,7 +110,7 @@ namespace hyperion | ||||
| 			} | ||||
|  | ||||
| 			// Construct result | ||||
| 			BlackBorder detectedBorder; | ||||
| 			BlackBorder detectedBorder{}; | ||||
| 			detectedBorder.unknown = firstNonBlackXPixelIndex == -1 || firstNonBlackYPixelIndex == -1; | ||||
| 			detectedBorder.horizontalSize = firstNonBlackYPixelIndex; | ||||
| 			detectedBorder.verticalSize = firstNonBlackXPixelIndex; | ||||
| @@ -167,7 +167,7 @@ namespace hyperion | ||||
| 			} | ||||
|  | ||||
| 			// Construct result | ||||
| 			BlackBorder detectedBorder; | ||||
| 			BlackBorder detectedBorder{}; | ||||
| 			detectedBorder.unknown = firstNonBlackXPixelIndex == -1 || firstNonBlackYPixelIndex == -1; | ||||
| 			detectedBorder.horizontalSize = firstNonBlackYPixelIndex; | ||||
| 			detectedBorder.verticalSize = firstNonBlackXPixelIndex; | ||||
| @@ -224,7 +224,7 @@ namespace hyperion | ||||
| 			} | ||||
|  | ||||
| 			// Construct result | ||||
| 			BlackBorder detectedBorder; | ||||
| 			BlackBorder detectedBorder{}; | ||||
| 			detectedBorder.unknown = firstNonBlackXPixelIndex == -1 || firstNonBlackYPixelIndex == -1; | ||||
| 			detectedBorder.horizontalSize = firstNonBlackYPixelIndex; | ||||
| 			detectedBorder.verticalSize = firstNonBlackXPixelIndex; | ||||
| @@ -267,7 +267,7 @@ namespace hyperion | ||||
| 			} | ||||
|  | ||||
| 			// Construct result | ||||
| 			BlackBorder detectedBorder; | ||||
| 			BlackBorder detectedBorder{}; | ||||
| 			detectedBorder.unknown = firstNonBlackYPixelIndex == -1; | ||||
| 			detectedBorder.horizontalSize = firstNonBlackYPixelIndex; | ||||
| 			detectedBorder.verticalSize = 0; | ||||
|   | ||||
| @@ -144,6 +144,30 @@ | ||||
| 				"start": { | ||||
| 					"type": "string", | ||||
| 					"enum": [ "top-left", "top-right", "bottom-left", "bottom-right" ] | ||||
| 				}, | ||||
| 				"gapleft": { | ||||
| 					"type": "integer", | ||||
| 					"minimum": 0, | ||||
| 					"maximum": 100, | ||||
| 					"default": 0 | ||||
| 				}, | ||||
| 				"gapright": { | ||||
| 					"type": "integer", | ||||
| 					"minimum": 0, | ||||
| 					"maximum": 100, | ||||
| 					"default": 0 | ||||
| 				}, | ||||
| 				"gaptop": { | ||||
| 					"type": "integer", | ||||
| 					"minimum": 0, | ||||
| 					"maximum": 100, | ||||
| 					"default": 0 | ||||
| 				}, | ||||
| 				"gapbottom": { | ||||
| 					"type": "integer", | ||||
| 					"minimum": 0, | ||||
| 					"maximum": 100, | ||||
| 					"default": 0 | ||||
| 				} | ||||
| 			}, | ||||
| 			"additionalProperties": false | ||||
|   | ||||
		Reference in New Issue
	
	Block a user