Compare commits

...

2 Commits

Author SHA1 Message Date
feyris-tan
b943a971ef Merge branch 'master' of http://172.20.20.19:3000/ft/skyscraper8
# Conflicts:
#	skyscraper8/Properties/launchSettings.json
#	skyscraper8/Skyscraper/BbframeDeencapsulator.cs
2025-10-04 20:54:41 +02:00
feyris-tan
4e651ccdce A lot of things happened during my vacation. 2025-10-04 20:51:01 +02:00
59 changed files with 477 additions and 123 deletions

View File

@ -52,6 +52,7 @@ namespace skyscraper5.Data
putObjectArgs = putObjectArgs.WithHeaders(optionalData); putObjectArgs = putObjectArgs.WithHeaders(optionalData);
if (buffer.CanSeek) if (buffer.CanSeek)
{ {
buffer.Position = 0;
putObjectArgs = putObjectArgs.WithObjectSize(buffer.Length); putObjectArgs = putObjectArgs.WithObjectSize(buffer.Length);
} }
else if (optionalData.ContainsKey("X-Skyscraper-Content-Length")) else if (optionalData.ContainsKey("X-Skyscraper-Content-Length"))
@ -72,7 +73,20 @@ namespace skyscraper5.Data
{ {
if (task.IsFaulted) if (task.IsFaulted)
{ {
throw new MinioException("A minio upload task failed."); AggregateException exception = task.Exception;
MinioException me = exception.InnerException as MinioException;
if (me != null)
{
if (me.ServerResponse == null)
throw new UnexpectedMinioException("Minio Server Response was null.");
System.Net.Http.HttpResponseMessage response = me.ServerResponse.Response;
if (response.StatusCode != HttpStatusCode.OK)
{
throw new MinioException("A minio upload task failed.", me);
}
}
else
throw new NotImplementedException();
} }
droppedFiles.Add(fullName); droppedFiles.Add(fullName);

View File

@ -188,6 +188,8 @@ namespace skyscraper5.Data.PostgreSql
private bool TestForDnsRecord(NpgsqlConnection x, DnsRecord record, long domainId, long? ipId) private bool TestForDnsRecord(NpgsqlConnection x, DnsRecord record, long domainId, long? ipId)
{ {
record.ResourceData = record.ResourceData.Trim('\0');
NpgsqlCommand command = x.CreateCommand(); NpgsqlCommand command = x.CreateCommand();
command.CommandText = "SELECT dateadded FROM dns_records WHERE domain_id = @did AND record_type = @rt AND resource_data = @rd"; command.CommandText = "SELECT dateadded FROM dns_records WHERE domain_id = @did AND record_type = @rt AND resource_data = @rd";
command.Parameters.AddWithValue("@did", domainId); command.Parameters.AddWithValue("@did", domainId);

View File

@ -106,6 +106,9 @@ namespace skyscraper5.Data.PostgreSql
public void UpdateDvbiServiceListLastCheckedDate(string id, DateTime currentTime) public void UpdateDvbiServiceListLastCheckedDate(string id, DateTime currentTime)
{ {
EnqueueTask(x => UpdateDvbiServiceListLastCheckedDateEx(x, id, currentTime)); EnqueueTask(x => UpdateDvbiServiceListLastCheckedDateEx(x, id, currentTime));
if (_knownDvbiServiceListUpdateDates == null)
_knownDvbiServiceListUpdateDates = new Dictionary<string, DateTime>();
_knownDvbiServiceListUpdateDates[id] = currentTime; _knownDvbiServiceListUpdateDates[id] = currentTime;
} }

View File

@ -561,7 +561,7 @@ namespace skyscraper5.Data.PostgreSql
timNid = interactiveNetworkId; timNid = interactiveNetworkId;
NpgsqlCommand command = x.CreateCommand(); NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dvb_ic_fct (nid, frame_id, frame_duration, total_timeslot_count, start_timeslot_number)" + command.CommandText = "INSERT INTO dvb_ic_fct (nid, frame_id, frame_duration, total_timeslot_count, start_timeslot_number)" +
"VALUES (@nid,@fid,@fduration,@ttcount,@stnumber)RETURNING uuid"; "VALUES (@nid,@fid,@fduration,@ttcount,@stnumber) RETURNING uuid";
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)interactiveNetworkId); command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)interactiveNetworkId);
command.Parameters.AddWithValue("@fid", NpgsqlTypes.NpgsqlDbType.Integer, (int)frame.FrameId); command.Parameters.AddWithValue("@fid", NpgsqlTypes.NpgsqlDbType.Integer, (int)frame.FrameId);
command.Parameters.AddWithValue("@fduration", NpgsqlTypes.NpgsqlDbType.Bigint, (long)frame.FrameDuration); command.Parameters.AddWithValue("@fduration", NpgsqlTypes.NpgsqlDbType.Bigint, (long)frame.FrameDuration);
@ -660,7 +660,18 @@ namespace skyscraper5.Data.PostgreSql
private void CreateTimEx(NpgsqlConnection x, PhysicalAddress mac, ushort nid) private void CreateTimEx(NpgsqlConnection x, PhysicalAddress mac, ushort nid)
{ {
NpgsqlCommand command = x.CreateCommand(); NpgsqlCommand testCommand = x.CreateCommand();
testCommand.CommandText = "SELECT dateadded FROM dvb_ic_tim WHERE mac = @mac AND nid = @nid";
testCommand.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
testCommand.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)nid);
NpgsqlDataReader dataReader = testCommand.ExecuteReader();
bool alreadyKnown = dataReader.Read();
dataReader.Close();
if (alreadyKnown)
return;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dvb_ic_tim (mac,nid) VALUES (@mac,@nid)"; command.CommandText = "INSERT INTO dvb_ic_tim (mac,nid) VALUES (@mac,@nid)";
command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac); command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)nid); command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)nid);

View File

