37#include "s57class_registrar.h"
44SENCJobTicket::SENCJobTicket() {
45 m_SENCResult = SENC_BUILD_INACTIVE;
46 m_status = THREAD_INACTIVE;
54OCPN_BUILDSENC_ThreadEvent::OCPN_BUILDSENC_ThreadEvent(wxEventType commandType,
56 : wxEvent(id, commandType) {
60OCPN_BUILDSENC_ThreadEvent::~OCPN_BUILDSENC_ThreadEvent() {}
62wxEvent *OCPN_BUILDSENC_ThreadEvent::Clone()
const {
64 newevent->stat = this->stat;
65 newevent->type = this->type;
66 newevent->m_ticket = this->m_ticket;
74SENCThreadManager::SENCThreadManager() {
77 int nCPU = wxMax(1, wxThread::GetCPUCount());
78 if (g_nCPUCount > 0) nCPU = g_nCPUCount;
81 if (nCPU < 1) nCPU = 1;
83 m_max_jobs = wxMax(nCPU - 1, 1);
86 wxLogDebug(
"SENC: nCPU: %d m_max_jobs :%d\n", nCPU, m_max_jobs);
92 (wxObjectEventFunction)(wxEventFunction)&SENCThreadManager::OnEvtThread);
98SENCThreadManager::~SENCThreadManager() {
102SENCThreadStatus SENCThreadManager::ScheduleJob(
SENCJobTicket *ticket) {
104 for (
size_t i = 0; i < ticket_list.size(); i++) {
105 if (ticket_list[i]->m_FullPath000 == ticket->m_FullPath000)
106 return THREAD_PENDING;
109 ticket->m_status = THREAD_PENDING;
110 ticket_list.push_back(ticket);
116 return THREAD_PENDING;
119void SENCThreadManager::StartTopJob() {
123 for (
size_t i = 0; i < ticket_list.size(); i++) {
124 if (ticket_list[i]->m_status == THREAD_STARTED) nRunning++;
128 if (nRunning < m_max_jobs) {
130 startCandidate = NULL;
131 for (
size_t i = 0; i < ticket_list.size(); i++) {
132 if (ticket_list[i]->m_status == THREAD_PENDING) {
133 startCandidate = ticket_list[i];
139 if (startCandidate) {
144 startCandidate->m_thread = thread;
145 startCandidate->m_status = THREAD_STARTED;
146 thread->SetPriority(20);
154 count.Printf(
" %ld", ticket_list.size());
155 if (gFrame->GetPrimaryCanvas())
156 gFrame->GetPrimaryCanvas()->SetAlertString(_(
"Preparing vector chart ") +
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 if (gFrame->GetPrimaryCanvas())
188 gFrame->GetPrimaryCanvas()->SetAlertString(_(
"Preparing vector chart ") +
191 if (gFrame->GetPrimaryCanvas())
192 gFrame->GetPrimaryCanvas()->SetAlertString(
"");
197int SENCThreadManager::GetJobCount() {
return ticket_list.size(); }
199bool SENCThreadManager::IsChartInTicketlist(
s57chart *chart) {
200 for (
size_t i = 0; i < ticket_list.size(); i++) {
201 if (ticket_list[i]->m_chart == chart)
return true;
206bool SENCThreadManager::SetChartPointer(
s57chart *chart,
void *new_ptr) {
208 for (
size_t i = 0; i < ticket_list.size(); i++) {
209 if (ticket_list[i]->m_chart == chart) {
210 ticket_list[i]->m_chart = (
s57chart *)new_ptr;
217#define NBAR_LENGTH 40
222 switch (event.type) {
223 case SENC_BUILD_STARTED:
225 Sevent.type = SENC_BUILD_STARTED;
226 Sevent.m_ticket =
event.m_ticket;
229 case SENC_BUILD_DONE_NOERROR:
231 Sevent.type = SENC_BUILD_DONE_NOERROR;
232 Sevent.m_ticket =
event.m_ticket;
233 FinishJob(event.m_ticket);
237 case SENC_BUILD_DONE_ERROR:
239 Sevent.type = SENC_BUILD_DONE_ERROR;
240 Sevent.m_ticket =
event.m_ticket;
241 FinishJob(event.m_ticket);
248 if (gFrame) gFrame->GetEventHandler()->AddPendingEvent(Sevent);
257 m_FullPath000 = ticket->m_FullPath000;
258 m_SENCFileName = ticket->m_SENCFileName;
265void *SENCBuildThread::Entry() {
280 senc.setRegistrar(g_poRegistrar);
281 senc.setRefLocn(m_ticket->ref_lat, m_ticket->ref_lon);
282 senc.SetLODMeters(m_ticket->m_LOD_meters);
283 senc.setNoErrDialog(
true);
285 m_ticket->m_SENCResult = SENC_BUILD_STARTED;
288 Sevent.type = SENC_BUILD_STARTED;
289 Sevent.m_ticket = m_ticket;
290 if (m_manager) m_manager->QueueEvent(Sevent.Clone());
292 int ret = senc.createSenc200(m_FullPath000, m_SENCFileName,
false);
296 Nevent.m_ticket = m_ticket;
297 if (ret == ERROR_INGESTING000)
298 Nevent.type = SENC_BUILD_DONE_ERROR;
300 Nevent.type = SENC_BUILD_DONE_NOERROR;
302 m_ticket->m_SENCResult = Sevent.type;
303 if (m_manager) m_manager->QueueEvent(Nevent.Clone());
314 catch (
const std::exception &e ) {
315 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.