Below is a list of frequently asked questions concerning NOAHlink.
Where can I purchase NOAHlink-compatible hearing instrument cables?
It is up to each hearing instrument manufacturer to provide NOAHlink-compatible cables for programming their hearing instruments
HIMSA would prefer that you use standard cables wherever possible in order to reduce the number of cables required by NOAHlink users. You can see a complete list of NOAHlink standard cables, including pinouts, in the NOAHlink Cable Catalog. For further details, refer to the NOAHlink cable catalog under Related Links to the right of this page.
You are also welcome to order your standard cables from Pulse Engineering. Please refer to Pulse website under Related Links to the right of this page.
Why does the NOAHlinkProtocolDemo.exe program prompt a ‘Could not Sync Protocol…’ message?
This message appears if you have not registered the DLLs which implement the Sync and General HI protocol objects. You can register these DLLs using either of the following options:
- Open the directory containing the hi_general.dll file. From the command prompt, run ‘regsvr32 hi_general.dll’. Then open the directory containing the hi_sync.dll file. From the command prompt, run ‘regsvr32 hi_sync.dll’.
- If you have copied the SDK CD directory (\Software\NOAHlink PC software\Source\Raw files\Debug) to your hard disk, open this directory and run the install_protocol.bat file.
Why is the call ‘…->raw_login(..)…’ used instead of ‘…->login(..)…’?
This call appears in the following code:
“NOAHlinkProtocolDemo\MainSheet.cpp(653):
hr = m_pSync->raw_Login (MPEG_None, FALSE, FALSE, LEFT, &g_hNOAHlink);”
HI_Sync.tlb / / interface ISync wrapper method implementations
inline HRESULT ISync::Login ( enum MPEG_Options Option, long Resampling, long Override, enum SIDE SIDE, unsigned char * hNOAHlink )
{
HRESULT _hr = raw_Login (Option, Resampling, Override, SIDE, NOAHlink);
if (FAILED(_hr) )
com_issue_errorex(_hr, this, __uuidof (this) );
return _hr;
}
The raw interface has been chosen in the protocol demo program. The interface can be shown and wrapped by similar functions in a different manner, depending on the environment in which it is used:
- The Login method in the Isync interface has the following representation as shown in the idl file. This method returns an error code in a HRESULT and has one out parameter – the NOAHlink handle:
HRESULT Login (
[in] enum MPEG_Options Option,
[in] BOOL Resampling,
[in] BOOL Override,
[in] enum SIDE Side,
[in, out] BYTE* hNOAHlink);
- Another view appears when using the Object Browser from Visual Basic, or the OLE/COM Object viewer from Visual C++, to look at the resulting type library (HI_Sync.tlb) or executable (HI_Sync.dll). This is a wrapped version as it can be used from either VB or C++. There is no return value with this method. VB always wraps the raw method and, if this method fails, VB throws an exception. This exception is caught with the On Error statement:
void Login (
[in] MPEG_Options Option,
[in] long Resampling,
[in] long Override,
[in] SIDE SIDE,
[in, out] unsigned char* hNOAHlink);
- In VC it is possible to access both the raw and the wrapped interface methods. If you use the wrapped interface, you must handle the exception using try/catch. If you use the raw interface, you must handle the HRESULT return values. In the protocol demo main header file, stdafx.h, the following line appears:
#import “..\HI_Sync\HI_Sync.tlb” no_namespace, named_guids, …….
This line causes the VC to compile and generate two files, HI_Sync.tlh and HI_Sync.tli, and to include them at the specified location. The first file includes prototypes for both raw and wrapped interfaces, while the second file contains inline implementations of the wrapper methods.
By applying switches to the #import it is possible to create only raw or only wrapped interfaces, as required.
Why does BYTE NOAHlink not appear as the first parameter in the commands in the HI_General.tli file?
The commands Delay, SendUserEvent, BeginMultiCmd, SendMultiCmdData and getErrorString do not have BYTE NOAHlink as the first parameter in the HI_General.tli file.
These are specific commands for the multicommand data.
To define multi-commands, you must begin by calling BeginMultiCmd with a commandID. This is stored in the GeneralHi object. After this, call the commands you wish to add to the multi-command. Finally, call EndMultiCmd. In this case, you must call EndMultiCmd with a handle to NOAHlink. The NOAHlink handle is only required when calling the NOAHlink driver. BeginMultiCmd does not call the driver. Instead, EndMultiCmd calls the driver and sends the defined multi-command.
The Delay command is used only in the multi-command and does not call the driver directly. Thus, you do not need to give the command a handle to NOAHlink. This is also the case for SendUserEvent.
What is the solution to the C++ compiler error ‘Wrong Number of Parameters’ on some methods?
You may be using both raw and wrapper interface and the last parameter is [out,retval]. In the following, AllocateMemory is used as the example:
- Solution One: Call raw interface directly, e.g. raw_AllocateMemory
- Solution Two: Prevent declaration of wrapper interface so raw interface will be named the correct names without the raw_ prefix. To do this, put a raw_interfaces_only on the #import statement as follows:
#import “NOAHlinkdrv.tlb” raw_interfaces_only
- Solution Three: Keep using the wrapper interface but notice that if the last parameter in the method is a [out, retval] parameter it is returned as a function return value rather than as an out parameter. This is also how VB normally does.
Examples
- Example 1: In this example, use ‘try/catch’ to get any errors:
// Use wrapper method
long Address;
Address = AllocateMemory(hNOAHlink, X_MEMORY, FALSE, FALSE, 200)
- Example 2: In this example, test the hr return value to get any errors:
// Use raw method when only raw interface is used (raw_interfaces_only)
HRESULT hr;
hr = AllocateMemory(hNOAHlink, X_MEMORY, FALSE, FALSE, 200, &Address);
- Example 3: In this example, test the hr return value to get any errors:
// Use raw method when both raw and wrapper interface is used
HRESULT hr;
hr = raw_AllocateMemory(hNOAHlink, X_MEMORY, FALSE, FALSE, 200, &Address);
Extract from the NOAHlinkDrv.tli file
An extract from the NOAHlinkDrv.tli shows how #import has created the wrapper methods:
inline long INOAHlink::AllocateMemory ( unsigned char hNOAHlink, enum MemoryType MemType, long Circular, long DMA_Access, long Size ) {
long_result
HRESULT _hr = raw_AllocateMemory(hNOAHlink, MemType, Circular, DMA_Access, Size, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return_result;
}
How do I correct a debug error?
The program may return a debug error, such as:
Debug Error!
Program: …
File: i386\chkesp.c
Line: 42
The value of ESP was not properly saved across a function call…
The registered NOAHlink driver and the calling program do not use the same interface.
Causes and solutions
- Cause 1: NOAHlink driver or protocols are old. Solution: Register the newest versions.
- Cause 2: Your program is built with an old type library. Solution: Recompile with the newest type library.
- Cause 3: Your compiler is failing to see dependencies and does not make all files. This can happen if you rebuild all files and then get a new type library that is older than all your temporary files. Solution: To solve this be sure to clean all temporary files. In VC pressing clean does not clean .tli, .hli and .ncb files. You might have to clean them manually.
Why does an event not get through even though it is written in the log file?
You must have a message loop running to be able to receive events from NOAHlink since the driver is a STA object.
In VB, you can use DoEvent while waiting for events.
In VC, you can use MsgWaitForMultipleObjects to wait for an event set by your On<SomeEvent> handler. You cannot use WaitForMultipleObjects since it needs to process messages while it waits.