@ -175,8 +175,8 @@ namespace skyscraper5.Data.PostgreSql
NpgsqlCommand cmd = connection.CreateCommand(); NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "insert into dvb_sdt_messages (tsid, onid, sid, msgid, language_code, message, dateadded)\r\nvalues (@tsid,@onid,@sid,@msgid,@language,@message,DEFAULT)"; cmd.CommandText = "insert into dvb_sdt_messages (tsid, onid, sid, msgid, language_code, message, dateadded)\r\nvalues (@tsid,@onid,@sid,@msgid,@language,@message,DEFAULT)";
cmd.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, transportStreamId); cmd.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStreamId);
cmd.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, originalNetworkId); cmd.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)originalNetworkId);
cmd.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)sdtService.ServiceId); cmd.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)sdtService.ServiceId);
cmd.Parameters.Add("@msgid", NpgsqlDbType.Integer); cmd.Parameters.Add("@msgid", NpgsqlDbType.Integer);
cmd.Parameters.Add("@language", NpgsqlDbType.Varchar); cmd.Parameters.Add("@language", NpgsqlDbType.Varchar);
@ -184,7 +184,7 @@ namespace skyscraper5.Data.PostgreSql
foreach (MessageDescriptor message in sdtService.Messages) foreach (MessageDescriptor message in sdtService.Messages)
{ {
cmd.Parameters["@msgid"].Value = message.MessageId; cmd.Parameters["@msgid"].Value = (int)message.MessageId;
cmd.Parameters["@language"].Value = message.Iso639LanguageCode; cmd.Parameters["@language"].Value = message.Iso639LanguageCode;
cmd.Parameters["@message"].Value = message.Message; cmd.Parameters["@message"].Value = message.Message;
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();

View File

@ -12,7 +12,7 @@ using skyscraper8.Skyscraper.Plugins;
namespace SDL2Demo.Forms namespace SDL2Demo.Forms
{ {
internal class LogWindow : PluginAppenderEx, IRenderable /*internal class LogWindow : PluginAppenderEx, IRenderable
{ {
public LogWindow() public LogWindow()
{ {
@ -158,5 +158,5 @@ namespace SDL2Demo.Forms
{ {
Log(String.Format("{0} {1} [{2}] {3}", mappedTime.ToShortDateString(), mappedTime.ToShortTimeString(), mappedLoggerName, mappedMessage)); Log(String.Format("{0} {1} [{2}] {3}", mappedTime.ToShortDateString(), mappedTime.ToShortTimeString(), mappedLoggerName, mappedMessage));
} }
} }*/
} }

View File

@ -27,7 +27,7 @@ namespace SDL2Demo
public List<IRenderable> Renderables { get; set; } public List<IRenderable> Renderables { get; set; }
public List<IPressurePlate> PressurePlates { get; set; } public List<IPressurePlate> PressurePlates { get; set; }
public LogWindow LogWindow { get; set; } //public LogWindow LogWindow { get; set; }
public bool MemorySaverMode { get; set; } public bool MemorySaverMode { get; set; }
public IStreamReader StreamReader { get; set; } public IStreamReader StreamReader { get; set; }
public Ini Ini { get; set; } public Ini Ini { get; set; }

View File

@ -245,7 +245,7 @@ namespace SDL2Demo.Jobs
jobStorage.InsertBlindscanJob(jobInDb); jobStorage.InsertBlindscanJob(jobInDb);
} }
JobContext.LogWindow.Log("Attempting to start the tuner...", 8); //JobContext.LogWindow.Log("Attempting to start the tuner...", 8);
if (!streamReader.StartDvbEx(SelectedBlindscanTarget.tunerIndex)) if (!streamReader.StartDvbEx(SelectedBlindscanTarget.tunerIndex))
{ {
JobContext.MessageQueue.Enqueue(new MessageWindow("Failed to start tuner.")); JobContext.MessageQueue.Enqueue(new MessageWindow("Failed to start tuner."));
@ -253,7 +253,7 @@ namespace SDL2Demo.Jobs
return; return;
} }
JobContext.LogWindow.Log("Tuner started", 8); //JobContext.LogWindow.Log("Tuner started", 8);
foundFrequencies = new List<BlindscanResult>(); foundFrequencies = new List<BlindscanResult>();
ourFoundFrequenciesWindow = new FoundFrequenciesWindow(foundFrequencies, SelectedBlindscanTarget.tunerStandard, JobContext); ourFoundFrequenciesWindow = new FoundFrequenciesWindow(foundFrequencies, SelectedBlindscanTarget.tunerStandard, JobContext);
@ -458,7 +458,7 @@ namespace SDL2Demo.Jobs
{ {
if (SendDiseqcCommand(diseqc, false, true)) if (SendDiseqcCommand(diseqc, false, true))
{ {
JobContext.LogWindow.Log(String.Format("Scanning low horizontal band...")); //JobContext.LogWindow.Log(String.Format("Scanning low horizontal band..."));
jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool hLower = BlScan2Wrap(startFreq, lofSw, 0, lof1, lof2, lofSw,allocHGlobal, ref tpNum,((ref SearchResult searchResult) => SearchResult1Callback(searchResult,1))); bool hLower = BlScan2Wrap(startFreq, lofSw, 0, lof1, lof2, lofSw,allocHGlobal, ref tpNum,((ref SearchResult searchResult) => SearchResult1Callback(searchResult,1)));
@ -466,7 +466,7 @@ namespace SDL2Demo.Jobs
JobContext.Puppets[1].AutoMoveToHome(); JobContext.Puppets[1].AutoMoveToHome();
if (!hLower) if (!hLower)
{ {
JobContext.MessageQueue.Enqueue(new MessageWindow("Blindscanning low horizontal area failed.")); //JobContext.MessageQueue.Enqueue(new MessageWindow("Blindscanning low horizontal area failed."));
jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_FAILED; jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_FAILED;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
} }
@ -494,7 +494,7 @@ namespace SDL2Demo.Jobs
if (SendDiseqcCommand(diseqc, true, true)) if (SendDiseqcCommand(diseqc, true, true))
{ {
SendDiseqcCommand(diseqc, true, true); SendDiseqcCommand(diseqc, true, true);
JobContext.LogWindow.Log(String.Format("Scanning high horizontal band...")); //JobContext.LogWindow.Log(String.Format("Scanning high horizontal band..."));
jobInDb.HorizontalHighState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.HorizontalHighState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool hUpper = BlScan2Wrap(lofSw, endFreq, 0, lof1, lof2, lofSw,allocHGlobal, ref tpNum,((ref SearchResult searchResult) => SearchResult1Callback(searchResult,2))); bool hUpper = BlScan2Wrap(lofSw, endFreq, 0, lof1, lof2, lofSw,allocHGlobal, ref tpNum,((ref SearchResult searchResult) => SearchResult1Callback(searchResult,2)));
@ -529,7 +529,7 @@ namespace SDL2Demo.Jobs
{ {
if (SendDiseqcCommand(diseqc, false, false)) if (SendDiseqcCommand(diseqc, false, false))
{ {
JobContext.LogWindow.Log(String.Format("Scanning low vertical band...")); //JobContext.LogWindow.Log(String.Format("Scanning low vertical band..."));
jobInDb.VerticalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.VerticalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool vLower = BlScan2Wrap(startFreq, lofSw, 1, lof1, lof2, lofSw,allocHGlobal, ref tpNum,((ref SearchResult searchResult) => SearchResult1Callback(searchResult,3))); bool vLower = BlScan2Wrap(startFreq, lofSw, 1, lof1, lof2, lofSw,allocHGlobal, ref tpNum,((ref SearchResult searchResult) => SearchResult1Callback(searchResult,3)));
@ -564,7 +564,7 @@ namespace SDL2Demo.Jobs
{ {
if (SendDiseqcCommand(diseqc, true, false)) if (SendDiseqcCommand(diseqc, true, false))
{ {
JobContext.LogWindow.Log(String.Format("Scanning high vertical band...")); //JobContext.LogWindow.Log(String.Format("Scanning high vertical band..."));
jobInDb.VerticalHighState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.VerticalHighState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool vUpper = BlScan2Wrap(lofSw, endFreq, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult,4))); bool vUpper = BlScan2Wrap(lofSw, endFreq, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult,4)));
@ -599,7 +599,7 @@ namespace SDL2Demo.Jobs
{ {
if (SendDiseqcCommand(diseqc, false, true)) if (SendDiseqcCommand(diseqc, false, true))
{ {
JobContext.LogWindow.Log(String.Format("Scanning left circular band...")); //JobContext.LogWindow.Log(String.Format("Scanning left circular band..."));
jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool lCirc = BlScan2Wrap(startFreq, endFreq, 0, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult,1))); bool lCirc = BlScan2Wrap(startFreq, endFreq, 0, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult,1)));
@ -630,7 +630,7 @@ namespace SDL2Demo.Jobs
} }
if (SendDiseqcCommand(diseqc, false, false)) if (SendDiseqcCommand(diseqc, false, false))
{ {
JobContext.LogWindow.Log(String.Format("Scanning right circular band...")); //JobContext.LogWindow.Log(String.Format("Scanning right circular band..."));
jobInDb.VerticalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.VerticalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool rCirc = BlScan2Wrap(startFreq, endFreq, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult,3))); bool rCirc = BlScan2Wrap(startFreq, endFreq, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult,3)));
@ -709,7 +709,7 @@ namespace SDL2Demo.Jobs
foundFrequencies.Add(blindscanResult); foundFrequencies.Add(blindscanResult);
} }
JobContext.LogWindow.Log(String.Format("Found frequency: {0}, {1}", searchResult.Freq / 1000,searchResult.Pol == 0 ? "H" : "V")); //JobContext.LogWindow.Log(String.Format("Found frequency: {0}, {1}", searchResult.Freq / 1000,searchResult.Pol == 0 ? "H" : "V"));
SoundPlayer.PlaySoundFile("lock.wav"); SoundPlayer.PlaySoundFile("lock.wav");
_blindscanProgressWindow.Progress = searchResult.Freq; _blindscanProgressWindow.Progress = searchResult.Freq;
@ -731,7 +731,7 @@ namespace SDL2Demo.Jobs
foundFrequencies.Add(blindscanResult); foundFrequencies.Add(blindscanResult);
} }
JobContext.LogWindow.Log(String.Format("Found frequency: {0}", searchResult.Freq / 1000)); //JobContext.LogWindow.Log(String.Format("Found frequency: {0}", searchResult.Freq / 1000));
SoundPlayer.PlaySoundFile("lock.wav"); SoundPlayer.PlaySoundFile("lock.wav");
jobStorage.InsertSearchResult(jobInDb, false, new SearchResult(), 7, searchResult); jobStorage.InsertSearchResult(jobInDb, false, new SearchResult(), 7, searchResult);
@ -776,16 +776,15 @@ namespace SDL2Demo.Jobs
} }
} }
JobContext.LogWindow.Log(String.Format("Send DiSEqC Command {0:X2}", (byte)myOpcode), 8); //JobContext.LogWindow.Log(String.Format("Send DiSEqC Command {0:X2}", (byte)myOpcode), 8);
DateTime started = DateTime.Now; DateTime started = DateTime.Now;
bool result = streamReader.SendDiSEqC((uint)diseqcType, myOpcode); bool result = streamReader.SendDiSEqC((uint)diseqcType, myOpcode);
TimeSpan timeTaken = DateTime.Now - started; TimeSpan timeTaken = DateTime.Now - started;
JobContext.LogWindow.Log(String.Format("DiSEqC Comannd sent in {0:F1} seconds.", timeTaken.TotalSeconds)); //JobContext.LogWindow.Log(String.Format("DiSEqC Comannd sent in {0:F1} seconds.", timeTaken.TotalSeconds));
if (timeTaken.TotalSeconds > 10) if (timeTaken.TotalSeconds > 10)
{ {
JobContext.LogWindow.Log( //JobContext.LogWindow.Log(String.Format("Something went wrong while performing the DiSEqC operation, trying again..."), 8);
String.Format("Something went wrong while performing the DiSEqC operation, trying again..."), 8);
Thread.Sleep(1000); Thread.Sleep(1000);
return SendDiseqcCommand(diseqcType, highBand, horizontal); return SendDiseqcCommand(diseqcType, highBand, horizontal);
} }
@ -929,7 +928,7 @@ namespace SDL2Demo.Jobs
} }
else else
{ {
JobContext.LogWindow.Log(String.Format("odd packet size!"), 8); //JobContext.LogWindow.Log(String.Format("odd packet size!"), 8);
} }
} }
@ -987,8 +986,7 @@ namespace SDL2Demo.Jobs
if (packetsQueue.Count == 0) if (packetsQueue.Count == 0)
return; return;
JobContext.LogWindow.Log( //JobContext.LogWindow.Log(String.Format("{0} packets left after switching off the filter.", packetsQueue.Count), 8);
String.Format("{0} packets left after switching off the filter.", packetsQueue.Count), 8);
DateTime startedAt = DateTime.Now; DateTime startedAt = DateTime.Now;
byte[] singlePacketBuffer = new byte[188]; byte[] singlePacketBuffer = new byte[188];
@ -1009,14 +1007,11 @@ namespace SDL2Demo.Jobs
drainTickerNow = DateTime.Now; drainTickerNow = DateTime.Now;
if (drainTickerNow.Second != drainTickerPrevious.Second) if (drainTickerNow.Second != drainTickerPrevious.Second)
{ {
JobContext.LogWindow.Log( //JobContext.LogWindow.Log(String.Format("{0} packets left ({1}).", packetsQueue.Count, drainTickerNow.ToLongTimeString()),8);
String.Format("{0} packets left ({1}).", packetsQueue.Count, drainTickerNow.ToLongTimeString()),
8);
} }
} }
JobContext.LogWindow.Log( //JobContext.LogWindow.Log(String.Format("Packets drained in {0} seconds.", (DateTime.Now - startedAt).TotalSeconds), 8);
String.Format("Packets drained in {0} seconds.", (DateTime.Now - startedAt).TotalSeconds), 8);
} }
private void RunSkyscraper(BlindscanResult result) private void RunSkyscraper(BlindscanResult result)
@ -1056,7 +1051,7 @@ namespace SDL2Demo.Jobs
*/ */
JobContext.LogWindow.Log(String.Format("Trying to BLScanEx..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to BLScanEx..."), 8);
if (!streamReader.BLScanEx(result.sr1.Freq, 5000, result.sr1.Pol, if (!streamReader.BLScanEx(result.sr1.Freq, 5000, result.sr1.Pol,
SelectedBlindscanTarget.lnbType.Lof1 * 1000, SelectedBlindscanTarget.lnbType.Lof2 * 1000, SelectedBlindscanTarget.lnbType.Lof1 * 1000, SelectedBlindscanTarget.lnbType.Lof2 * 1000,
SelectedBlindscanTarget.lnbType.LofSw * 1000, 1000000, (STD_TYPE)result.sr1.StdType, SelectedBlindscanTarget.lnbType.LofSw * 1000, 1000000, (STD_TYPE)result.sr1.StdType,
@ -1071,7 +1066,7 @@ namespace SDL2Demo.Jobs
if (!satelliteSr.Lock) if (!satelliteSr.Lock)
{ {
JobContext.LogWindow.Log(String.Format("Trying to SetChannel..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to SetChannel..."), 8);
bool channel = streamReader.SetChannel(result.sr1.Freq, result.sr1.SR, result.sr1.Freq, result.sr1.FEC, SelectedBlindscanTarget.lnbType.Lof1 * 1000, SelectedBlindscanTarget.lnbType.Lof2 * 1000, SelectedBlindscanTarget.lnbType.LofSw * 1000); bool channel = streamReader.SetChannel(result.sr1.Freq, result.sr1.SR, result.sr1.Freq, result.sr1.FEC, SelectedBlindscanTarget.lnbType.Lof1 * 1000, SelectedBlindscanTarget.lnbType.Lof2 * 1000, SelectedBlindscanTarget.lnbType.LofSw * 1000);
if (!channel) if (!channel)
{ {
@ -1082,7 +1077,7 @@ namespace SDL2Demo.Jobs
} }
else else
{ {
JobContext.LogWindow.Log(String.Format("Trying to get SignalInfo..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to get SignalInfo..."), 8);
bool signalInfo = streamReader.SignalInfo(ref satelliteSr); bool signalInfo = streamReader.SignalInfo(ref satelliteSr);
if (!signalInfo) if (!signalInfo)
{ {
@ -1118,7 +1113,7 @@ namespace SDL2Demo.Jobs
} }
else if (caps.HasFlag(Caps.SR_SIGINFO2)) else if (caps.HasFlag(Caps.SR_SIGINFO2))
{ {
JobContext.LogWindow.Log(String.Format("Trying to SetChannel2..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to SetChannel2..."), 8);
bool channel2 = streamReader.SetChannel2((uint)result.sr2.Freq, (uint)result.sr2.BW); bool channel2 = streamReader.SetChannel2((uint)result.sr2.Freq, (uint)result.sr2.BW);
if (!channel2) if (!channel2)
{ {
@ -1128,7 +1123,7 @@ namespace SDL2Demo.Jobs
return; return;
} }
JobContext.LogWindow.Log(String.Format("Trying to get SignalInfo2..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to get SignalInfo2..."), 8);
bool signalInfo2 = streamReader.SignalInfo2(ref cableSr); bool signalInfo2 = streamReader.SignalInfo2(ref cableSr);
if (!signalInfo2) if (!signalInfo2)
{ {
@ -1155,7 +1150,7 @@ namespace SDL2Demo.Jobs
{ {
if (misMode) if (misMode)
{ {
JobContext.LogWindow.Log(String.Format("Selecting MIS IS {0}", satelliteSr.IS[mis]), 8); //JobContext.LogWindow.Log(String.Format("Selecting MIS IS {0}", satelliteSr.IS[mis]), 8);
bool misSel = streamReader.MISSel(misMode, satelliteSr.IS[mis], 0xff); bool misSel = streamReader.MISSel(misMode, satelliteSr.IS[mis], 0xff);
if (!misSel) if (!misSel)
{ {
@ -1183,7 +1178,7 @@ namespace SDL2Demo.Jobs
} }
IntPtr filterReference = IntPtr.MaxValue; IntPtr filterReference = IntPtr.MaxValue;
JobContext.LogWindow.Log(String.Format("Set-Up filter..."), 8); //JobContext.LogWindow.Log(String.Format("Set-Up filter..."), 8);
packetsToDrop = 1024; packetsToDrop = 1024;
packetsQueue = new Queue<byte[]>(); packetsQueue = new Queue<byte[]>();
ourFoundFrequenciesWindow.statusPacketsInqueue = 0; ourFoundFrequenciesWindow.statusPacketsInqueue = 0;
@ -1196,7 +1191,7 @@ namespace SDL2Demo.Jobs
SoundPlayer.PlaySoundFile("fail.wav"); SoundPlayer.PlaySoundFile("fail.wav");
return; return;
} }
JobContext.LogWindow.Log(String.Format("Filter set-up complete!"), 8); //JobContext.LogWindow.Log(String.Format("Filter set-up complete!"), 8);
//Use the Filter //Use the Filter
result.State = BlindscanResultState.Scraping; result.State = BlindscanResultState.Scraping;
@ -1246,7 +1241,7 @@ namespace SDL2Demo.Jobs
} }
ourFoundFrequenciesWindow.allowZapNow = false; ourFoundFrequenciesWindow.allowZapNow = false;
//Stop Filter //Stop Filter
JobContext.LogWindow.Log(String.Format("Deleting Filter..."), 8); //JobContext.LogWindow.Log(String.Format("Deleting Filter..."), 8);
bool stopped = streamReader.DelFilter(filterReference); bool stopped = streamReader.DelFilter(filterReference);
if (!stopped) if (!stopped)
{ {
@ -1254,7 +1249,7 @@ namespace SDL2Demo.Jobs
jobStorage.UpdateTransponderState(jobInDb, result.Satellite, result.sr1, result.State, result.sr2); jobStorage.UpdateTransponderState(jobInDb, result.Satellite, result.sr1, result.State, result.sr2);
return; return;
} }
JobContext.LogWindow.Log(String.Format("Deleted filter!"), 8); //JobContext.LogWindow.Log(String.Format("Deleted filter!"), 8);
DrainPackets(); DrainPackets();
skyscraperContext.Dispose(); skyscraperContext.Dispose();

View File

@ -299,7 +299,7 @@ namespace SDL2Demo.Jobs
SetTuner(1); SetTuner(1);
if (SendDiseqcCommand(false, true)) if (SendDiseqcCommand(false, true))
{ {
JobContext.LogWindow.Log(String.Format("Scanning low horizontal band...")); //JobContext.LogWindow.Log(String.Format("Scanning low horizontal band..."));
jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool hLower = BlScan2Wrap(startFreq, lofSw, 0, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 1))); bool hLower = BlScan2Wrap(startFreq, lofSw, 0, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 1)));
@ -337,7 +337,7 @@ namespace SDL2Demo.Jobs
SetTuner(1); SetTuner(1);
if (SendDiseqcCommand(true, true)) if (SendDiseqcCommand(true, true))
{ {
JobContext.LogWindow.Log(String.Format("Scanning high horizontal band...")); //JobContext.LogWindow.Log(String.Format("Scanning high horizontal band..."));
jobInDb.HorizontalHighState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.HorizontalHighState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool hUpper = BlScan2Wrap(lofSw, endFreq, 0, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 2))); bool hUpper = BlScan2Wrap(lofSw, endFreq, 0, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 2)));
@ -375,7 +375,7 @@ namespace SDL2Demo.Jobs
SetTuner(1); SetTuner(1);
if (SendDiseqcCommand(false, false)) if (SendDiseqcCommand(false, false))
{ {
JobContext.LogWindow.Log(String.Format("Scanning low vertical band...")); //JobContext.LogWindow.Log(String.Format("Scanning low vertical band..."));
jobInDb.VerticalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.VerticalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool vLower = BlScan2Wrap(startFreq, lofSw, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 3))); bool vLower = BlScan2Wrap(startFreq, lofSw, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 3)));
@ -413,7 +413,7 @@ namespace SDL2Demo.Jobs
SetTuner(1); SetTuner(1);
if (SendDiseqcCommand(true, false)) if (SendDiseqcCommand(true, false))
{ {
JobContext.LogWindow.Log(String.Format("Scanning high vertical band...")); //JobContext.LogWindow.Log(String.Format("Scanning high vertical band..."));
jobInDb.VerticalHighState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.VerticalHighState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool vUpper = BlScan2Wrap(lofSw, endFreq, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 4))); bool vUpper = BlScan2Wrap(lofSw, endFreq, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 4)));
@ -451,7 +451,7 @@ namespace SDL2Demo.Jobs
SetTuner(1); SetTuner(1);
if (SendDiseqcCommand(false, true)) if (SendDiseqcCommand(false, true))
{ {
JobContext.LogWindow.Log(String.Format("Scanning left circular band...")); //JobContext.LogWindow.Log(String.Format("Scanning left circular band..."));
jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.HorizontalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool lCirc = BlScan2Wrap(startFreq, endFreq, 0, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 1))); bool lCirc = BlScan2Wrap(startFreq, endFreq, 0, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 1)));
@ -485,7 +485,7 @@ namespace SDL2Demo.Jobs
SetTuner(1); SetTuner(1);
if (SendDiseqcCommand(false, false)) if (SendDiseqcCommand(false, false))
{ {
JobContext.LogWindow.Log(String.Format("Scanning right circular band...")); //JobContext.LogWindow.Log(String.Format("Scanning right circular band..."));
jobInDb.VerticalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING; jobInDb.VerticalLowState = DbBlindscanJobPolarizationStatus.SELECTED_BLINDSCANNING;
jobStorage.UpdateJobState(jobInDb); jobStorage.UpdateJobState(jobInDb);
bool rCirc = BlScan2Wrap(startFreq, endFreq, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 3))); bool rCirc = BlScan2Wrap(startFreq, endFreq, 1, lof1, lof2, lofSw, allocHGlobal, ref tpNum, ((ref SearchResult searchResult) => SearchResult1Callback(searchResult, 3)));
@ -622,16 +622,15 @@ namespace SDL2Demo.Jobs
throw new ArgumentOutOfRangeException("DiSEqC Switch Position"); throw new ArgumentOutOfRangeException("DiSEqC Switch Position");
} }
JobContext.LogWindow.Log(String.Format("Send DiSEqC Command {0:X2}", (byte)myOpcode), 8); //JobContext.LogWindow.Log(String.Format("Send DiSEqC Command {0:X2}", (byte)myOpcode), 8);
DateTime started = DateTime.Now; DateTime started = DateTime.Now;
bool result = streamReader.SendDiSEqC((uint)2, myOpcode); bool result = streamReader.SendDiSEqC((uint)2, myOpcode);
TimeSpan timeTaken = DateTime.Now - started; TimeSpan timeTaken = DateTime.Now - started;
JobContext.LogWindow.Log(String.Format("DiSEqC Comannd sent in {0:F1} seconds.", timeTaken.TotalSeconds)); //JobContext.LogWindow.Log(String.Format("DiSEqC Comannd sent in {0:F1} seconds.", timeTaken.TotalSeconds));
if (timeTaken.TotalSeconds > 10) if (timeTaken.TotalSeconds > 10)
{ {
JobContext.LogWindow.Log( //JobContext.LogWindow.Log(String.Format("Something went wrong while performing the DiSEqC operation, trying again..."), 8);
String.Format("Something went wrong while performing the DiSEqC operation, trying again..."), 8);
Thread.Sleep(1000); Thread.Sleep(1000);
return SendDiseqcCommand(highBand, horizontal); return SendDiseqcCommand(highBand, horizontal);
} }
@ -653,7 +652,7 @@ namespace SDL2Demo.Jobs
foundFrequencies.Add(blindscanResult); foundFrequencies.Add(blindscanResult);
} }
JobContext.LogWindow.Log(String.Format("Found frequency: {0}, {1}", searchResult.Freq / 1000, searchResult.Pol == 0 ? "H" : "V")); //JobContext.LogWindow.Log(String.Format("Found frequency: {0}, {1}", searchResult.Freq / 1000, searchResult.Pol == 0 ? "H" : "V"));
SoundPlayer.PlaySoundFile("lock.wav"); SoundPlayer.PlaySoundFile("lock.wav");
_blindscanProgressWindow.Progress = searchResult.Freq; _blindscanProgressWindow.Progress = searchResult.Freq;
@ -865,7 +864,7 @@ namespace SDL2Demo.Jobs
if (caps.HasFlag(Caps.SR_SIGINFO)) if (caps.HasFlag(Caps.SR_SIGINFO))
{ {
JobContext.LogWindow.Log(String.Format("Trying to BLScanEx..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to BLScanEx..."), 8);
if (!streamReader.BLScanEx(result.sr1.Freq, 5000, result.sr1.Pol, if (!streamReader.BLScanEx(result.sr1.Freq, 5000, result.sr1.Pol,
Configuration.LnbType.Lof1 * 1000, Configuration.LnbType.Lof2 * 1000, Configuration.LnbType.Lof1 * 1000, Configuration.LnbType.Lof2 * 1000,
Configuration.LnbType.LofSw * 1000, 1000000, (STD_TYPE)result.sr1.StdType, Configuration.LnbType.LofSw * 1000, 1000000, (STD_TYPE)result.sr1.StdType,
@ -880,7 +879,7 @@ namespace SDL2Demo.Jobs
if (!satelliteSr.Lock) if (!satelliteSr.Lock)
{ {
JobContext.LogWindow.Log(String.Format("Trying to SetChannel..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to SetChannel..."), 8);
bool channel = streamReader.SetChannel(result.sr1.Freq, result.sr1.SR, result.sr1.Freq, result.sr1.FEC, Configuration.LnbType.Lof1 * 1000, Configuration.LnbType.Lof2 * 1000, Configuration.LnbType.LofSw * 1000); bool channel = streamReader.SetChannel(result.sr1.Freq, result.sr1.SR, result.sr1.Freq, result.sr1.FEC, Configuration.LnbType.Lof1 * 1000, Configuration.LnbType.Lof2 * 1000, Configuration.LnbType.LofSw * 1000);
if (!channel) if (!channel)
{ {
@ -891,7 +890,7 @@ namespace SDL2Demo.Jobs
} }
else else
{ {
JobContext.LogWindow.Log(String.Format("Trying to get SignalInfo..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to get SignalInfo..."), 8);
bool signalInfo = streamReader.SignalInfo(ref satelliteSr); bool signalInfo = streamReader.SignalInfo(ref satelliteSr);
if (!signalInfo) if (!signalInfo)
{ {
@ -927,7 +926,7 @@ namespace SDL2Demo.Jobs
} }
else if (caps.HasFlag(Caps.SR_SIGINFO2)) else if (caps.HasFlag(Caps.SR_SIGINFO2))
{ {
JobContext.LogWindow.Log(String.Format("Trying to SetChannel2..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to SetChannel2..."), 8);
bool channel2 = streamReader.SetChannel2((uint)result.sr2.Freq, (uint)result.sr2.BW); bool channel2 = streamReader.SetChannel2((uint)result.sr2.Freq, (uint)result.sr2.BW);
if (!channel2) if (!channel2)
{ {
@ -937,7 +936,7 @@ namespace SDL2Demo.Jobs
return; return;
} }
JobContext.LogWindow.Log(String.Format("Trying to get SignalInfo2..."), 8); //JobContext.LogWindow.Log(String.Format("Trying to get SignalInfo2..."), 8);
bool signalInfo2 = streamReader.SignalInfo2(ref cableSr); bool signalInfo2 = streamReader.SignalInfo2(ref cableSr);
if (!signalInfo2) if (!signalInfo2)
{ {
@ -975,7 +974,7 @@ namespace SDL2Demo.Jobs
{ {
if (misMode) if (misMode)
{ {
JobContext.LogWindow.Log(String.Format("Selecting MIS IS {0}", satelliteSr.IS[mis]), 8); //JobContext.LogWindow.Log(String.Format("Selecting MIS IS {0}", satelliteSr.IS[mis]), 8);
bool misSel = streamReader.MISSel(misMode, satelliteSr.IS[mis], 0xff); bool misSel = streamReader.MISSel(misMode, satelliteSr.IS[mis], 0xff);
if (!misSel) if (!misSel)
{ {
@ -1003,7 +1002,7 @@ namespace SDL2Demo.Jobs
} }
IntPtr filterReference = IntPtr.MaxValue; IntPtr filterReference = IntPtr.MaxValue;
JobContext.LogWindow.Log(String.Format("Set-Up filter..."), 8); //JobContext.LogWindow.Log(String.Format("Set-Up filter..."), 8);
packetsToDrop = 1024; packetsToDrop = 1024;
packetsQueue = new Queue<byte[]>(); packetsQueue = new Queue<byte[]>();
ourFoundFrequenciesWindow.statusPacketsInqueue = 0; ourFoundFrequenciesWindow.statusPacketsInqueue = 0;
@ -1016,7 +1015,7 @@ namespace SDL2Demo.Jobs
SoundPlayer.PlaySoundFile("fail.wav"); SoundPlayer.PlaySoundFile("fail.wav");
return; return;
} }
JobContext.LogWindow.Log(String.Format("Filter set-up complete!"), 8); //JobContext.LogWindow.Log(String.Format("Filter set-up complete!"), 8);
//Use the Filter //Use the Filter
result.State = BlindscanResultState.Scraping; result.State = BlindscanResultState.Scraping;
@ -1067,7 +1066,7 @@ namespace SDL2Demo.Jobs
} }
ourFoundFrequenciesWindow.allowZapNow = false; ourFoundFrequenciesWindow.allowZapNow = false;
//Stop Filter //Stop Filter
JobContext.LogWindow.Log(String.Format("Deleting Filter..."), 8); //JobContext.LogWindow.Log(String.Format("Deleting Filter..."), 8);
bool stopped = streamReader.DelFilter(filterReference); bool stopped = streamReader.DelFilter(filterReference);
if (!stopped) if (!stopped)
{ {
@ -1075,7 +1074,7 @@ namespace SDL2Demo.Jobs
jobStorage.UpdateTransponderState(jobInDb, result.Satellite, result.sr1, result.State, result.sr2); jobStorage.UpdateTransponderState(jobInDb, result.Satellite, result.sr1, result.State, result.sr2);
return; return;
} }
JobContext.LogWindow.Log(String.Format("Deleted filter!"), 8); //JobContext.LogWindow.Log(String.Format("Deleted filter!"), 8);
DrainPackets(); DrainPackets();
skyscraperContext.Dispose(); skyscraperContext.Dispose();
@ -1131,7 +1130,7 @@ namespace SDL2Demo.Jobs
} }
else else
{ {
JobContext.LogWindow.Log(String.Format("odd packet size!"), 8); //JobContext.LogWindow.Log(String.Format("odd packet size!"), 8);
} }
} }
@ -1184,8 +1183,7 @@ namespace SDL2Demo.Jobs
if (packetsQueue.Count == 0) if (packetsQueue.Count == 0)
return; return;
JobContext.LogWindow.Log( //JobContext.LogWindow.Log(String.Format("{0} packets left after switching off the filter.", packetsQueue.Count), 8);
String.Format("{0} packets left after switching off the filter.", packetsQueue.Count), 8);
DateTime startedAt = DateTime.Now; DateTime startedAt = DateTime.Now;
byte[] singlePacketBuffer = new byte[188]; byte[] singlePacketBuffer = new byte[188];
@ -1206,14 +1204,11 @@ namespace SDL2Demo.Jobs
drainTickerNow = DateTime.Now; drainTickerNow = DateTime.Now;
if (drainTickerNow.Second != drainTickerPrevious.Second) if (drainTickerNow.Second != drainTickerPrevious.Second)
{ {
JobContext.LogWindow.Log( //JobContext.LogWindow.Log(String.Format("{0} packets left ({1}).", packetsQueue.Count, drainTickerNow.ToLongTimeString()),8);
String.Format("{0} packets left ({1}).", packetsQueue.Count, drainTickerNow.ToLongTimeString()),
8);
} }
} }
JobContext.LogWindow.Log( //JobContext.LogWindow.Log(String.Format("Packets drained in {0} seconds.", (DateTime.Now - startedAt).TotalSeconds), 8);
String.Format("Packets drained in {0} seconds.", (DateTime.Now - startedAt).TotalSeconds), 8);
} }
#endregion #endregion

View File

@ -104,7 +104,7 @@ namespace SDL2Demo.Jobs
bjc.DoHorizontalLow = settingsWindowScanHorizontalLow; bjc.DoHorizontalLow = settingsWindowScanHorizontalLow;
bjc.DoHorizontalHigh = settingsWindowScanHorizontalHigh; bjc.DoHorizontalHigh = settingsWindowScanHorizontalHigh;
bjc.DoVerticalLow = settingsWindowScanVerticalLow; bjc.DoVerticalLow = settingsWindowScanVerticalLow;
bjc.DoVerticalHigh = settingsWindowScanHorizontalHigh; bjc.DoVerticalHigh = settingsWindowScanVerticalHigh;
bjc.DoCollectIqGraphs = settingsWindowCollectIqGraphs; bjc.DoCollectIqGraphs = settingsWindowCollectIqGraphs;
bjc.DoCollectRfSpectrum = settingsWindowCollectRfSpectrum; bjc.DoCollectRfSpectrum = settingsWindowCollectRfSpectrum;
bjc.DoRecordTs = settingsWindowCaptureFile; bjc.DoRecordTs = settingsWindowCaptureFile;
@ -170,8 +170,7 @@ namespace SDL2Demo.Jobs
ImGui.Text("This assumes that both tuners are connected to the same antenna set-up, using e.g. a splitter."); ImGui.Text("This assumes that both tuners are connected to the same antenna set-up, using e.g. a splitter.");
ImGui.PushID("tunerB"); ImGui.PushID("tunerB");
if (settingsWindowSetFilterTunerSelection - 1 < tuners.Count)
settingsWindowSetFilterTunerSelection = 0;
if (ImGui.BeginCombo("Tuner for BLScanEx and RFScan", tuners[settingsWindowSetFilterTunerSelection].Name)) if (ImGui.BeginCombo("Tuner for BLScanEx and RFScan", tuners[settingsWindowSetFilterTunerSelection].Name))
{ {
for (int i = 0; i < tuners.Count; i++) for (int i = 0; i < tuners.Count; i++)

View File

@ -953,6 +953,10 @@ namespace SDL2Demo.Jobs
id.pid = elementaryPid; id.pid = elementaryPid;
id.moduleId = moduleInfoModuleId; id.moduleId = moduleInfoModuleId;
id.moduleVersion = moduleInfoModuleVersion; id.moduleVersion = moduleInfoModuleVersion;
if (dsmCcDisplay.ContainsKey(id))
return;
lock (dsmCcDisplay) lock (dsmCcDisplay)
{ {
dsmCcDisplay.Add(id, 0); dsmCcDisplay.Add(id, 0);
@ -1507,7 +1511,7 @@ namespace SDL2Demo.Jobs
public void NotifyBlockstreamCarrier() public void NotifyBlockstreamCarrier()
{ {
throw new NotImplementedException();
} }
#region Database Callbacks #region Database Callbacks

View File

@ -106,9 +106,9 @@ namespace SkyscraperUI
object2Surface.Dispose(); object2Surface.Dispose();
object2Charset = new CharSet(object2Texture) { CharacterNumber = 4 }; object2Charset = new CharSet(object2Texture) { CharacterNumber = 4 };
logWindow = new LogWindow(); //logWindow = new LogWindow();
logWindow.Register(); //logWindow.Register();
logWindow.IsOpen = ini.ReadValue("ui", "enable_log", true); ; //logWindow.IsOpen = ini.ReadValue("ui", "enable_log", true); ;
uiBlockingWindow = new UiBlockingWindow(); uiBlockingWindow = new UiBlockingWindow();
messageWindows = new List<MessageWindow>(); messageWindows = new List<MessageWindow>();
@ -214,7 +214,7 @@ namespace SkyscraperUI
private List<SatellitePosition> satellitePositions; private List<SatellitePosition> satellitePositions;
private List<LnbType> lnbTypes; private List<LnbType> lnbTypes;
private List<DishType> dishTypes; private List<DishType> dishTypes;
private LogWindow logWindow; //private LogWindow logWindow;
private ScrapeFromTcp scrapeFromTcpWindow; private ScrapeFromTcp scrapeFromTcpWindow;
private JobContext jobContext; private JobContext jobContext;
private CharSet object2Charset; private CharSet object2Charset;
@ -257,7 +257,7 @@ namespace SkyscraperUI
if (jobContext.MessageQueue.Count != 0) if (jobContext.MessageQueue.Count != 0)
{ {
MessageWindow messageWindow = jobContext.MessageQueue.Dequeue(); MessageWindow messageWindow = jobContext.MessageQueue.Dequeue();
logWindow.Log(messageWindow.Message); //logWindow.Log(messageWindow.Message);
messageWindows.Add(messageWindow); messageWindows.Add(messageWindow);
} }
@ -266,7 +266,7 @@ namespace SkyscraperUI
foreach (CharSet charSet in charsets) foreach (CharSet charSet in charsets)
charSet.AutoMoveToHome(); charSet.AutoMoveToHome();
logWindow.Log(String.Format("Job completed: {0}", jobContext.Job.ToString())); //logWindow.Log(String.Format("Job completed: {0}", jobContext.Job.ToString()));
SoundPlayer.PlaySoundFile("Teleport2.wav"); SoundPlayer.PlaySoundFile("Teleport2.wav");
jobContext = null; jobContext = null;
} }
@ -496,8 +496,10 @@ namespace SkyscraperUI
showPuppets = !showPuppets; showPuppets = !showPuppets;
if (ImGui.MenuItem("Show ImGui Demo Window", "", showDemoWindow)) if (ImGui.MenuItem("Show ImGui Demo Window", "", showDemoWindow))
showDemoWindow = !showDemoWindow; showDemoWindow = !showDemoWindow;
/*
if (ImGui.MenuItem("Show Log Window", "", logWindow.IsOpen)) if (ImGui.MenuItem("Show Log Window", "", logWindow.IsOpen))
logWindow.IsOpen = !logWindow.IsOpen; logWindow.IsOpen = !logWindow.IsOpen;
*/
if (ImGui.MenuItem("Auto-Show Log Window when job starts", "", showLogWindowOnJobStart)) if (ImGui.MenuItem("Auto-Show Log Window when job starts", "", showLogWindowOnJobStart))
showLogWindowOnJobStart = !showLogWindowOnJobStart; showLogWindowOnJobStart = !showLogWindowOnJobStart;
if (ImGui.MenuItem("Show GPS Location", "", IsDisplayingGpsLocation(), CanShowGpsLocation())) if (ImGui.MenuItem("Show GPS Location", "", IsDisplayingGpsLocation(), CanShowGpsLocation()))
@ -786,7 +788,7 @@ namespace SkyscraperUI
} }
} }
logWindow.Render(); //logWindow.Render();
foreach (MessageWindow messageWindow in messageWindows) foreach (MessageWindow messageWindow in messageWindows)
{ {
@ -818,8 +820,10 @@ namespace SkyscraperUI
jobContext = new JobContext(); jobContext = new JobContext();
} }
/*
if (showLogWindowOnJobStart) if (showLogWindowOnJobStart)
logWindow.IsOpen = true; logWindow.IsOpen = true;
*/
job.JobContext = jobContext; job.JobContext = jobContext;
@ -827,7 +831,7 @@ namespace SkyscraperUI
jobContext.ImgUiDevice = imGuiDevice; jobContext.ImgUiDevice = imGuiDevice;
jobContext.Ini = ini; jobContext.Ini = ini;
jobContext.StreamReader = streamReader; jobContext.StreamReader = streamReader;
jobContext.LogWindow = logWindow; //jobContext.LogWindow = logWindow;
jobContext.PressurePlates = new List<IPressurePlate>(); jobContext.PressurePlates = new List<IPressurePlate>();
jobContext.RNG = rng; jobContext.RNG = rng;
jobContext.MessageQueue = new Queue<MessageWindow>(); jobContext.MessageQueue = new Queue<MessageWindow>();
@ -837,7 +841,7 @@ namespace SkyscraperUI
jobContext.Puppets = charsets; jobContext.Puppets = charsets;
jobContext.DataStorage = dataStorage; jobContext.DataStorage = dataStorage;
jobContext.ObjectStorage = objectStorage; jobContext.ObjectStorage = objectStorage;
jobContext.ScraperEventLogger = logWindow; //jobContext.ScraperEventLogger = logWindow;
jobContext.Thread = new Thread(job.Run); jobContext.Thread = new Thread(job.Run);
jobContext.Thread.Name = "Current Job"; jobContext.Thread.Name = "Current Job";
jobContext.Thread.Start(); jobContext.Thread.Start();

View File

@ -71,6 +71,16 @@ namespace skyscraper5.DNS
string nsrr = nameServerResourceRecord.NSDomainName.ToString(); string nsrr = nameServerResourceRecord.NSDomainName.ToString();
return nsrr; return nsrr;
} }
MailExchangeResourceRecord mxRecord = record as MailExchangeResourceRecord;
if (mxRecord != null)
{
string mxrr = JsonConvert.SerializeObject(new
{
Preference = mxRecord.Preference,
ExchangeDomainName = mxRecord.ExchangeDomainName.ToString()
});
return mxrr;
}
throw new NotImplementedException(record.GetType().Name.ToString()); throw new NotImplementedException(record.GetType().Name.ToString());
} }

