Version





static DWORD initialize_base (void)
{
CTA_SERVICE_NAME init_services [] =
{
{ "ADI", "ADIMGR" },
{ "FXM", "ADIMGR" },
/* { "ADI", "QDIMGR" }, for QX 2000 boards */
/* { "FXM", "QDIMGR" }, for QX 2000 boards */
{ "FAX", "FAXMGR" },
{ "NFX", "NFXMGR" },
};
CTA_INIT_PARMS init_parms =
{
sizeof (CTA_INIT_PARMS),
};
DWORD status;
static int initialized = 0;
if (initialized)
return SUCCESS;
status = ctaInitialize ( init_services,
sizeof init_services / sizeof init_services [0],
& init_parms);
if (status != SUCCESS)
show_error (NULL_CTAHD, status, "CT Access initialization failed");
else
initialized = 1;
return status;
}

|
Service Manager
|
Service
|
|---|---|
|
ADIMGR (QDIMGR for QX 2000 boards)
|
ADI
|
|
ADIMGR (QDIMGR for QX 2000 boards)
|
FXM
|
|
NFXMGR
|
NFX
|
|
FAXMGR
|
FAX
|

static DWORD create_context (CTAQUEUEHD queue,
DWORD board,
DWORD stream,
DWORD timeslot,
DWORD closure,
char * contextname,
CTAHD * contextptr)
{
DWORD status;
CTA_SERVICE_DESC services [4];
DWORD service_count = 0;
CTA_EVENT event;
status = ctaCreateContext (queue, closure, contextname, contextptr);
if (status != SUCCESS)
{
show_error (NULL_CTAHD, status, "CT Access context creation failed");
return status;
}
/*
* Now that we have a valid CT Access context, we can use ctaGetText
* to get proper error messages.
*/
memset (& services, 0, sizeof services);
services[service_count].name.svcname = "ADI";
services[service_count].name.svcmgrname = "ADIMGR";
/* for QX 2000 boards, use QDIMGR instead of ADIMGR */
services[service_count].mvipaddr.board = board;
services[service_count].mvipaddr.stream = stream;
services[service_count].mvipaddr.timeslot = timeslot;
services[service_count].mvipaddr.mode = ADI_FULL_DUPLEX;
service_count += 1;
services[service_count].name.svcname = "FXM";
services[service_count].name.svcmgrname = "ADIMGR";
/* for QX 2000 boards, use QDIMGR instead of ADIMGR */
services[service_count].mvipaddr.board = board;
services[service_count].mvipaddr.stream = stream;
services[service_count].mvipaddr.timeslot = timeslot;
services[service_count].mvipaddr.mode = ADI_FULL_DUPLEX;
service_count += 1;
/*
* Specific MVIP_ADDR field assignments for the FXM, FAX, and NFX
* services are ignored; these services use the MVIP_ADDR data that was
* passed to the ADI service.
*/
services[service_count].name.svcname = "FAX";
services[service_count].name.svcmgrname = "FAXMGR";
services[service_count].mvipaddr.board = board;
services[service_count].mvipaddr.stream = stream;
services[service_count].mvipaddr.timeslot = timeslot;
services[service_count].mvipaddr.mode = ADI_FULL_DUPLEX;
service_count += 1;
services[service_count].name.svcname = "NFX";
services[service_count].name.svcmgrname = "NFXMGR";
services[service_count].mvipaddr.board = board;
services[service_count].mvipaddr.stream = stream;
services[service_count].mvipaddr.timeslot = timeslot;
services[service_count].mvipaddr.mode = ADI_FULL_DUPLEX;
service_count += 1;
status = ctaOpenServices (* contextptr, services, service_count);
if (status != SUCCESS)
{
show_error (* contextptr, status, "open services failed");
return status;
}
/* Now we need to wait for the CTAEVN_OPEN_SERVICES_DONE event. */
status = wait_event (queue, * contextptr, CTAEVN_OPEN_SERVICES_DONE,
NULL, 0, & event);
if (status != SUCCESS)
{
show_error (* contextptr, status, "open services failed");
return status;
}
else if (event.value != CTA_REASON_FINISHED)
{
show_error (* contextptr, event.value, "open services done event");
return event.value;
}
else
return SUCCESS;
}








Figure 2. Functions for a Typical Fax Application


Figure 4. Polling the Remote Receiver (one page document)

Figure 5. Responding to the Remote Transmitter's Poll (one page document)




Figure 6. Image Conversion Decision When Transmitting a Fax

Figure 7. Image Conversion Decision When Receiving a Fax

|
OTFmode
|
Advertised Parameters
|
|---|---|
|
NFX_OTF_NEVER
|
1D encoding Low resolution A4 page width
|
|
NFX_OTF_ALWAYS
|
MMR encoding (if ECM is enabled) or MR (if ECM is disabled) Low resolution A4 page width
|

|
For more information about...
|
Refer to...
|
|---|---|
|
NaturalFax errors
|
Appendix A
|
|
NaturalFax events
|
Appendix C
|
|
NaturalFax data structures
|
Appendix C
|
|
Modem metrics
|
Appendix G
|

|
Trace Mask
|
Value
|
Description
|
|---|---|---|
|
NFX_TRACE_T30
|
0x000C00
|
Logs information relating to T.30 protocol.
|
|
NFX_TRACE_ALL
|
0x000F00
|
Logs all available fax information.
|
ctaSetTraceLevel( ctahd, "NFX", NFX_TRACE_T30 | CTA_TRACEMASK_ALL_EVENTS );



Note: Once a receive queue is changed to a send queue, it cannot be changed back to a receive queue.

Version