public static void ReadI2CWorker(object data) { WiiReaderV1 reader = ((WiiReaderV1)data); while (!reader.inShutdown) { I2CPacket packet = reader.packetPool[reader.currentPacketInPool]; reader.currentPacketInPool += 1; reader.currentPacketInPool %= 100; uint status = 0; ulong timeSop = 0; ulong timeDuration = 0; uint timeDataOffset = 0; packet.Length = BeagleApi.bg_i2c_read( ((WiiReaderV1)data).hBeagle, ref status, ref timeSop, ref timeDuration, ref timeDataOffset, 1024, packet.Data); if (packet.Length >= 1) { reader.packetsToBeProcessed.Enqueue(packet); } } }
public List <string> snoop_i2c(int num_packets) { // Capture and print each transaction List <ushort> full_data = new List <ushort>(); //keep adding bytes to this as it goes List <string> lines = new List <string>(); for (int i = 0; i < num_packets || num_packets == 0; ++i) { uint status = 0; ulong time_sop = 0, time_sop_ns = 0; ulong time_duration = 0; uint time_dataoffset = 0; int count = 0; // Read transaction with bit timing data try { count = BeagleApi.bg_i2c_read(handle, ref status, ref time_sop, ref time_duration, ref time_dataoffset, max_bytes, data_in); //count = BeagleApi.bg_i2c_read_bit_timing(handle, ref status, ref time_sop, ref time_duration, ref time_dataoffset, max_bytes, data_in, timing_size, timing); } catch { Console.WriteLine("Error in I2C bit read, skipping"); continue; } string output = "";// output_parse(data_in); //for building console output string status_string = print_general_status(status); try { buffer.AddRange(data_in); //add to my own buffer } catch (System.ArgumentOutOfRangeException) { Console.WriteLine("Skipping measurement.."); } ///lines.Add(status_string + " - " + output + " - " + "Iteration: " + i); //added this so see in gui if (status_string.Contains("TIMEOUT")) { continue; //skip if no activity on bus } // Translate timestamp to ns time_sop_ns = TIMESTAMP_TO_NS(time_sop, sample_rate); ///Console.Write("{0:d},{1:d}", i, time_sop_ns); ///Console.Write(",I2C,("); if (count < 0) //error condition { Console.Write("error={0:d},", count); } ///else /// Console.Write("Read " + count + " bits. "); //print_general_status(status); //below reference funct -> moved up ///Console.Write(status_string); ///print_i2c_status(status); //below reference funct ///Console.Write(")"); // Check for errors if (count <= 0) { Console.Write("\n"); Console.Out.Flush(); //what does this do? if (count < 0) { break; } // If zero data captured, continue continue; } // Print the address and read/write ///Console.Write(","); int offset = 0; /* * if ((status & BeagleApi.BG_READ_ERR_MIDDLE_OF_PACKET) == 0) * { * // Display the start condition * Console.Write("[S] "); * * if (count >= 1) * { * // Determine if byte was NACKed * int nack = (data_in[0] & BeagleApi.BG_I2C_MONITOR_NACK); * * // Determine if this is a 10-bit address * if (count == 1 || (data_in[0] & 0xf9) != 0xf0 || * (nack != 0)) * { * // Display 7-bit address * Console.Write("<{0:x2}:{1:s}>{2:s} ", * (data_in[0] & 0xff) >> 1, * ((data_in[0] & 0x01) != 0) ? 'r' : 'w', * (nack != 0) ? "*" : ""); * offset = 1; * } * else * { * // Display 10-bit address * Console.Write("<{0:x3}:{1:s}>{2:s} ", ((data_in[0] << 7) & 0x300) | (data_in[1] & 0xff), ((data_in[0] & 0x01) != 0) ? 'r' : 'w', * (nack != 0) ? "*" : ""); * offset = 2; * } * } * } *///take out prints // Display rest of transaction - data count = count - offset; /* * for (int n = 0; n < count; ++n) * { * // Determine if byte was NACKed * int nack = (data_in[offset] & BeagleApi.BG_I2C_MONITOR_NACK); * * Console.Write("{0:x2}{1:s} ", * data_in[offset] & 0xff, (nack != 0) ? "*" : ""); ++offset; * } */ } // Stop the capture //BeagleApi.bg_disable(handle); return(lines); }