View File

@ -88,7 +88,14 @@ namespace skyscraper8.DvbI
byte[] serviceListBytes = vfs.GetFile(serviceList.URI); byte[] serviceListBytes = vfs.GetFile(serviceList.URI);
ServiceListType serviceListData = DvbIUtils.UnpackServiceList(serviceListBytes); ServiceListType serviceListData = DvbIUtils.UnpackServiceList(serviceListBytes);
HandleServiceList(serviceListData, dataStorage, serviceList.Id); HandleServiceList(serviceListData, dataStorage, serviceList.Id);
dataStorage.UpdateDvbiServiceListLastCheckedDate(serviceList.Id, context.CurrentTime); if (!dataStorage.TestForDvbiServiceList(serviceList.Id))
{
dataStorage.InsertDvbiServiceList(serviceList);
}
else
{
dataStorage.UpdateDvbiServiceListLastCheckedDate(serviceList.Id, context.CurrentTime);
}
} }
} }

View File

@ -12,6 +12,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using moe.yo3explorer.skyscraper8.DVBI.Model; using moe.yo3explorer.skyscraper8.DVBI.Model;
using skyscraper8.DvbI; using skyscraper8.DvbI;
using System.Reflection.Metadata.Ecma335;
namespace skyscraper8.DvbNip namespace skyscraper8.DvbNip
{ {
@ -64,6 +65,10 @@ namespace skyscraper8.DvbNip
} }
UserDatagram udpPacket = new UserDatagram(ipv4Packet); UserDatagram udpPacket = new UserDatagram(ipv4Packet);
LctFrame lctFrame = new LctFrame(udpPacket.Payload); LctFrame lctFrame = new LctFrame(udpPacket.Payload);
if (lctFrame.LctHeader == null)
{
return;
}
if (lctFrame.LctHeader.TimeExtenstion != null) if (lctFrame.LctHeader.TimeExtenstion != null)
{ {
this.currentTime = lctFrame.LctHeader.TimeExtenstion.Sct; this.currentTime = lctFrame.LctHeader.TimeExtenstion.Sct;

View File

@ -26,5 +26,7 @@ namespace skyscraper5.src.InteractionChannel
void OnNetworkLayerInfo(PhysicalAddress macAddress, _0xa0_NetworkLayerInfoDescriptor descriptor); void OnNetworkLayerInfo(PhysicalAddress macAddress, _0xa0_NetworkLayerInfoDescriptor descriptor);
void OnTransmissionModeSupport(ushort interactiveNetworkId, Tmst tmst); void OnTransmissionModeSupport(ushort interactiveNetworkId, Tmst tmst);
int GetRmtTransmissionStandard(ushort networkId); int GetRmtTransmissionStandard(ushort networkId);
} void OnReturnTransmissionMOdes(PhysicalAddress macAddress, _0xb2_ReturnTransmissionModesDescriptor descriptor);
void OnConnectionControl(PhysicalAddress macAddress, _0xaf_ConnectionControlDescriptor descriptor);
}
} }

