tdAddDevice ger Assertion

Moderator: Telldus

Post Reply
MartinV
Posts: 277
Joined: Fri Mar 17, 2023 9:45 am
Contact:

tdAddDevice ger Assertion

Post by MartinV »

När jag försöker anropa API:erna i Linux/Mono och försöker köra tdAddDevice(); så får jag ett felmeddelande:

Code: Select all

confuse.c:140: cfg_getopt: Assertion `cfg && cfg->name && name' failed.
Är det någon som vet om detta är något som härstammar från själva API:et? Jag har inga problem att köra tdGetDeviceParameter() eller tdSetDeviceParameter t.ex, så vissa funktioner verkar rulla på som det ska.

Jag går mot libtelldus-core.so.2 när jag gör själva anropet.. :help:
Martin | http://www.switchking.se
Testa Switch King Pro i din Android/iPhone/iPod: http://www.switchking.se/sv/demo
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Re: tdAddDevice ger Assertion

Post by micke.prag »

Detta kommer från libconfuse som libtelldus-core använder för att läsa/skriva /etc/tellstick.conf. Varför kan jag tyvärr inte svara på.
Micke Prag
Software
Telldus Technologies
MartinV
Posts: 277
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Re: tdAddDevice ger Assertion

Post by MartinV »

Jag verkar ha kommit förbi detta genom att försöka med ett antal olika approacher... :)
Kanske kommer det någon annan till del...

Mitt första problem var att jag kör Mono Develop i Linux och att utvecklingsmiljön per default inte kör med root-rättigheter. När jag försöker göra vissa saker via Telldus-API:er så smäller det just därför. Lite mystiskt att tdSetDeviceParemeter fungerar, men ändå...
När jag kör applikationen med root-rättigheter (via sudo) så fungerar det.

En annan detalj (som också påverkar Windows-miljön) är att jag tvingas att köra System.GC() med jämna mellanrum när jag anropar via API:erna. Jag fick nämligen det gamla klassiska felet "Attempted to read or write protected memory." efter att ha kört några anrop (dock inte alltid efter samma antal anrop). Efter att ha läst mig till lite hur det funkar med Interop så kom jag fram till att det har med att göra att Com-objektet (eller Linux-motsvarigheten) och .NET/C# inte håller pekarna i synk. System.GC() tvingar ju igång skräpinsamlingen och fixar rätt på pekarna.

Detta har alltså bara att göra med just Interop:et mellan unmanaged code och managed code i två miljöer. System.GC() verkar alltså lösa mina problem. Iaf har jag testat att köra loopar med 10000 anrop till API:erna utan problem, där det tidigare small efter 5-10 anrop. :wave:
Martin | http://www.switchking.se
Testa Switch King Pro i din Android/iPhone/iPod: http://www.switchking.se/sv/demo
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Re: tdAddDevice ger Assertion

Post by micke.prag »

Intressant!
Jämför gärna med vår kod:
http://developer.telldus.se/browser/tru ... Wrapper.cs

Kanske har du kommit på saker vi inte sett?
Micke Prag
Software
Telldus Technologies
MartinV
Posts: 277
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Re: tdAddDevice ger Assertion

Post by MartinV »

micke.prag wrote:[...]
Jämför gärna med vår kod[...]
Jag ser att vi har löst saker på lite olika sätt, men förhoppningsvis på inte allt för olika sätt.
Jag har t.ex. inte taggat mina metoder med "unsafe" och löst mina anrop på ungefär följande sätt:

Code: Select all

[DllImport("TelldusCore.dll")]
public static extern IntPtr tdGetName(int intDeviceId);

public static string GetName(int intDeviceId)
{
     IntPtr p = tdGetName(intDeviceId);
     string s = Marshal.PtrToStringAnsi(p);
     tdReleaseString(p);
     return s;
}
Er lösning för samma anrop baserar sig på getString:

Code: Select all

public static unsafe string tdGetName(int deviceId)
{
     return getString(UnmanagedImport.tdGetName(deviceId));
}

private static unsafe string getString(char* input, bool release)
{
     string returnString = System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(input)));
     if (release)
     {
          UnmanagedImport.tdReleaseString(input);
     }
     return returnString;
}
Jag tror inte att "unsafe" tillför något i mitt fall, men jag kan ha fel - jag är ju ingen interop-kung direkt.
Martin | http://www.switchking.se
Testa Switch King Pro i din Android/iPhone/iPod: http://www.switchking.se/sv/demo
Post Reply