Compileren C (CCOL) regelingen met Visual 2017

Soms wil je mee met de vaart der volkeren, bijvoorbeeld door te gaan werken met de laatste versie van Visual Studio: Community 2017. Compileren van CCOL regelingen is echter minder vanzelfsprekend dan je misschien zou verwachten. Daarom bij deze een kleine tutorial.

Installeren van de juiste onderdelen

Om oude stijl C programma’s (C89/C90) te kunnen compileren met Visual Studio 2017 zijn een aantal onderdelen nodig die niet standaard worden geïnstalleerd. Tijdens het installatie proces komt een scherm naar voren waarin “Workloads” gekozen kunnen worden: hier moet sowieso “Desktop Development with C++” worden gekozen, zodat de C compiler etc. worden geïnstalleerd. Onder “Individual components” moet vervolgens nog extra worden toegevoegd:
  • Windows Universal CRT SDK (onder “Compilers, build tools, and runtimes”)
  • Windows 8.1 SDK (onder “SDKs, libraries, and frameworks”, helemaal onderaan)
  • Windows Universal C Runtime (idem)
Heb je Visual reeds geïnstalleerd? Dan kunnen de betreffende onderdelen ook naderhand worden geïnstalleerd. Sluit Visual eerst af. Ga nu naar Apps bij Instellingen/Settings (of hoe dat evt. heet in de Nederlandse versie: Programma’s/Toepassingen/…) en klik op “Visual Studio Community 2017”. Klik nu op “Wijzigen/Modify”: het scherm voor installatie van onderdelen komt nu naar voren. Onder Windows 7 verloopt dit via “Programma’s en onderdelen”, en dan “Programma’s verwijderen”, of iets dat daarop lijkt: dan komt de lijst met programma’s naar voren en kan ook “wijzigen” worden geklikt bovenin.

Juiste SDK versie en toevoegen legacy libs

Om een CCOL regeling te kunnen compileren moet nu in de project omgeving (rechtermuisklik op het project > Properties/Eigenschappen) nog het volgende worden ingesteld:
  • Onder “General/Algemeen”: Windows SDK Version: 8.1 (met SDK 10 kan geen C89 worden gecompileerd, voor zover ik weet)
  • Onder “Linker” > “Input”: voeg bij “Additional dependencies” toe: legacy_stdio_definitions.lib;
    • Dit zorgt dat verouderde functies zoals “sprintf” etc. weer beschikbaar komen tijdens runtime.
Of, je kunt natuurlijk overstappen op een regeling geschreven in C#! Succes!  

YAVV released

Zojuist heb ik een eerste beta versie van YAVV gelanceerd. YAVV staat voor “Yet Another VLOG Viewer”, en is precies dat: een VLOG 3.0.x viewer. De applicatie is nog niet zeer uitgebreid, wel volledig functioneel. Zo kunnen ook in- en uitgangen met hoge indices worden uitgelezen, kan de applicatie de in VLOG3 opgenomen configuratie automatisch uitlezen, en kunnen ook timings (TTG/TTR) worden gevisualiseerd. Zie voor meer details deze pagina: YAVV. Evetuele bugs kunnen (graag met zoveel mogelijk detail t.b.v. kunnen reproduceren) worden gemeld via deze pagina. Veel VLOG-plezier!

TLCFI.NET online

Afgelopen jaar heb ik in samenwerking met de provincie Noord-Holland een pilot project uitgevoerd rond de TLC-FI, ofwel Traffic Light Controller Facilities Interface. De TLC-FI is een open koppelvlak waarmee een externe applicatie data uit kan wisselen met een iVRI (ofwel een ‘intelligente’ verkeersregelinstallatie). Op die manier kan de externe applicatie data ophalen uit de VRI, en – indien daartoe geautoriseerd – de verkeerslichten aansturen. De code die binnen dit project is ontwikkeld is inmiddels open source beschikbaar!