View File

@ -13,8 +13,8 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors
{ {
[SkyscraperPlugin] [SkyscraperPlugin]
[TsDescriptor(0xa1, "TIM")] [TsDescriptor(0xa1, "TIM")]
public class _0xa1_CorrectionMessageDescriptor : TsDescriptor public class _0xa1_CorrectionMessageDescriptor : TsDescriptor, IEquatable<_0xa1_CorrectionMessageDescriptor?>
{ {
public _0xa1_CorrectionMessageDescriptor(byte[] buffer) public _0xa1_CorrectionMessageDescriptor(byte[] buffer)
{ {
MemoryStream ms = new MemoryStream(buffer, false); MemoryStream ms = new MemoryStream(buffer, false);
@ -79,5 +79,31 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors
EsN0 == descriptor.EsN0 && EsN0 == descriptor.EsN0 &&
FrequencyCorrection == descriptor.FrequencyCorrection; FrequencyCorrection == descriptor.FrequencyCorrection;
} }
}
public bool Equals(_0xa1_CorrectionMessageDescriptor? other)
{
return other is not null &&
SlotType == other.SlotType &&
BurstTimeScaling == other.BurstTimeScaling &&
BurstTimeCorrection == other.BurstTimeCorrection &&
PowerCorrection == other.PowerCorrection &&
EsN0 == other.EsN0 &&
FrequencyCorrection == other.FrequencyCorrection;
}
public override int GetHashCode()
{
return HashCode.Combine(SlotType, BurstTimeScaling, BurstTimeCorrection, PowerCorrection, EsN0, FrequencyCorrection);
}
public static bool operator ==(_0xa1_CorrectionMessageDescriptor? left, _0xa1_CorrectionMessageDescriptor? right)
{
return EqualityComparer<_0xa1_CorrectionMessageDescriptor>.Default.Equals(left, right);
}
public static bool operator !=(_0xa1_CorrectionMessageDescriptor? left, _0xa1_CorrectionMessageDescriptor? right)
{
return !(left == right);
}
}
} }

