public void UpdateRadio(DBRadio radio) { string sql = "INSERT INTO radio(id, name, lastseen, lastrssi, samples, totalrssi, minrssi, minrssitime, maxrssi, maxrssitime) VALUES (@id, @name, @lastseen, @lastrssi, @samples, @totalrssi, @minrssi, @minrssitime, @maxrssi, @maxrssitime) ON DUPLICATE KEY UPDATE id=@id, name=@name, lastseen=@lastseen, samples=@samples, totalrssi=@totalrssi, minrssi=@minrssi, minrssitime=@minrssitime, maxrssi=@maxrssi, maxrssitime=@maxrssitime;"; MySqlCommand cmd = new MySqlCommand(sql, this.conn); cmd.Parameters.AddWithValue("@id", radio.RadioId); cmd.Parameters.AddWithValue("@name", radio.Name); cmd.Parameters.AddWithValue("@lastseen", radio.LastSeen); cmd.Parameters.AddWithValue("@lastrssi", radio.LastRSSI); cmd.Parameters.AddWithValue("@samples", radio.Samples); cmd.Parameters.AddWithValue("@totalrssi", radio.TotalRSSI); cmd.Parameters.AddWithValue("@minrssi", radio.MinRSSI); cmd.Parameters.AddWithValue("@minrssitime", radio.MinRSSITime); cmd.Parameters.AddWithValue("@maxrssi", radio.MaxRSSI); cmd.Parameters.AddWithValue("@maxrssitime", radio.MaxRSSITime); cmd.Prepare(); cmd.ExecuteNonQuery(); }
static void HandleUserCall(object sender, CallEventArgs e) { RadioCall call = e.Call; string rssiStr = ""; if (!double.IsNaN(call.RSSI)) { rssiStr = " RSSI " + call.RSSI; DBRadio r = db.ReadRadio(call.From); if (r == null) { r = new DBRadio(call.From.Int, call.RSSI); } else { r.AddReading(call.RSSI); } db.UpdateRadio(r); } if (call.IsAudio) { Console.WriteLine("Audio Call : {0} => {1} " + rssiStr, call.From, call.To); AudioCall ac = (AudioCall)call; string filename = String.Format(@"E:\RadioCalls\{0} - {1} to {2}.mp3", call.Start.ToString("yyyy-MM-ddTHH-mm-ss"), call.From.Int, call.To.Int); try { ac.SaveToMP3(filename); } catch (Exception) { Console.WriteLine("Unable to decode audio!"); } db.WriteVoiceCall(call.From, call.To, call.Start, call.End, call.RSSI, call.Slot, filename); srv.PublishVoiceCall(call); } else { DataCall dc = (DataCall)call; switch (dc.DataType) { case CallDataType.TMS: if (dc.TextMessage.Type == MessageType.Ack) { Console.WriteLine("Text Message Ack : {0} => {1}" + rssiStr, call.From, call.To); } else if (dc.TextMessage != null) { Console.WriteLine("Text Message : {0} => {1} \"{2}\"" + rssiStr, call.From, call.To, dc.TextMessage.Message); } else { Console.WriteLine("Text Message : {0} => {1} unable to parse!" + rssiStr, call.From, call.To); } break; case CallDataType.LRRP: LRRPPacket pkt = dc.LRRPPacket; if (pkt.Type == LRRPPacketType.ImmediateLocationResponse || pkt.Type == LRRPPacketType.TriggeredLocationData) { Console.WriteLine("Got LRRP Packet from {0} {1} {2}", call.From, pkt, rssiStr); } else { Console.WriteLine("Got LRRP Control Message: {0} => {1}" + rssiStr, call.From, call.To); } break; case CallDataType.ICMP: Console.WriteLine("Got ICMP Ping: {0} => {1}" + rssiStr, call.From, call.To); break; case CallDataType.RadioCheck: Console.WriteLine("Got Radio Check: {0} => {1}" + rssiStr, call.From, call.To); break; case CallDataType.RadioCheckAck: Console.WriteLine("Got Radio Check Ack: {0} => {1}" + rssiStr, call.From, call.To); break; case CallDataType.UnknownSmall: case CallDataType.IPAck: //Just ignore this break; default: Console.WriteLine("Data Call Type is {0}", dc.DataType); Console.WriteLine("Got Unknown radio call: {0} => {1}" + rssiStr, call.From, call.To); Console.WriteLine(" " + BitConverter.ToString(call.Data)); break; } } }