Doel van de pilot was de toepasbaarheid van de TLC-FI als open koppelvlak in de praktijk te toetsen. Daartoe is de TLC-FI geimplementeerd in de taal C#. Om het pilot project zo onafhankelijk mogelijk van het lopende traject rond de iVRI te laten plaatsvinden, is voor de koppeling gebruik gemaakt van een nieuw type verkeersregeling. Onlangs had ik deze regeling reeds online gezet onder de werknaam: TLCProF. Inmiddels is ook de functie bibliotheek met de implementatie van de TLC-FI beschikbaar: TLCFI.NET. De combinatie van deze twee functie bibliotheken brengt de praktische mogelijkheid van een open source verkeersregelaar een stuk dichterbij!

De afgelopen weken heb ik de code van beide bibliotheken nagelopen en waar nodig opgeschoond. De komende tijd controleer ik nog de werking van diverse aspecten van TLCFI.NET. Beide bibliotheken zijn nog volop in ontwikkeling, en daarom beschikbaar in bèta vorm. Bijdragen en aanvullingen in de sources zijn ten alle tijden welkom!

Update voor MiniTD

Omdat ik MiniTD bijna dagelijks gebruik voor de planning van mijn projecten, voer ik er regelmatig onderhoud aan uit. Een wens die ik had was het mogelijk maken taken in het tabblad ‘Planning’ te verslepen naar een andere datum in de lijst. Omdat MiniTD tevens de verwachte duur van de werkzaamheden die voor dag zijn ingepland, kun je zo gemakkelijk je taken inplannen.

Het bleek gelukkig wat eenvoudiger dan ik had gedacht. Met gebruik van deze library voor drag&drop functionaliteit is het eenvoudig specifieke logica toe te voegen wanneer de gebruiker een item ergens dropt. Zie TaskPlanningView.xaml (in de map Views):

dragDrop:DragDrop.IsDragSource="True"
dragDrop:DragDrop.IsDropTarget="True"
dragDrop:DragDrop.DropHandler="{Binding Path=DropHandler}"

Hier wordt een DropHandler, een class die het IDropTarget interface implementeert, ingesteld voor de DataGrid met de lijst met taken. Bij het droppen van een item wordt de Drop() methode van die class aangeroepen. Het mooie is, dat de instance van IDropInfo die in deze methode beschikbaar is, de benodigde informatie heeft over de ‘due date’ van de datum waarnaartoe wordt gesleept. Hieronder de implementatie van deze class (TaskPlanningDropTarget.cs in de map Helpers):

public class TaskPlanningDropTarget : IDropTarget
{
  public void DragOver(IDropInfo dropInfo)
  {
    // Call default DragOver method, cause most stuff should work by default
    GongSolutions.Wpf.DragDrop.DragDrop.DefaultDropHandler.DragOver(dropInfo);
    if (dropInfo.TargetGroup == null)
    {
      dropInfo.Effects = DragDropEffects.None;
    }
  }

  public void Drop(IDropInfo dropInfo)
  {
    var group = dropInfo.TargetGroup;
    if (group != null && dropInfo.Data is MiniTaskViewModel item)
    {
      if (group.Items.Any())
      {
        var olddate = item.DateDue;
        var date = ((MiniTaskViewModel) group.Items.First()).DateDue;
        item.DateDue = new DateTime(date.Year, date.Month, date.Day,
        olddate.Hour, olddate.Minute, olddate.Second);
      }
    }
  }
}

Nu kun je taken naar hartelust slepen van datum naar datum (met als beperking: er moet op die datum al wel een andere taak zijn ingepland, anders staat ie niet in de lijst). Hieronder een screenshot. Veel plezier!

Website vernieuwd

Na lange tijd zonder tijd heb ik mijn website een kleine make-over gegeven. Ook heb ik een ‘blog’ item in het menu toegevoegd, waar ik af en toe zal berichten over noemenswaardige ontwikkelingen, vondsten en projecten.