View File

@ -12,7 +12,7 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors
{ {
[SkyscraperPlugin] [SkyscraperPlugin]
[TsDescriptor(0xaf,"TIM")] [TsDescriptor(0xaf,"TIM")]
internal class _0xaf_ConnectionControlDescriptor : TsDescriptor public class _0xaf_ConnectionControlDescriptor : TsDescriptor
{ {
public _0xaf_ConnectionControlDescriptor(byte[] buffer) public _0xaf_ConnectionControlDescriptor(byte[] buffer)
{ {

View File

@ -273,9 +273,15 @@ namespace skyscraper5.src.InteractionChannel.Model
case 0xac: case 0xac:
handler.OnCorrectionControl(macAddress, (_0xac_CorrectionControlDescriptor)descriptor); handler.OnCorrectionControl(macAddress, (_0xac_CorrectionControlDescriptor)descriptor);
break; break;
case 0xaf:
handler.OnConnectionControl(macAddress, (_0xaf_ConnectionControlDescriptor)descriptor);
break;
case 0xa0: case 0xa0:
handler.OnNetworkLayerInfo(macAddress, (_0xa0_NetworkLayerInfoDescriptor)descriptor); handler.OnNetworkLayerInfo(macAddress, (_0xa0_NetworkLayerInfoDescriptor)descriptor);
break; break;
case 0xb2:
handler.OnReturnTransmissionMOdes(macAddress, (_0xb2_ReturnTransmissionModesDescriptor)descriptor);
break;
default: default:
if (id >= 0xe0 && id <= 0xfe) if (id >= 0xe0 && id <= 0xfe)
break; break;

View File

@ -17,7 +17,11 @@ namespace skyscraper5.src.InteractionChannel
return 0; return 0;
} }
public void OnContentionControl(PhysicalAddress macAddress, _0xab_ContentionControlDescriptor ccd) public void OnConnectionControl(PhysicalAddress macAddress, _0xaf_ConnectionControlDescriptor descriptor)
{
}
public void OnContentionControl(PhysicalAddress macAddress, _0xab_ContentionControlDescriptor ccd)
{ {
} }
@ -54,7 +58,11 @@ namespace skyscraper5.src.InteractionChannel
{ {
} }
public void OnSatellitePosition(ushort interactiveNetworkId, Spt spt) public void OnReturnTransmissionMOdes(PhysicalAddress macAddress, _0xb2_ReturnTransmissionModesDescriptor descriptor)
{
}
public void OnSatellitePosition(ushort interactiveNetworkId, Spt spt)
{ {
} }

View File

@ -44,6 +44,7 @@ namespace skyscraper5.Mhp.Descriptors
{ {
TransportProtocolLabel[i] = ms.ReadUInt8(); TransportProtocolLabel[i] = ms.ReadUInt8();
} }
Valid = true;
} }
public byte[] TransportProtocolLabel { get; private set; } public byte[] TransportProtocolLabel { get; private set; }

View File

@ -27,6 +27,7 @@ namespace skyscraper5.Mhp.Descriptors
temp.Add(key, value); temp.Add(key, value);
} }
ApplicationNames = new ReadOnlyDictionary<string, string>(temp); ApplicationNames = new ReadOnlyDictionary<string, string>(temp);
Valid = true;
} }
public ReadOnlyDictionary<string, string> ApplicationNames { get; } public ReadOnlyDictionary<string, string> ApplicationNames { get; }

View File

@ -38,6 +38,7 @@ namespace skyscraper5.Mhp.Descriptors
break; break;
} }
} }
Valid = true;
} }
public byte TransportProtocolLabel { get; private set; } public byte TransportProtocolLabel { get; private set; }

View File

@ -25,6 +25,7 @@ namespace skyscraper5.Mhp.Descriptors
} }
Args = result.ToArray(); Args = result.ToArray();
Valid = true;
} }
public string[] Args { get; private set; } public string[] Args { get; private set; }

View File

@ -22,6 +22,7 @@ namespace skyscraper5.Mhp.Descriptors
byte classPathExtensionLength = ms.ReadUInt8(); byte classPathExtensionLength = ms.ReadUInt8();
ClassPathExtension = Encoding.ASCII.GetString(ms.ReadBytes(classPathExtensionLength)); ClassPathExtension = Encoding.ASCII.GetString(ms.ReadBytes(classPathExtensionLength));
InitialClass = Encoding.ASCII.GetString(ms.ReadBytes(ms.GetAvailableBytes())); InitialClass = Encoding.ASCII.GetString(ms.ReadBytes(ms.GetAvailableBytes()));
Valid = true;
} }
public string InitialClass { get; private set; } public string InitialClass { get; private set; }

View File

@ -27,6 +27,7 @@ namespace skyscraper5.Mhp.Descriptors
child.ApplicationId = ms.ReadUInt16BE(); child.ApplicationId = ms.ReadUInt16BE();
child.ApplicationPriority = ms.ReadUInt8(); child.ApplicationPriority = ms.ReadUInt8();
} }
Valid = true;
} }
public ExternalAuthorization[] Authorisations { get; set; } public ExternalAuthorization[] Authorisations { get; set; }

View File

@ -27,6 +27,7 @@ namespace skyscraper5.Mhp.Descriptors
Version = ms.ReadUInt32BE() & 0xefffffff; Version = ms.ReadUInt32BE() & 0xefffffff;
Priority = ms.ReadUInt8(); Priority = ms.ReadUInt8();
Valid = true;
} }
public byte Priority { get; private set; } public byte Priority { get; private set; }

View File

@ -0,0 +1,41 @@
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.IO;
using skyscraper5.Skyscraper.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper8.Mhp.Descriptors
{
[SkyscraperPlugin]
[TsDescriptor(0x13, "AIT")]
internal class _0x13_ProviderUsageDescriptor : TsDescriptor
{
public _0x13_ProviderUsageDescriptor(byte[] buffer)
{
MemoryStream ms = new MemoryStream(buffer, false);
while (ms.GetAvailableBytes() > 2)
{
byte providerNameLength = ms.ReadUInt8();
if (providerNameLength > 0)
{
if (ms.GetAvailableBytes() > providerNameLength)
{
if (providerNames == null)
providerNames = new List<string>();
providerNames.Add(ms.ReadUTF8FixedLength(providerNameLength));
Valid = true;
}
}
}
if (providerNames == null)
Valid = false;
else if (providerNames.Count == 0)
Valid = false;
}
private List<string> providerNames;
}
}

View File

@ -13,11 +13,12 @@ namespace skyscraper5.Mhp.Descriptors
class SimpleApplicationLocationDescriptor : TsDescriptor class SimpleApplicationLocationDescriptor : TsDescriptor
{ {
public SimpleApplicationLocationDescriptor(byte[] buffer) public SimpleApplicationLocationDescriptor(byte[] buffer)
{ {
InitialPath = Encoding.ASCII.GetString(buffer); InitialPath = Encoding.ASCII.GetString(buffer);
} Valid = true;
}
public string InitialPath { get; private set; } public string InitialPath { get; private set; }
} }
} }

View File

@ -15,6 +15,7 @@ namespace skyscraper5.Mhp.Descriptors
public ApplicationUsageDescriptor(byte[] buffer) public ApplicationUsageDescriptor(byte[] buffer)
{ {
UsageType = buffer[0]; UsageType = buffer[0];
Valid = true;
} }
public byte UsageType { get; private set; } public byte UsageType { get; private set; }

View File

@ -24,6 +24,7 @@ namespace skyscraper5.Mhp.Descriptors
byte boundaryExtensionLength = ms.ReadUInt8(); byte boundaryExtensionLength = ms.ReadUInt8();
BoundaryExtensions[i] = Encoding.ASCII.GetString(ms.ReadBytes(boundaryExtensionLength)); BoundaryExtensions[i] = Encoding.ASCII.GetString(ms.ReadBytes(boundaryExtensionLength));
} }
Valid = true;
} }
public string[] BoundaryExtensions { get; } public string[] BoundaryExtensions { get; }

View File

@ -27,6 +27,7 @@ namespace skyscraper5.Mhp.Descriptors
AutoSelect = (ms.ReadUInt8() & 0x01) != 0; AutoSelect = (ms.ReadUInt8() & 0x01) != 0;
ServiceName = Encoding.ASCII.GetString(ms.ReadBytes(ms.GetAvailableBytes())); ServiceName = Encoding.ASCII.GetString(ms.ReadBytes(ms.GetAvailableBytes()));
Valid = true;
} }
public string ServiceName { get; private set; } public string ServiceName { get; private set; }

View File

@ -22,6 +22,7 @@ namespace skyscraper5.Mhp.Descriptors
MemoryStream ms = new MemoryStream(buffer); MemoryStream ms = new MemoryStream(buffer);
ServiceId = ms.ReadUInt24BE(); ServiceId = ms.ReadUInt24BE();
VersionNumber = ms.ReadUInt32BE(); VersionNumber = ms.ReadUInt32BE();
Valid = true;
} }
public uint VersionNumber { get; private set; } public uint VersionNumber { get; private set; }

View File

@ -17,6 +17,7 @@ namespace skyscraper5.Mhp.Descriptors
(buffer[1], buffer[0]) = (buffer[0], buffer[1]); (buffer[1], buffer[0]) = (buffer[0], buffer[1]);
StoragePriority = BitConverter.ToUInt16(buffer, 0); StoragePriority = BitConverter.ToUInt16(buffer, 0);
LaunchOrder = buffer[2]; LaunchOrder = buffer[2];
Valid = true;
} }
public byte LaunchOrder { get; private set; } public byte LaunchOrder { get; private set; }

View File

@ -16,6 +16,7 @@ namespace skyscraper5.Mhp.Descriptors
{ {
Label = Encoding.ASCII.GetString(buffer); Label = Encoding.ASCII.GetString(buffer);
Label = Label.Trim('\0'); Label = Label.Trim('\0');
Valid = true;
} }
public string Label { get; private set; } public string Label { get; private set; }

View File

