@@ -805,6 +805,9 @@ uint16_t Segment::virtualLength() const {
805805 else
806806 vLen = max (vW,vH) * 0.5 ; // get the longest dimension
807807 break ;
808+ case M12_sPinWheel: // WLEDMM
809+ vLen = 360 ; // full circle
810+ break ;
808811 }
809812 return vLen;
810813 }
@@ -932,6 +935,27 @@ void IRAM_ATTR_YN Segment::setPixelColor(int i, uint32_t col) //WLEDMM: IRAM_ATT
932935 }
933936 }
934937 break ;
938+ case M12_sPinWheel: {
939+ // i = 0 through 359
940+ float centerX = (vW-1 ) / 2 ;
941+ float centerY = (vH-1 ) / 2 ;
942+ // int maxDistance = sqrt(centerX * centerX + centerY * centerY) + 1;
943+
944+ int distance = 0 ;
945+ float cosVal = cos (i * DEG_TO_RAD); // i = current angle
946+ float sinVal = sin (i * DEG_TO_RAD);
947+ while (true ) {
948+ int x = round (centerX + distance * cosVal);
949+ int y = round (centerY + distance * sinVal);
950+ // Check bounds
951+ if (x < 0 || x >= vW || y < 0 || y >= vH) {
952+ break ;
953+ }
954+ setPixelColorXY (x, y, col);
955+ distance++;
956+ }
957+ break ;
958+ }
935959 }
936960 return ;
937961 } else if (Segment::maxHeight!=1 && (width ()==1 || height ()==1 )) {
@@ -1069,6 +1093,14 @@ uint32_t Segment::getPixelColor(int i)
10691093 else
10701094 return getPixelColorXY (vW / 2 , vH / 2 - i - 1 );
10711095 break ;
1096+ case M12_sPinWheel: // WLEDMM
1097+ // not 100% accurate, returns outer edge of circle
1098+ int distance = min (vH, vW) / 2 ;
1099+ float centerX = (vW - 1 ) / 2 ;
1100+ float centerY = (vH - 1 ) / 2 ;
1101+ int x = round (centerX + distance * cos (i * DEG_TO_RAD));
1102+ int y = round (centerY + distance * sin (i * DEG_TO_RAD));
1103+ return getPixelColorXY (x, y);
10721104 }
10731105 return 0 ;
10741106 }
0 commit comments