38#include "s57class_registrar.h"
46SENCJobTicket::SENCJobTicket() {
47 m_SENCResult = SENC_BUILD_INACTIVE;
48 m_status = THREAD_INACTIVE;
56OCPN_BUILDSENC_ThreadEvent::OCPN_BUILDSENC_ThreadEvent(wxEventType commandType,
58 : wxEvent(id, commandType) {
62OCPN_BUILDSENC_ThreadEvent::~OCPN_BUILDSENC_ThreadEvent() {}
64wxEvent *OCPN_BUILDSENC_ThreadEvent::Clone()
const {
66 newevent->stat = this->stat;
67 newevent->type = this->type;
68 newevent->m_ticket = this->m_ticket;
76SENCThreadManager::SENCThreadManager() {
79 int nCPU = wxMax(1, wxThread::GetCPUCount());
80 if (g_nCPUCount > 0) nCPU = g_nCPUCount;
83 if (nCPU < 1) nCPU = 1;
85 m_max_jobs = wxMax(nCPU - 1, 1);
88 wxLogDebug(
"SENC: nCPU: %d m_max_jobs :%d\n", nCPU, m_max_jobs);
94 (wxObjectEventFunction)(wxEventFunction)&SENCThreadManager::OnEvtThread);
100SENCThreadManager::~SENCThreadManager() {
104SENCThreadStatus SENCThreadManager::ScheduleJob(
SENCJobTicket *ticket) {
106 for (
size_t i = 0; i < ticket_list.size(); i++) {
107 if (ticket_list[i]->m_FullPath000 == ticket->m_FullPath000)
108 return THREAD_PENDING;
111 ticket->m_status = THREAD_PENDING;
112 ticket_list.push_back(ticket);
118 return THREAD_PENDING;
121void SENCThreadManager::StartTopJob() {
125 for (
size_t i = 0; i < ticket_list.size(); i++) {
126 if (ticket_list[i]->m_status == THREAD_STARTED) nRunning++;
130 if (nRunning < m_max_jobs) {
132 startCandidate = NULL;
133 for (
size_t i = 0; i < ticket_list.size(); i++) {
134 if (ticket_list[i]->m_status == THREAD_PENDING) {
135 startCandidate = ticket_list[i];
141 if (startCandidate) {
146 startCandidate->m_thread = thread;
147 startCandidate->m_status = THREAD_STARTED;
148 thread->SetPriority(20);
156 count.Printf(
" %ld", ticket_list.size());
157 top_frame::Get()->SetAlertString(_(
"Preparing vector chart ") + count);
166 for (
size_t i = 0; i < ticket_list.size(); i++) {
167 if (ticket_list[i] == ticket) {
171 ticket_list.erase(ticket_list.begin() + i);
180 for (
size_t i = 0; i < ticket_list.size(); i++) {
181 if (ticket_list[i]->m_status == THREAD_STARTED) nRunning++;
186 count.Printf(
" %ld", ticket_list.size());
187 top_frame::Get()->SetAlertString(_(
"Preparing vector chart ") + count);
189 top_frame::Get()->SetAlertString(
"");
194int SENCThreadManager::GetJobCount() {
return ticket_list.size(); }
196bool SENCThreadManager::IsChartInTicketlist(
s57chart *chart) {
197 for (
size_t i = 0; i < ticket_list.size(); i++) {
198 if (ticket_list[i]->m_chart == chart)
return true;
203bool SENCThreadManager::SetChartPointer(
s57chart *chart,
void *new_ptr) {
205 for (
size_t i = 0; i < ticket_list.size(); i++) {
206 if (ticket_list[i]->m_chart == chart) {
207 ticket_list[i]->m_chart = (
s57chart *)new_ptr;
214#define NBAR_LENGTH 40
219 switch (event.type) {
220 case SENC_BUILD_STARTED:
222 Sevent.type = SENC_BUILD_STARTED;
223 Sevent.m_ticket =
event.m_ticket;
226 case SENC_BUILD_DONE_NOERROR:
228 Sevent.type = SENC_BUILD_DONE_NOERROR;
229 Sevent.m_ticket =
event.m_ticket;
230 FinishJob(event.m_ticket);
234 case SENC_BUILD_DONE_ERROR:
236 Sevent.type = SENC_BUILD_DONE_ERROR;
237 Sevent.m_ticket =
event.m_ticket;
238 FinishJob(event.m_ticket);
245 if (top_frame::Get())
246 top_frame::Get()->GetEventHandler()->AddPendingEvent(Sevent);
255 m_FullPath000 = ticket->m_FullPath000;
256 m_SENCFileName = ticket->m_SENCFileName;
263void *SENCBuildThread::Entry() {
278 senc.setRegistrar(g_poRegistrar);
279 senc.setRefLocn(m_ticket->ref_lat, m_ticket->ref_lon);
280 senc.SetLODMeters(m_ticket->m_LOD_meters);
281 senc.setNoErrDialog(
true);
283 m_ticket->m_SENCResult = SENC_BUILD_STARTED;
286 Sevent.type = SENC_BUILD_STARTED;
287 Sevent.m_ticket = m_ticket;
288 if (m_manager) m_manager->QueueEvent(Sevent.Clone());
290 int ret = senc.createSenc200(m_FullPath000, m_SENCFileName,
false);
294 Nevent.m_ticket = m_ticket;
295 if (ret == ERROR_INGESTING000)
296 Nevent.type = SENC_BUILD_DONE_ERROR;
298 Nevent.type = SENC_BUILD_DONE_NOERROR;
300 m_ticket->m_SENCResult = Sevent.type;
301 if (m_manager) m_manager->QueueEvent(Nevent.Clone());
312 catch (
const std::exception &e ) {
313 const char *msg = e.what();
General chart base definitions.
Generic Chart canvas base.
Manager for S57 chart SENC creation threads.
Represents an S57 format electronic navigational chart in OpenCPN.
Global variables stored in configuration file.
const wxEventType wxEVT_OCPN_BUILDSENCTHREAD
Global instance.
SENCThreadManager * g_SencThreadManager
Global instance.
const wxEventType wxEVT_OCPN_BUILDSENCTHREAD
Global instance.
Abstract gFrame/MyFrame interface.