@ -18,6 +18,7 @@ namespace skyscraper5.Mhp.Descriptors
public ConnectionRequirementDescriptor(byte[] buffer) public ConnectionRequirementDescriptor(byte[] buffer)
{ {
IpConnectionRequired = (buffer[0] & 0x01) != 0; IpConnectionRequired = (buffer[0] & 0x01) != 0;
Valid = true;
} }
public bool IpConnectionRequired { get; private set; } public bool IpConnectionRequired { get; private set; }

View File

@ -131,6 +131,8 @@ namespace skyscraper5.Mhp.Si
IEnumerable<TsDescriptor> descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(input, "AIT"); IEnumerable<TsDescriptor> descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(input, "AIT");
foreach (TsDescriptor tsDescriptor in descriptors) foreach (TsDescriptor tsDescriptor in descriptors)
{ {
if (!tsDescriptor.Valid)
continue;
//See Page 248 on ETSI TS 102 812 //See Page 248 on ETSI TS 102 812
string name = tsDescriptor.GetType().Name; string name = tsDescriptor.GetType().Name;
switch (name) switch (name)

View File

@ -20,7 +20,7 @@ namespace skyscraper8
internal class QuickAndDirtySatIpClient internal class QuickAndDirtySatIpClient
{ {
private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name); private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
private const bool ENABLE_TS_WRITER = false; private const bool ENABLE_TS_WRITER = true;
public QuickAndDirtySatIpClient(string[] args) public QuickAndDirtySatIpClient(string[] args)
{ {
@ -100,7 +100,7 @@ namespace skyscraper8
rtspClient.AutoReconnect = false; rtspClient.AutoReconnect = false;
Keepalive(); Keepalive();
DiSEqC_Opcode opcode = BuildDiseqcOpcode(); DiSEqC_Opcode opcode = BuildDiseqcOpcode();
string url = RtspClient.MakeUrl(opcode, frequency, isS2, symbolRate); string url = RtspClient.MakeUrl(opcode, frequency, isS2, symbolRate, null, false);
RtspDescribeResponse describe = rtspClient.GetDescribe(url); RtspDescribeResponse describe = rtspClient.GetDescribe(url);
SessionDescriptionProtocol sessionDescriptionProtocol = describe.GetSessionDescriptionProtocol(); SessionDescriptionProtocol sessionDescriptionProtocol = describe.GetSessionDescriptionProtocol();

View File

@ -253,7 +253,17 @@ namespace skyscraper8.SatIp
this.ListenIp = GetListenIp(this.TcpClient.Client.LocalEndPoint); this.ListenIp = GetListenIp(this.TcpClient.Client.LocalEndPoint);
} }
public static string MakeUrl(DiSEqC_Opcode diseqcChannel, int freq, bool isS2, int symbolrate) /// <summary>
/// Generates a SAT>IP Tuning string.
/// </summary>
/// <param name="diseqcChannel">The DiSEqC Command to send.</param>
/// <param name="freq">The frequency to tune to in MHz.</param>
/// <param name="isS2">Set this to true if tuning to DVB-S2/S2X, or false for DVB-S</param>
/// <param name="symbolrate">The transponder's symbol rate in Ksyms.</param>
/// <param name="forceBbframeMode">Set this to true to force a STiD135 to BBFrame mode. Set this to false if you do not want this, or if the tuner isn't a STiD135. false is always safe here.</param>
/// <returns>A SAT>IP Tuning String</returns>
/// <exception cref="ArgumentOutOfRangeException">Thrown when an invalid DiSEqC Command is supplied.</exception>
public static string MakeUrl(DiSEqC_Opcode diseqcChannel, int freq, bool isS2, int symbolrate, byte? mis = null, bool forceBbframeMode = false)
{ {
bool diseqcOk = false; bool diseqcOk = false;
byte diseqc = 1; byte diseqc = 1;
@ -300,6 +310,16 @@ namespace skyscraper8.SatIp
sb.AppendFormat("&sr={0}", symbolrate); sb.AppendFormat("&sr={0}", symbolrate);
sb.AppendFormat("&pids=all"); sb.AppendFormat("&pids=all");
//Thanks to the Digital Devices Customer Support for giving me this advice.
if (forceBbframeMode)
{
sb.Append("&x_isi=0x80000000");
}
else if (mis.HasValue)
{
sb.AppendFormat("&x_isi={0}", mis.Value);
}
return sb.ToString(); return sb.ToString();
} }

View File

@ -19,7 +19,9 @@ namespace skyscraper8.Skyscraper
private bool interruptedGseHemWantsCrc32; private bool interruptedGseHemWantsCrc32;
public IGsEventHandler MpeEventHandler { get; set; } public IGsEventHandler MpeEventHandler { get; set; }
public void PushPacket(byte[] bbframe) private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
public void PushPacket(byte[] bbframe)
{ {
MemoryStream ms = new MemoryStream(bbframe, false); MemoryStream ms = new MemoryStream(bbframe, false);
//BBHeader //BBHeader
@ -47,8 +49,9 @@ namespace skyscraper8.Skyscraper
return; return;
HandleGse(ms); HandleGse(ms);
break; break;
default: //0 = generic packetized, 1 = generic continouus, 2 = gse, 3 = ts default: //0 = generic packetized, 1 = generic continouus, 2 = gse, 3 = ts
throw new NotImplementedException(String.Format("TS/GS field says 0x{0:X2}", tsGsField)); logger.Warn(String.Format("Unsupported: TS/GS field says 0x{0:X2}", tsGsField));
break;
} }
} }

View File

@ -735,7 +735,7 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2); config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2);
config.Ui.OnBlindscanFilterSetUp(); config.Ui.OnBlindscanFilterSetUp();
SkipFilter skipper = new SkipFilter(SkipFilter.CRAZYSCAN_BUFFER * 8); SkipFilter skipper = new SkipFilter(SkipFilter.CRAZYSCAN_BUFFER * 10);
skyscraperContext = SkyscraperContextFactory.CreateSkyscraper(config.DataStorage, config.ObjectStorage); skyscraperContext = SkyscraperContextFactory.CreateSkyscraper(config.DataStorage, config.ObjectStorage);
skyscraperContext.TcpProxyEnabled = true; skyscraperContext.TcpProxyEnabled = true;
skyscraperContext.UiJunction = config.Ui; skyscraperContext.UiJunction = config.Ui;

View File

@ -333,7 +333,7 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
public bool MISSel(bool bEnable, byte misFilter, byte misFilterMask) public bool MISSel(bool bEnable, byte misFilter, byte misFilterMask)
{ {
throw new NotImplementedException(); return _proxiedStreamReader.MISSel(bEnable, misFilter, misFilterMask);
} }
public bool PLSSel(byte plsMode, uint code) public bool PLSSel(byte plsMode, uint code)

View File

@ -86,7 +86,7 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
public bool StopDVB() public bool StopDVB()
{ {
throw new NotImplementedException(); return ProxiedStreamReader.StopDVB();
} }
public bool GetTunerType(ref STD_TYPE type) public bool GetTunerType(ref STD_TYPE type)
@ -144,7 +144,7 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
{ {
rtspClient = new RtspClient(satIpServerAddress, 554); rtspClient = new RtspClient(satIpServerAddress, 554);
RtspKeepalive(); RtspKeepalive();
rtspUrl = RtspClient.MakeUrl(satIpDiseqc, satipFrequency, satIpS2Mode, satipSymbolrate); rtspUrl = RtspClient.MakeUrl(satIpDiseqc, satipFrequency, satIpS2Mode, satipSymbolrate, satIpMisEnabled ? satIpMisFilter : null, false);
RtspDescribeResponse describe = rtspClient.GetDescribe(rtspUrl); RtspDescribeResponse describe = rtspClient.GetDescribe(rtspUrl);
if (describe.RtspStatusCode != 200) if (describe.RtspStatusCode != 200)
{ {
@ -316,7 +316,7 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
public bool RFScan(int freq, int pol, int lof1, int lof2, int lofsw, out double pRFLevel) public bool RFScan(int freq, int pol, int lof1, int lof2, int lofsw, out double pRFLevel)
{ {
throw new NotImplementedException(); return ProxiedStreamReader.RFScan(freq, pol, lof1, lof2, lofsw, out pRFLevel);
} }
public bool FFTInit() public bool FFTInit()
@ -339,6 +339,7 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
public bool BLScanEx(int freq, int freq_range, int pol, int lof1, int lof2, int lofsw, int minsr, STD_TYPE std, public bool BLScanEx(int freq, int freq_range, int pol, int lof1, int lof2, int lofsw, int minsr, STD_TYPE std,
ref SearchResult pSearchResult) ref SearchResult pSearchResult)
{ {
satIpMisEnabled = false;
bool result = ProxiedStreamReader.BLScanEx(freq, freq_range, pol, lof1, lof2, lofsw, minsr, std, ref pSearchResult); bool result = ProxiedStreamReader.BLScanEx(freq, freq_range, pol, lof1, lof2, lofsw, minsr, std, ref pSearchResult);
if (result) if (result)
{ {
@ -396,7 +397,7 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
public bool IQScan(uint input, sbyte[] pIQ, uint num) public bool IQScan(uint input, sbyte[] pIQ, uint num)
{ {
throw new NotImplementedException(); return ProxiedStreamReader.IQScan(input, pIQ, num);
} }
public bool IQScan2(uint point, short[] pIQ, uint num) public bool IQScan2(uint point, short[] pIQ, uint num)
@ -429,9 +430,15 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
throw new NotImplementedException(); throw new NotImplementedException();
} }
private bool satIpMisEnabled;
private byte satIpMisFilter;
private byte satIpMisFilterMask;
public bool MISSel(bool bEnable, byte misFilter, byte misFilterMask) public bool MISSel(bool bEnable, byte misFilter, byte misFilterMask)
{ {
throw new NotImplementedException(); this.satIpMisEnabled = bEnable;
this.satIpMisFilter = misFilter;
this.satIpMisFilterMask = misFilterMask;
return ProxiedStreamReader.MISSel(bEnable, misFilter, misFilterMask);
} }
public bool PLSSel(byte plsMode, uint code) public bool PLSSel(byte plsMode, uint code)

View File

@ -10,6 +10,11 @@ namespace skyscraper5.Skyscraper
internal class IpPacketFinder internal class IpPacketFinder
{ {
public static byte[] LookForIpPacket(byte[] gsPacket, int searchDepth = 16) public static byte[] LookForIpPacket(byte[] gsPacket, int searchDepth = 16)
{
int offset;
return LookForIpPacket(gsPacket, out offset, searchDepth);
}
public static byte[] LookForIpPacket(byte[] gsPacket, out int offset, int searchDepth = 16)
{ {
byte[] ipBuffer = new byte[20]; byte[] ipBuffer = new byte[20];
@ -17,7 +22,10 @@ namespace skyscraper5.Skyscraper
{ {
int v4HeaderEnd = i + 20; int v4HeaderEnd = i + 20;
if (v4HeaderEnd > gsPacket.Length) if (v4HeaderEnd > gsPacket.Length)
{
offset = -1;
return null; return null;
}
if (gsPacket[i] == 0x45) if (gsPacket[i] == 0x45)
{ {
@ -28,15 +36,19 @@ namespace skyscraper5.Skyscraper
int payloadStart = i + ipBuffer.Length; int payloadStart = i + ipBuffer.Length;
int payloadEnd = i + ipv4.TotalLength; int payloadEnd = i + ipv4.TotalLength;
if (payloadEnd > gsPacket.Length) if (payloadEnd > gsPacket.Length)
{
offset = -1;
return null; return null;
}
int packetLength = payloadEnd - i; int packetLength = payloadEnd - i;
byte[] finalPacket = new byte[packetLength]; byte[] finalPacket = new byte[packetLength];
Array.Copy(gsPacket, i, finalPacket, 0, packetLength); Array.Copy(gsPacket, i, finalPacket, 0, packetLength);
offset = i;
return finalPacket; return finalPacket;
} }
} }
offset = -1;
return null; return null;
} }

View File

@ -80,7 +80,8 @@ namespace skyscraper5.Skyscraper.Scraper
0x06EA, /* TSReaderLite */ 0x06EA, /* TSReaderLite */
0x0692, 0x0692,
0x0919, 0x0961, 0x09ac, 0x0919, 0x0961, 0x09ac,
0x0642 0x0642,
0x0652
}; };
public static string GetHumanReadableName(ushort id) public static string GetHumanReadableName(ushort id)
@ -319,6 +320,9 @@ namespace skyscraper5.Skyscraper.Scraper
if ((id >= 0x1ec0) && (id <= 0x1ec2)) if ((id >= 0x1ec0) && (id <= 0x1ec2))
return "Cryptoguard"; return "Cryptoguard";
if ((id == 0x0652) ||(id == 0x0651))
return "Irdeto";
return "???"; return "???";
} }
} }

View File

@ -1668,6 +1668,10 @@ namespace skyscraper5.Skyscraper.Scraper
StorageConnectionManager storageConnectionManager = StorageConnectionManager.GetInstance(); StorageConnectionManager storageConnectionManager = StorageConnectionManager.GetInstance();
ipTrafficHandler = storageConnectionManager.GetDefaultIpTrafficHandler(); ipTrafficHandler = storageConnectionManager.GetDefaultIpTrafficHandler();
} }
if (payload.Length == 0)
{
return;
}
ipTrafficHandler?.HandlePacket(pid, payload); ipTrafficHandler?.HandlePacket(pid, payload);
@ -2481,7 +2485,7 @@ namespace skyscraper5.Skyscraper.Scraper
public void AutodetectionRuleOut(int pid, Contestant contestant, ProgramContext programContext) public void AutodetectionRuleOut(int pid, Contestant contestant, ProgramContext programContext)
{ {
LogEvent(SkyscraperContextEvent.StreamTypeAutodetection, String.Format("PID 0x{0:X4} probably isn't a {1}", pid, contestant.Tag)); //LogEvent(SkyscraperContextEvent.StreamTypeAutodetection, String.Format("PID 0x{0:X4} probably isn't a {1}", pid, contestant.Tag));
} }
void SgtEventHandler.AnnounceSgtList(SgtList list) void SgtEventHandler.AnnounceSgtList(SgtList list)
@ -2996,5 +3000,15 @@ namespace skyscraper5.Skyscraper.Scraper
{ {
return ObjectStorage.NdsSsuTestFile(CurrentNetworkId, CurrentTransportStreamId, pid, tableIdExtension); return ObjectStorage.NdsSsuTestFile(CurrentNetworkId, CurrentTransportStreamId, pid, tableIdExtension);
} }
public void OnReturnTransmissionMOdes(PhysicalAddress macAddress, _0xb2_ReturnTransmissionModesDescriptor descriptor)
{
//TODO: Implement this.
}
public void OnConnectionControl(PhysicalAddress macAddress, _0xaf_ConnectionControlDescriptor descriptor)
{
//TODO: Implement this.
}
} }
} }

