37#include "ocpn_frame.h"
40extern int g_nCPUCount;
41extern S57ClassRegistrar *g_poRegistrar;
48SENCJobTicket::SENCJobTicket() {
49 m_SENCResult = SENC_BUILD_INACTIVE;
50 m_status = THREAD_INACTIVE;
53const wxEventType wxEVT_OCPN_BUILDSENCTHREAD = wxNewEventType();
58OCPN_BUILDSENC_ThreadEvent::OCPN_BUILDSENC_ThreadEvent(wxEventType commandType,
60 : wxEvent(id, commandType) {
64OCPN_BUILDSENC_ThreadEvent::~OCPN_BUILDSENC_ThreadEvent() {}
66wxEvent *OCPN_BUILDSENC_ThreadEvent::Clone()
const {
68 newevent->stat = this->stat;
69 newevent->type = this->type;
70 newevent->m_ticket = this->m_ticket;
78SENCThreadManager::SENCThreadManager() {
81 int nCPU = wxMax(1, wxThread::GetCPUCount());
82 if (g_nCPUCount > 0) nCPU = g_nCPUCount;
85 if (nCPU < 1) nCPU = 1;
87 m_max_jobs = wxMax(nCPU - 1, 1);
90 wxLogDebug(
"SENC: nCPU: %d m_max_jobs :%d\n", nCPU, m_max_jobs);
95 wxEVT_OCPN_BUILDSENCTHREAD,
96 (wxObjectEventFunction)(wxEventFunction)&SENCThreadManager::OnEvtThread);
102SENCThreadManager::~SENCThreadManager() {
106SENCThreadStatus SENCThreadManager::ScheduleJob(
SENCJobTicket *ticket) {
108 for (
size_t i = 0; i < ticket_list.size(); i++) {
109 if (ticket_list[i]->m_FullPath000 == ticket->m_FullPath000)
110 return THREAD_PENDING;
113 ticket->m_status = THREAD_PENDING;
114 ticket_list.push_back(ticket);
120 return THREAD_PENDING;
123void SENCThreadManager::StartTopJob() {
127 for (
size_t i = 0; i < ticket_list.size(); i++) {
128 if (ticket_list[i]->m_status == THREAD_STARTED) nRunning++;
132 if (nRunning < m_max_jobs) {
134 startCandidate = NULL;
135 for (
size_t i = 0; i < ticket_list.size(); i++) {
136 if (ticket_list[i]->m_status == THREAD_PENDING) {
137 startCandidate = ticket_list[i];
143 if (startCandidate) {
148 startCandidate->m_thread = thread;
149 startCandidate->m_status = THREAD_STARTED;
150 thread->SetPriority(20);
158 count.Printf(
" %ld", ticket_list.size());
159 if (gFrame->GetPrimaryCanvas())
160 gFrame->GetPrimaryCanvas()->SetAlertString(_(
"Preparing vector chart ") +
170 for (
size_t i = 0; i < ticket_list.size(); i++) {
171 if (ticket_list[i] == ticket) {
175 ticket_list.erase(ticket_list.begin() + i);
184 for (
size_t i = 0; i < ticket_list.size(); i++) {
185 if (ticket_list[i]->m_status == THREAD_STARTED) nRunning++;
190 count.Printf(
" %ld", ticket_list.size());
191 if (gFrame->GetPrimaryCanvas())
192 gFrame->GetPrimaryCanvas()->SetAlertString(_(
"Preparing vector chart ") +
195 if (gFrame->GetPrimaryCanvas())
196 gFrame->GetPrimaryCanvas()->SetAlertString(
"");
201int SENCThreadManager::GetJobCount() {
return ticket_list.size(); }
203bool SENCThreadManager::IsChartInTicketlist(
s57chart *chart) {
204 for (
size_t i = 0; i < ticket_list.size(); i++) {
205 if (ticket_list[i]->m_chart == chart)
return true;
210bool SENCThreadManager::SetChartPointer(
s57chart *chart,
void *new_ptr) {
212 for (
size_t i = 0; i < ticket_list.size(); i++) {
213 if (ticket_list[i]->m_chart == chart) {
214 ticket_list[i]->m_chart = (
s57chart *)new_ptr;
221#define NBAR_LENGTH 40
226 switch (event.type) {
227 case SENC_BUILD_STARTED:
229 Sevent.type = SENC_BUILD_STARTED;
230 Sevent.m_ticket =
event.m_ticket;
233 case SENC_BUILD_DONE_NOERROR:
235 Sevent.type = SENC_BUILD_DONE_NOERROR;
236 Sevent.m_ticket =
event.m_ticket;
237 FinishJob(event.m_ticket);
241 case SENC_BUILD_DONE_ERROR:
243 Sevent.type = SENC_BUILD_DONE_ERROR;
244 Sevent.m_ticket =
event.m_ticket;
245 FinishJob(event.m_ticket);
252 if (gFrame) gFrame->GetEventHandler()->AddPendingEvent(Sevent);
261 m_FullPath000 = ticket->m_FullPath000;
262 m_SENCFileName = ticket->m_SENCFileName;
269void *SENCBuildThread::Entry() {
284 senc.setRegistrar(g_poRegistrar);
285 senc.setRefLocn(m_ticket->ref_lat, m_ticket->ref_lon);
286 senc.SetLODMeters(m_ticket->m_LOD_meters);
287 senc.setNoErrDialog(
true);
289 m_ticket->m_SENCResult = SENC_BUILD_STARTED;
292 Sevent.type = SENC_BUILD_STARTED;
293 Sevent.m_ticket = m_ticket;
294 if (m_manager) m_manager->QueueEvent(Sevent.Clone());
296 int ret = senc.createSenc200(m_FullPath000, m_SENCFileName,
false);
300 Nevent.m_ticket = m_ticket;
301 if (ret == ERROR_INGESTING000)
302 Nevent.type = SENC_BUILD_DONE_ERROR;
304 Nevent.type = SENC_BUILD_DONE_NOERROR;
306 m_ticket->m_SENCResult = Sevent.type;
307 if (m_manager) m_manager->QueueEvent(Nevent.Clone());
318 catch (
const std::exception &e ) {
319 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.