public IImageSource CrateMatrix(string dir, MatrixImageSourceConfig config, ImageMaxValues maxValues) { List <Symbol> symbols = new List <Symbol>(); var blanker = new AddBlankingPointsFrameProcessor(10, 10, true); foreach (var file in Directory.EnumerateFiles(dir, "*.ild")) { var imagesource = new IldaImageSource(Path.Combine(dir, file)); var scaler = new ScaleMaxValuesFrameProcessor(imagesource.MaxValues, maxValues); var image = imagesource.GetFrames() .Where(f => f.Points.Any()) .Select(f => scaler.Process(f)) .Select(f => blanker.Process(f)); foreach (var frame in image) { var s = new Symbol() { MaxValues = maxValues, Name = Path.GetFileNameWithoutExtension(file), Points = frame.Points.ToArray() }; symbols.Add(s); } } var imageSource = new MatrixImageSource(config, symbols); return(imageSource); }
static int Main(string[] args) { // uint baudrate = 3_000_000; // MCP4921 absolute max data speed // uint baudrate = 3_000_000; // MCP4921 0-255 (8 bit). square wave 440khz (880k points/s). wave shape is heavy filtered triangle uint baudrate = 2_000_000; // MCP4921 0-1023 (10 bit). square wave 320khz (640k points/s). wave shape has triangle top, flat bottom // uint baudrate = 1_000_000; // most stable, minimum data stream tearing // uint baudrate = 610_000; // MCP4921 0-4095 (12 bit). square wave 90khz (180k points/s). wave shape is triangle var filepath = @"..\..\..\samplefiles\svg\circle.svg"; //var filepath = @"..\..\..\samplefiles\svg\strokeshades.svg"; //var filepath = @"..\..\..\samplefiles\svg\wikipedia_fillrules.svg"; Console.WriteLine($"Filename is {filepath}"); Console.WriteLine($"Baudrate is {baudrate}"); // TODO: config file for building and configure everything //var targetMaxValues = new ImageMaxValues() //{ // MaxRGB = 255, // MinX = 0, MaxX = 255, // MinY = 0, MaxY = 255, // MinZ = 0, MaxZ = 255, //}; //var targetMaxValues = new ImageMaxValues() //{ // MaxRGB = 255, // MinX = 0, MaxX = 1023, // MinY = 0, MaxY = 1023, // MinZ = 0, MaxZ = 1023, //}; var targetMaxValues = new ImageMaxValues() { MaxRGB = 255, MinX = 0, MaxX = 4095, MinY = 0, MaxY = 4095, MinZ = 0, MaxZ = 4095, }; int genOffsetX = 0; // 32 * 0 - 1; int genOffsetY = 0; // var generateMaxValues = new ImageMaxValues() // { // MaxRGB = 255, // MinX = genOffsetX, MaxX = 1023 + genOffsetX, // MinY = genOffsetY, MaxY = 1023 + genOffsetY, // MinZ = 0, MaxZ = 15, // }; var generateMaxValues = new ImageMaxValues() { MaxRGB = 255, MinX = genOffsetX, MaxX = 4095 + genOffsetX, MinY = genOffsetY, MaxY = 4095 + genOffsetY, MinZ = 0, MaxZ = 4095, }; // var generateMaxValues = new ImageMaxValues() // { // MaxRGB = 255, // MinX = 0, MaxX = 1023, // MinY = 0, MaxY = 1023, // MinZ = 0, MaxZ = 1023, // }; // var generateMaxValues = new ImageMaxValues() // { // MaxRGB = 255, // MinX = 0, MaxX = 255, // MinY = 0, MaxY = 255, // MinZ = 0, MaxZ = 255, // }; var screenSize = new Vector2(8 * 12, 8 * 12); var pixelSize = new Vector2( (targetMaxValues.MaxX - targetMaxValues.MinX) / screenSize.X, (targetMaxValues.MaxY - targetMaxValues.MinY) / screenSize.Y ); var pixelMin = Math.Min(pixelSize.X, pixelSize.Y); // List<string> ildafiles = new List<string>(); // sample rate | baudrate // 192000 307200 // 96000 153600 // 48000 76800 // 44100 70550 // var imageSource = new WaveFileImageSource(filepath); // var imageSource = new IldaImageSource(filepath); // var imageSource = new IldaMultipleImageSource(ildafiles); // var imageSource = new TestLineImageSource(targetMaxValues, generateMaxValues, true); // var imageSource = new SolidRectangleImageSource(generateMaxValues); // var imageSource = new RandomImageSource(generateMaxValues); // var imageSource = new SpruceImageSource(targetMaxValues); // var imageSource = new MeandreImageSource(targetMaxValues); // var imageSource = new PointsImageSource(targetMaxValues, 10240); // var imageSource = new MatrixBootstrap().CrateMatrix( // filepath, // new MatrixImageSourceConfig() // { // Width = 1024, // Height = 1024, // MaxRGB = 255, // Cols = 28, // Rows = 19, // TrailLength = 25, // TrailGenerationRate = 20, // TrailChangeRateMin = 15, // TrailChangeRateMax = 50, // TrailChangeIntencity = 50 // }, // new ImageMaxValues() // { // MaxRGB = 255, // MinX = 0, // MaxX = 35, // MinY = 0, // MaxY = 50, // MinZ = 0, // MaxZ = 15, // } // ); ; // var pathImageSourceParams = new PathToPointImageSourceParams() // { // // DotImageDistanceMin = 20f, // DotImageDistanceMax = 21f, // // FillDistanceMin = 80f, // FillDistanceMax = 85f // }; var imageSource = new PathImageSource( pathSource: new SvgFilePathSource(filepath), strokeConverter: new PrimitiveToEvenSegmentsConverter(pixelMin * 0.3f, pixelMin * 0.3f + 1, false), strokeBrightness: ColorChannel.Alpha, fillConverter: null, fillGeneratorFactory: p => new IntervalDotsFillGenerator(p, new Vector2(1f, 1f) * pixelSize, new Vector2(0.2f, 0.2f) * pixelSize , new Vector2(1f, 1f) * pixelSize , new Vector2(0.2f, 0.2f) * pixelSize ), fillIntensity: ColorChannel.Alpha, fillBrightness: ColorChannel.Green, targetMaxValues ); var frameProcessors = new List <IFrameProcessor>() { // new GammaCorrectionFrameProcessor(new Dictionary<GammaCorrectionFrameProcessorChannel, float>{ // { GammaCorrectionFrameProcessorChannel.Z, 1f } //0.45f } // }, targetMaxValues) //new ScaleMaxValuesFrameProcessor(imageSource.MaxValues, targetMaxValues), //new MonochromeFrameProcessor(MonochromeFrameProcessorSourceColor.Green), //new GrayscaleFrameProcessor(targetMaxValues, GrayscaleFrameProcessorMapMode.CoordZ, true), // new RotateFrameProcessor(targetMaxValues, 0, null, 0.1f, 25), // new RotateFrameProcessor(targetMaxValues, 90, null, 0.1f, 0), //new DuplicateReduceFrameProcessor(DuplicateReduceFrameProcessorFlags.All), // new DuplicatePointsFrameProcessor(10, 10f), // new AddBlankingPointsFrameProcessor(10, 4, true), // new SliceGlitchFrameProcessor( // maxValues: targetMaxValues, // settings: new SliceGlitchFrameProcessorSettings() { // CarryPoints = true, // DriftProbability = 0.2f, // DriftMin = (int) (targetMaxValues.Width * 0.2f), // DriftMax = (int) (targetMaxValues.Width * 0.4f), // ShiftMin = (int) (targetMaxValues.Width * -0.1f), // ShiftMax = (int) (targetMaxValues.Width * 0.1f), // SliceCountMin = 1, // SliceCountMax = 10, // SliceHeightMin = (int) (targetMaxValues.Height * 0.05f), // SliceHeightMax = (int) (targetMaxValues.Height * 0.40f), // UpdateIntervalMin = TimeSpan.FromMilliseconds(30), // UpdateIntervalMax = TimeSpan.FromMilliseconds(100) // }, // areas: new [] { new SliceArea(3225, 3688) } // ) }; // var pointBitMapper = new ShiftRegisterPointBitMapper(ShiftRegisterPointBitMapperMode.Mode_Sr8x6_XY10_Z4_3); // var pointBitMapper = new ShiftRegisterPointBitMapper(ShiftRegisterPointBitMapperMode.Mode_Sr8x6_XY10_Z4_2); // var pointBitMapper = new ShiftRegisterPointBitMapper(ShiftRegisterPointBitMapperMode.Mode_Sr8x3_XY8_Z8); // var pointBitMapper = new DirectPointBitMapper(); var pointBitMapper = new Mcp4921PointBitMapper(true, false, true, targetMaxValues); var hardwareOutput = new FT2232HardwareOutput("A", baudrate, 4096 //8192 //10240 ); // var hardwareOutput = new StubHardwareOutput(1024, 4096, 1); var mainProcess = new MainProcessor(imageSource, frameProcessors, pointBitMapper, hardwareOutput, 0, true); mainProcess.Start(); Thread.Sleep(Timeout.Infinite); return(1); }