View File

@ -1363,9 +1363,14 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory
_timContainers.Add(mac, new TimContainer()); _timContainers.Add(mac, new TimContainer());
} }
private HashSet<Tuple<PhysicalAddress, _0xa1_CorrectionMessageDescriptor>> _timCorrections;
public bool CorrectTim(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd) public bool CorrectTim(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd)
{ {
throw new NotImplementedException(); if (_timCorrections == null)
_timCorrections = new HashSet<Tuple<PhysicalAddress, _0xa1_CorrectionMessageDescriptor>>();
Tuple<PhysicalAddress, _0xa1_CorrectionMessageDescriptor> child = new Tuple<PhysicalAddress, _0xa1_CorrectionMessageDescriptor>(mac, cmd);
return _timCorrections.Add(child);
} }
public bool ContentionTim(PhysicalAddress mac, _0xab_ContentionControlDescriptor ccdNew) public bool ContentionTim(PhysicalAddress mac, _0xab_ContentionControlDescriptor ccdNew)

View File

@ -15,7 +15,7 @@ using System.Threading.Tasks;
namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants
{ {
[SkyscraperPlugin] [SkyscraperPlugin]
internal class InteractionChannelContestant : Contestant, InteractionChannelHandler, IDisposable internal class InteractionChannelContestant : Contestant, InteractionChannelHandler, IDisposable
{ {
public InteractionChannelContestant(int pid) public InteractionChannelContestant(int pid)
: base("Interaction channel for satellite distribution systems",pid) : base("Interaction channel for satellite distribution systems",pid)
@ -170,5 +170,18 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants
} }
} }
} }
}
public void OnReturnTransmissionMOdes(PhysicalAddress macAddress, _0xb2_ReturnTransmissionModesDescriptor descriptor)
{
if (descriptor.Superframes.Length > 0)
{
Score++;
}
}
public void OnConnectionControl(PhysicalAddress macAddress, _0xaf_ConnectionControlDescriptor descriptor)
{
Score++;
}
}
} }

View File

@ -139,6 +139,7 @@ namespace skyscraper5.Skyscraper.Text
case 0x7c: resultBuilder.Append('|'); break; case 0x7c: resultBuilder.Append('|'); break;
case 0x7d: resultBuilder.Append('}'); break; case 0x7d: resultBuilder.Append('}'); break;
case 0x7e: resultBuilder.Append('~'); break; case 0x7e: resultBuilder.Append('~'); break;
case 0x7f: resultBuilder.Append('\u007f'); break;
default: default:
throw new NotImplementedException(String.Format("0x{0:X2}", req)); throw new NotImplementedException(String.Format("0x{0:X2}", req));
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Diagnostics;
using System.Text; using System.Text;
using skyscraper5.Dvb; using skyscraper5.Dvb;
using skyscraper5.Skyscraper.Plugins; using skyscraper5.Skyscraper.Plugins;
@ -64,6 +65,9 @@ namespace skyscraper5.Skyscraper.Text
public string Decode(byte[] buffer, int offset, int length) public string Decode(byte[] buffer, int offset, int length)
{ {
byte[] copy = new byte[length]; byte[] copy = new byte[length];
int endOffset = offset + length;
if (endOffset > buffer.Length)
return null;
Array.Copy(buffer, offset, copy, 0, length); Array.Copy(buffer, offset, copy, 0, length);
return Decode(copy); return Decode(copy);
} }
@ -93,7 +97,10 @@ namespace skyscraper5.Skyscraper.Text
ushort sb = buffer[1]; ushort sb = buffer[1];
ushort tb = buffer[2]; ushort tb = buffer[2];
if (sb != 0x00) if (sb != 0x00)
throw new NotImplementedException("reserved"); {
Debug.WriteLine(String.Format("Found invalid character coding: 0x{0:X2}{1:X2}", buffer[0], sb));
return null;
}
if (tb >= 0x10) if (tb >= 0x10)
throw new NotImplementedException("reserved"); throw new NotImplementedException("reserved");
lastUsedEncoding = iso8859Mapping[tb]; lastUsedEncoding = iso8859Mapping[tb];
@ -111,8 +118,9 @@ namespace skyscraper5.Skyscraper.Text
_textDecoders = PluginManager.GetInstance().GetTextDecoders(); _textDecoders = PluginManager.GetInstance().GetTextDecoders();
TextDecoder matchingTextDecoder = _textDecoders[buffer[1]]; TextDecoder matchingTextDecoder = _textDecoders[buffer[1]];
if (matchingTextDecoder == null) if (matchingTextDecoder == null)
{ {
throw new TextException(String.Format("No decoder for Encoding type ID 0x{0:X2}", buffer[1])); //TODO: Add logger message here.
return null;
} }
return matchingTextDecoder.Decode(buffer); return matchingTextDecoder.Decode(buffer);
} }

View File

@ -26,11 +26,13 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xb2: resultBuilder.Append('²'); break; case 0xb2: resultBuilder.Append('²'); break;
case 0xb4: resultBuilder.Append('´'); break; case 0xb4: resultBuilder.Append('´'); break;
case 0xbc: resultBuilder.Append('¼'); break; case 0xbc: resultBuilder.Append('¼'); break;
case 0xc0: resultBuilder.Append('À'); break;
case 0xc1: resultBuilder.Append('Á'); break; case 0xc1: resultBuilder.Append('Á'); break;
case 0xc4: resultBuilder.Append('Ä'); break; case 0xc4: resultBuilder.Append('Ä'); break;
case 0xc7: resultBuilder.Append('Ç'); break; case 0xc7: resultBuilder.Append('Ç'); break;
case 0xc9: resultBuilder.Append('É'); break; case 0xc9: resultBuilder.Append('É'); break;
case 0xcb: resultBuilder.Append('¼'); break; case 0xcb: resultBuilder.Append('¼'); break;
case 0xd6: resultBuilder.Append('Ö'); break;
case 0xdc: resultBuilder.Append('Ü'); break; case 0xdc: resultBuilder.Append('Ü'); break;
case 0xdf: resultBuilder.Append('ß'); break; case 0xdf: resultBuilder.Append('ß'); break;
case 0xe0: resultBuilder.Append('à'); break; case 0xe0: resultBuilder.Append('à'); break;
@ -45,6 +47,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xeb: resultBuilder.Append('ë'); break; case 0xeb: resultBuilder.Append('ë'); break;
case 0xec: resultBuilder.Append('ì'); break; case 0xec: resultBuilder.Append('ì'); break;
case 0xed: resultBuilder.Append('í'); break; case 0xed: resultBuilder.Append('í'); break;
case 0xee: resultBuilder.Append('î'); break;
case 0xef: resultBuilder.Append('ï'); break; case 0xef: resultBuilder.Append('ï'); break;
case 0xf1: resultBuilder.Append('ñ'); break; case 0xf1: resultBuilder.Append('ñ'); break;
case 0xf2: resultBuilder.Append('ò'); break; case 0xf2: resultBuilder.Append('ò'); break;
@ -54,6 +57,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xf8: resultBuilder.Append('ø'); break; case 0xf8: resultBuilder.Append('ø'); break;
case 0xf9: resultBuilder.Append('ù'); break; case 0xf9: resultBuilder.Append('ù'); break;
case 0xfa: resultBuilder.Append('ú'); break; case 0xfa: resultBuilder.Append('ú'); break;
case 0xfb: resultBuilder.Append('û'); break;
case 0xfc: resultBuilder.Append('ü'); break; case 0xfc: resultBuilder.Append('ü'); break;
default: default:
throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i])); throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i]));

View File

