/*=====================================================================
     | FUNCTIONS
     | ====================================================================*/
    static void _timing(int handle)
    {
        int cycles;
        int ns;

        byte[] noresult = new byte[1];

        // Test the SS timing
        CheetahApi.ch_spi_queue_clear(handle);
        Console.Write("Testing inter-SS delays...\n");
        Console.Out.Flush();
        CheetahApi.ch_spi_queue_oe(handle, 1);
        CheetahApi.ch_spi_queue_ss(handle, 0x1);

        cycles = CheetahApi.ch_spi_queue_delay_cycles(handle, 51);
        Console.Write("  Queued delay of {0:d} cycles within first SS " +
                      "assert/deassert.\n", cycles);
        Console.Out.Flush();
        CheetahApi.ch_spi_queue_ss(handle, 0);

        CheetahApi.ch_spi_queue_ss(handle, 0x1);

        ns = CheetahApi.ch_spi_queue_delay_ns(handle, 1500000);
        Console.Write("  Queued delay of {0:d} ns within second SS " +
                      "assert/deassert.\n", ns);
        Console.Out.Flush();
        CheetahApi.ch_spi_queue_ss(handle, 0);

        CheetahApi.ch_spi_batch_shift(handle, 0, noresult);

        // Test data timing in read mode
        Console.Write("Testing inter-data (read) delays...\n");
        Console.Out.Flush();
        CheetahApi.ch_spi_queue_clear(handle);
        CheetahApi.ch_spi_queue_ss(handle, 0x1);

        CheetahApi.ch_spi_queue_byte(handle, 1, 0xca);
        ns = CheetahApi.ch_spi_queue_delay_ns(handle, 250000);
        Console.Write("  Queued delay of {0:d} ns after first byte " +
                      "(0xca).\n", ns);
        Console.Out.Flush();

        CheetahApi.ch_spi_queue_byte(handle, 2, 0xfe);
        cycles = CheetahApi.ch_spi_queue_delay_cycles(handle, 995);
        Console.Write("  Queued delay of {0:d} cycles after second byte " +
                      "(0xfe).\n", cycles);
        Console.Out.Flush();

        CheetahApi.ch_spi_queue_byte(handle, 3, 0x00);
        cycles = CheetahApi.ch_spi_queue_delay_cycles(handle, 20);
        Console.Write("  Queued delay of {0:d} cycles after last byte " +
                      "(0x00).\n", cycles);
        Console.Out.Flush();

        CheetahApi.ch_spi_queue_ss(handle, 0);

        byte[] data_in = new byte[6];
        CheetahApi.ch_spi_batch_shift(handle, 6, data_in);


        // Test data timing with write mode
        Console.Write("Testing inter-data (write) delays...\n");
        Console.Out.Flush();
        CheetahApi.ch_spi_queue_clear(handle);
        CheetahApi.ch_spi_queue_ss(handle, 0x1);

        CheetahApi.ch_spi_queue_byte(handle, 1, 0xba);
        ns = CheetahApi.ch_spi_queue_delay_ns(handle, 80000);
        Console.Write("  Queued delay of {0:d} ns after first byte " +
                      "(0xba).\n", ns);
        Console.Out.Flush();

        CheetahApi.ch_spi_queue_byte(handle, 2, 0xbe);
        cycles = CheetahApi.ch_spi_queue_delay_cycles(handle, 995);
        Console.Write("  Queued delay of {0:d} cycles after second byte " +
                      "(0xbe).\n", cycles);
        Console.Out.Flush();

        CheetahApi.ch_spi_queue_byte(handle, 3, 0x00);
        cycles = CheetahApi.ch_spi_queue_delay_cycles(handle, 20);
        Console.Write("  Queued delay of {0:d} cycles after last byte " +
                      "(0x00).\n", cycles);
        Console.Out.Flush();

        CheetahApi.ch_spi_queue_ss(handle, 0);
        CheetahApi.ch_spi_queue_oe(handle, 0);

        CheetahApi.ch_spi_batch_shift(handle, 1, data_in);
    }