To follow-up on my last experimentation with Windows on Galileo, I implemented a simply threaded blinker. In the short, 2 threads are created in the setup function. One if switching ON the LED, the other is switching it OFF. Both threads are using a critical section while operating the LED. The loop function simply activates and de-activates the blinker. All looks good and is very promising in terms of systems programming. It will be interesting – and probably easy – to implement a multi-threaded data collector. This is really promising.

#include "stdafx.h"
#include "arduino.h"
#include "process.h"
#include "windows.h"

#define LONG_PAUSE_IN_MS \
    (2000)
#define SHORT_PAUSE_IN_MS \
    (5)
#define LED_OFF \
    digitalWrite(led, LOW);
#define LED_ON \
    digitalWrite(led, HIGH);

HANDLE h_on_thread = NULL;
HANDLE h_off_thread = NULL;
DWORD on_thread_id = 0;
DWORD off_thread_id = 0;
CRITICAL_SECTION cs = { 0 };
int f_stop = 0;
int led = 13;  // This is the pin the LED is attached to.
unsigned int __stdcall on_thread(void );
unsigned int __stdcall off_thread(void *);

int _tmain(int argc, _TCHAR argv[]) {
    return RunArduinoSketch();
    // DeleteCriticalSection (need to do)
}

void setup() {
    pinMode(led, OUTPUT);
    InitializeCriticalSection(&cs);
    h_on_thread = (HANDLE)_beginthreadex(
        NULL,
        0,
        on_thread,
        (void *)NULL,
        0,
        (unsigned int *)&on_thread_id
    );
    assert(h_on_thread != NULL);

    h_off_thread = (HANDLE)_beginthreadex(
        NULL,
        0,
        off_thread,
        (void *)NULL,
        0,
        (unsigned int *)&off_thread_id
    );
    assert(h_off_thread != NULL);
}

void loop() {
    f_stop = 0;
    Sleep(LONG_PAUSE_IN_MS);
    f_stop = 1;
    Sleep(LONG_PAUSE_IN_MS);
}

unsigned int __stdcall on_thread(void *px) {
    for(;;) {
        while(f_stop == 0) {
            EnterCriticalSection(&cs);
            LED_ON;
            delay(SHORT_PAUSE_IN_MS);
            LeaveCriticalSection(&cs);
        }
    }
    return(0);
}
unsigned int __stdcall off_thread(void *px) {
    for(;;) {
        while(f_stop == 0) {
           EnterCriticalSection(&cs);
           LED_OFF;
           delay(SHORT_PAUSE_IN_MS);
           LeaveCriticalSection(&cs);
        }
    }
    return(0);
}