@ -23,6 +23,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
{ {
case 0x7f: break; case 0x7f: break;
case 0xa0: resultBuilder.Append('\u00a0'); break; case 0xa0: resultBuilder.Append('\u00a0'); break;
case 0xa7: resultBuilder.Append('§'); break;
case 0xa9: resultBuilder.Append('Đ'); break; case 0xa9: resultBuilder.Append('Đ'); break;
case 0xaa: resultBuilder.Append('Š'); break; case 0xaa: resultBuilder.Append('Š'); break;
case 0xac: resultBuilder.Append('Ž'); break; case 0xac: resultBuilder.Append('Ž'); break;
@ -32,6 +33,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xb9: resultBuilder.Append('đ'); break; case 0xb9: resultBuilder.Append('đ'); break;
case 0xba: resultBuilder.Append('š'); break; case 0xba: resultBuilder.Append('š'); break;
case 0xbc: resultBuilder.Append('ž'); break; case 0xbc: resultBuilder.Append('ž'); break;
case 0xbd: resultBuilder.Append('―'); break;
case 0xbe: resultBuilder.Append('ū'); break; case 0xbe: resultBuilder.Append('ū'); break;
case 0xc1: resultBuilder.Append('Á'); break; case 0xc1: resultBuilder.Append('Á'); break;
case 0xc2: resultBuilder.Append('Â'); break; case 0xc2: resultBuilder.Append('Â'); break;

View File

@ -14,7 +14,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
StringBuilder resultBuilder = new StringBuilder(); StringBuilder resultBuilder = new StringBuilder();
for (int i = 0; i < preprocessed.Length; i++) for (int i = 0; i < preprocessed.Length; i++)
{ {
if (preprocessed[i] <= 0x7e) if (preprocessed[i] <= 0x7f)
{ {
AsciiTable.GetAsciiChar(preprocessed[i], resultBuilder); AsciiTable.GetAsciiChar(preprocessed[i], resultBuilder);
continue; continue;
@ -23,20 +23,25 @@ namespace skyscraper5.Skyscraper.Text.Encodings
{ {
case 0xa0: resultBuilder.Append('\u00a0'); break; case 0xa0: resultBuilder.Append('\u00a0'); break;
case 0xa1: resultBuilder.Append('”'); break; case 0xa1: resultBuilder.Append('”'); break;
case 0xa2: resultBuilder.Append("¢"); break;
case 0xa3: resultBuilder.Append('£'); break; case 0xa3: resultBuilder.Append('£'); break;
case 0xa5: resultBuilder.Append('„'); break; case 0xa5: resultBuilder.Append('„'); break;
case 0xa7: resultBuilder.Append('§'); break; case 0xa7: resultBuilder.Append('§'); break;
case 0xa8: resultBuilder.Append('Ø'); break; case 0xa8: resultBuilder.Append('Ø'); break;
case 0xa9: resultBuilder.Append('©'); break;
case 0xaa: resultBuilder.Append('Ŗ'); break;
case 0xab: resultBuilder.Append('«'); break; case 0xab: resultBuilder.Append('«'); break;
case 0xac: resultBuilder.Append('¬'); break; case 0xac: resultBuilder.Append('¬'); break;
case 0xad: resultBuilder.Append('\u00ad'); break; case 0xad: resultBuilder.Append('\u00ad'); break;
case 0xae: resultBuilder.Append('®'); break; case 0xae: resultBuilder.Append('®'); break;
case 0xaf: resultBuilder.Append('Æ'); break;
case 0xb0: resultBuilder.Append('°'); break; case 0xb0: resultBuilder.Append('°'); break;
case 0xb4: resultBuilder.Append('“'); break; case 0xb4: resultBuilder.Append('“'); break;
case 0xb8: resultBuilder.Append('ø'); break; case 0xb8: resultBuilder.Append('ø'); break;
case 0xb9: resultBuilder.Append('¹'); break; case 0xb9: resultBuilder.Append('¹'); break;
case 0xbb: resultBuilder.Append('»'); break; case 0xbb: resultBuilder.Append('»'); break;
case 0xbf: resultBuilder.Append('æ'); break; case 0xbf: resultBuilder.Append('æ'); break;
case 0xc2: resultBuilder.Append('Ā'); break;
case 0xc3: resultBuilder.Append('Ć'); break; case 0xc3: resultBuilder.Append('Ć'); break;
case 0xc4: resultBuilder.Append('Ä'); break; case 0xc4: resultBuilder.Append('Ä'); break;
case 0xc5: resultBuilder.Append('Å'); break; case 0xc5: resultBuilder.Append('Å'); break;
@ -44,11 +49,13 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xc8: resultBuilder.Append('Č'); break; case 0xc8: resultBuilder.Append('Č'); break;
case 0xc9: resultBuilder.Append('É'); break; case 0xc9: resultBuilder.Append('É'); break;
case 0xca: resultBuilder.Append('Ź'); break; case 0xca: resultBuilder.Append('Ź'); break;
case 0xcc: resultBuilder.Append('Ģ'); break;
case 0xce: resultBuilder.Append('Ī'); break; case 0xce: resultBuilder.Append('Ī'); break;
case 0xcf: resultBuilder.Append('Ļ'); break; case 0xcf: resultBuilder.Append('Ļ'); break;
case 0xd0: resultBuilder.Append('Š'); break; case 0xd0: resultBuilder.Append('Š'); break;
case 0xd1: resultBuilder.Append('Ń'); break; case 0xd1: resultBuilder.Append('Ń'); break;
case 0xd3: resultBuilder.Append('Ó'); break; case 0xd3: resultBuilder.Append('Ó'); break;
case 0xd4: resultBuilder.Append('Ō'); break;
case 0xd6: resultBuilder.Append('Ö'); break; case 0xd6: resultBuilder.Append('Ö'); break;
case 0xd9: resultBuilder.Append('Ł'); break; case 0xd9: resultBuilder.Append('Ł'); break;
case 0xda: resultBuilder.Append('Ś'); break; case 0xda: resultBuilder.Append('Ś'); break;
@ -66,6 +73,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xe9: resultBuilder.Append('é'); break; case 0xe9: resultBuilder.Append('é'); break;
case 0xea: resultBuilder.Append('ź'); break; case 0xea: resultBuilder.Append('ź'); break;
case 0xeb: resultBuilder.Append('ė'); break; case 0xeb: resultBuilder.Append('ė'); break;
case 0xec: resultBuilder.Append('ģ'); break;
case 0xed: resultBuilder.Append('ķ'); break; case 0xed: resultBuilder.Append('ķ'); break;
case 0xee: resultBuilder.Append('ī'); break; case 0xee: resultBuilder.Append('ī'); break;
case 0xf0: resultBuilder.Append('š'); break; case 0xf0: resultBuilder.Append('š'); break;

View File

@ -18,7 +18,9 @@ namespace skyscraper5.Skyscraper.Text.Encodings
switch (preprocessed[i]) switch (preprocessed[i])
{ {
case 0x00: break; //Null case 0x00: break; //Null
case 0x03: return resultBuilder.ToString().ToCharArray(); //End of Text
case 0x0a: resultBuilder.Append('\n'); break; case 0x0a: resultBuilder.Append('\n'); break;
case 0x0d: resultBuilder.Append('\u0013'); break; //Carriage return
case 0x10: break; //Data Link Escape case 0x10: break; //Data Link Escape
case 0x12: break; //Device Control 2 case 0x12: break; //Device Control 2
case 0x13: break; //Device Control 3 case 0x13: break; //Device Control 3
@ -49,6 +51,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0x39: resultBuilder.Append(!arabMode ? '9' : '٩'); break; case 0x39: resultBuilder.Append(!arabMode ? '9' : '٩'); break;
case 0x3a: resultBuilder.Append(':'); break; case 0x3a: resultBuilder.Append(':'); break;
case 0x3b: resultBuilder.Append(';'); break; case 0x3b: resultBuilder.Append(';'); break;
case 0x3c: resultBuilder.Append('<'); break;
case 0x3f: resultBuilder.Append('?'); break; case 0x3f: resultBuilder.Append('?'); break;
case 0x40: resultBuilder.Append('@'); break; case 0x40: resultBuilder.Append('@'); break;
case 0x41: resultBuilder.Append('A'); arabMode = false; break; case 0x41: resultBuilder.Append('A'); arabMode = false; break;
@ -104,6 +107,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0x79: resultBuilder.Append('y'); arabMode = false; break; case 0x79: resultBuilder.Append('y'); arabMode = false; break;
case 0x7a: resultBuilder.Append('z'); arabMode = false; break; case 0x7a: resultBuilder.Append('z'); arabMode = false; break;
case 0xa0: resultBuilder.Append('\u00a0'); break; case 0xa0: resultBuilder.Append('\u00a0'); break;
case 0xa4: resultBuilder.Append('\u00a4'); break;
case 0xac: resultBuilder.Append('،'); arabMode = true; break; case 0xac: resultBuilder.Append('،'); arabMode = true; break;
case 0xb2: break; case 0xb2: break;
case 0xbb: resultBuilder.Append('؛'); arabMode = true; break; case 0xbb: resultBuilder.Append('؛'); arabMode = true; break;
@ -135,6 +139,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xd9: resultBuilder.Append('ع'); arabMode = true; break; case 0xd9: resultBuilder.Append('ع'); arabMode = true; break;
case 0xda: resultBuilder.Append('غ'); arabMode = true; break; case 0xda: resultBuilder.Append('غ'); arabMode = true; break;
case 0xdb: resultBuilder.Append('؛'); arabMode = true; break; case 0xdb: resultBuilder.Append('؛'); arabMode = true; break;
case 0xdd: break; //doesn't seem to be mapped?
case 0xe0: resultBuilder.Append('ـ'); arabMode = true; break; case 0xe0: resultBuilder.Append('ـ'); arabMode = true; break;
case 0xe1: resultBuilder.Append('ف'); arabMode = true; break; case 0xe1: resultBuilder.Append('ف'); arabMode = true; break;
case 0xe2: resultBuilder.Append('ق'); arabMode = true; break; case 0xe2: resultBuilder.Append('ق'); arabMode = true; break;
@ -154,6 +159,8 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xf0: resultBuilder.Append('\u0650'); arabMode = true; break; case 0xf0: resultBuilder.Append('\u0650'); arabMode = true; break;
case 0xf1: resultBuilder.Append('\u0651'); arabMode = true; break; case 0xf1: resultBuilder.Append('\u0651'); arabMode = true; break;
case 0xf2: resultBuilder.Append('\u0652'); arabMode = true; break; case 0xf2: resultBuilder.Append('\u0652'); arabMode = true; break;
case 0xfb: break;
case 0xfc: break;
default: default:
throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i])); throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i]));
} }

View File

@ -7,6 +7,7 @@ using System.Threading.Tasks;
using skyscraper5.Skyscraper.IO; using skyscraper5.Skyscraper.IO;
using skyscraper5.Skyscraper.Plugins; using skyscraper5.Skyscraper.Plugins;
using skyscraper5.T2MI.Packets.AdressingFunctions; using skyscraper5.T2MI.Packets.AdressingFunctions;
using skyscraper8.T2MI.Packets.AdressingFunctions;
namespace skyscraper5.T2MI.Packets namespace skyscraper5.T2MI.Packets
{ {
@ -86,16 +87,16 @@ namespace skyscraper5.T2MI.Packets
case 0x01: throw new NotImplementedException("Transmitter frequency offset"); case 0x01: throw new NotImplementedException("Transmitter frequency offset");
case 0x02: result = new _0x02_TransmitterPower(functionBody); break; case 0x02: result = new _0x02_TransmitterPower(functionBody); break;
case 0x03: throw new NotImplementedException("Private data"); case 0x03: throw new NotImplementedException("Private data");
case 0x04: throw new NotImplementedException("Cell ID"); case 0x04: result = new _0x04_CellId(functionBody); break;
case 0x05: throw new NotImplementedException("Enable"); case 0x05: throw new NotImplementedException("Enable");
case 0x06: throw new NotImplementedException("Bandwidth"); case 0x06: throw new NotImplementedException("Bandwidth");
case 0x10: throw new NotImplementedException("ACE-PAPR"); case 0x10: throw new NotImplementedException("ACE-PAPR");
case 0x11: result = new _0x11_TransmitterMisoGroup(functionBody); break; case 0x11: result = new _0x11_TransmitterMisoGroup(functionBody); break;
case 0x12: throw new NotImplementedException("TR-PAPR"); case 0x12: result = new _0x12_TrPapr(functionBody); break;
case 0x13: result = new _0x13_L1AcePapr(functionBody); break; case 0x13: result = new _0x13_L1AcePapr(functionBody); break;
case 0x15: throw new NotImplementedException("TX-SIG FEF: Sequence Numbers"); case 0x15: throw new NotImplementedException("TX-SIG FEF: Sequence Numbers");
case 0x16: throw new NotImplementedException("TX-SIG Aux stream: Transmitter ID"); case 0x16: throw new NotImplementedException("TX-SIG Aux stream: Transmitter ID");
case 0x17: throw new NotImplementedException("Frequency"); case 0x17: result = new _0x17_Frequency(functionBody); break;
} }
if (result == null) if (result == null)

View File

@ -0,0 +1,31 @@
using skyscraper5.Skyscraper.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.T2MI.Packets.AdressingFunctions
{
internal class _0x04_CellId : AddressingFunction
{
public _0x04_CellId(byte[] buffer)
: base(0x02, true, true)
{
if (buffer.Length != 3)
{
Valid = false;
return;
}
MemoryStream ms = new MemoryStream(buffer, false);
CellId = ms.ReadUInt16BE();
byte v = ms.ReadUInt8();
WaitForEnableFlag = (v & 0x80) != 0;
}
public ushort CellId { get; }
public bool WaitForEnableFlag { get; }
}
}

View File

@ -0,0 +1,29 @@
using skyscraper5.Skyscraper.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.T2MI.Packets.AdressingFunctions
{
internal class _0x12_TrPapr : AddressingFunction
{
public _0x12_TrPapr(byte[] buffer)
: base(0x12, false, true)
{
if (buffer.Length != 5)
{
Valid = false;
return;
}
MemoryStream ms = new MemoryStream(buffer, false);
TrClippingThreshold = ms.ReadUInt16BE() & 0x0fff;
NumberOfIterations = ms.ReadUInt24BE() & 0x3ff;
}
public int TrClippingThreshold { get; }
public uint NumberOfIterations { get; }
}
}

View File

@ -0,0 +1,31 @@
using skyscraper5.Skyscraper.IO;
using skyscraper5.T2MI.Packets.AdressingFunctions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper8.T2MI.Packets.AdressingFunctions
{
internal class _0x17_Frequency : AddressingFunction
{
public _0x17_Frequency(byte[] buffer) : base(0x17, false, true)
{
if (buffer.Length != 5)
{
Valid = false;
return;
}
MemoryStream ms = new MemoryStream(buffer, false);
InBitStream ibs = new InBitStream(ms);
RfIdx = ibs.ReadBitsAsByte(3);
Frequency = ibs.ReadBitsAsULong(32);
Valid = true;
}
public byte RfIdx { get; }
public ulong Frequency { get; }
}
}

View File

@ -50,6 +50,8 @@ namespace skyscraper5.T2MI
byte offsetAccordingToPus = 0; byte offsetAccordingToPus = 0;
if (packetPayloadUnitStart) if (packetPayloadUnitStart)
{ {
if (ms.Position == ms.Length)
return;
offsetAccordingToPus = ms.ReadUInt8(); offsetAccordingToPus = ms.ReadUInt8();
} }
while (ms.GetAvailableBytes() > 0) while (ms.GetAvailableBytes() > 0)
@ -182,6 +184,9 @@ namespace skyscraper5.T2MI
_0x31_IqData iqData = (_0x31_IqData)t2MiPacket; _0x31_IqData iqData = (_0x31_IqData)t2MiPacket;
t2MiEventHandler.OnT2MiIqData(RelatedPid, iqData); t2MiEventHandler.OnT2MiIqData(RelatedPid, iqData);
break; break;
case 0x30:
//Null. Nothing happens here.
break;
case 0x33: case 0x33:
_0x33_Subpart subpart = (_0x33_Subpart)t2MiPacket; _0x33_Subpart subpart = (_0x33_Subpart)t2MiPacket;
if (subpart.PreferDiscard) if (subpart.PreferDiscard)