Simulated the CD changer of a Saab to implement a bluetooth connection to the car stereo. Control of playback device (phone) with steering wheel buttons. Needs a RN52 bluetooth transciever and a CAN transiever. So far only audio playback and control via steering wheel buttons implemented. Hands free calling planned.

Dependencies:   mbed

main.cpp

Committer:
petter
Date:
2016-01-05
Revision:
3:b76c74783d0d
Parent:
2:10c60edc8573
Child:
4:3041a571b7a7

File content as of revision 3:b76c74783d0d:

// Inspired from BlueSaab
// Project/Hardware: http://bluesaab.blogspot.com/
// Code: https://github.com/kveilands/SAAB-CDC/tree/master/SAAB-CDC
// I-Bus information from http://pikkupossu.1g.fi/tomi/projects/i-bus/i-bus.html

#include "mbed.h"
#include "CDC.h"
#include "RN52.h"

CDC cdc;
RN52 rn52;
RN52_RESULT res;

Serial pc(USBTX, USBRX); // tx, rx

int main() {
    printf("Petters BT CDC-emulator\r\n");
    printf("Initializing\r\n");
    cdc.init();
    rn52.init();
    printf("Starting loop\r\n");
    while(1) {
        //Debug connection to PC
        if(pc.readable()) {
            switch (pc.getc()) {
                case 'p':
                    if(rn52.set(RN52_PLAYPAUSE)) {
                        printf("play/pause\r\n");
                    }
                    break;
                case 'v':
                    printf("volume up\r\n");
                    rn52.set(RN52_VOLUMEUP);
                    break;             
                case 'n':
                    printf("next track\r\n");
                    rn52.set(RN52_NEXTTRACK);
                    break;  
                case 'q':
                    printf("getting status\r\n");
                    rn52.get(RN52_GETSTATUS, &res);
                    printf("%s", res.response);
                    break;
                case 't':
                    rn52.get(RN52_CALLER_ID, &res);
                    printf("%s", res.response);
                    break;
            }
        }
        switch (cdc.get_cmd()) {
            case IBUS_OTHER_MESSAGE:
                break;
            case IBUS_DOORS_LOCKED:
                break;
            case IBUS_DOORS_UNLOCKED:
                break;
            case IBUS_NEXT:
                cdc.display("NEXT");
                rn52.set(RN52_PLAYPAUSE);
                break;
            case IBUS_CDC_ON:
                cdc.display("CDC ON");
                break;
            case IBUS_CDC_OFF:
                cdc.display("CDC OFF");
                break;
            case IBUS_VOLUME_UP:
                cdc.display("VOLUME UP");
                rn52.set(RN52_VOLUMEUP);
                break;
            case IBUS_VOLUME_DOWN:
                cdc.display("VOLUME DOWN");
                break;
            case IBUS_SKIP_FW:
                cdc.display("SKIP FW");
                rn52.set(RN52_NEXTTRACK);
                break;
            case IBUS_SKIP_BW:
                cdc.display("SKIP BW");
                rn52.set(RN52_PREVTRACK);
                break;
            case IBUS_SET:
                cdc.display("SET");
                rn52.set(RN52_CONNECT);
                break;
            case IBUS_CLEAR:
                cdc.display("CLEAR");
                rn52.set(RN52_DISCONNECT);
                break;
        }
        if(rn52.changed()) {
            rn52.get(RN52_GETSTATUS, &res);
            switch (res.event) {
                case RN52_CALLER_ID_EVENT:
                    rn52.get(RN52_CALLER_ID, &res);
                    break;
                case RN52_TRACK_CHANGE_EVENT:
                    rn52.get(RN52_TRACK_METADATA, &res);
                    cdc.reset_elapsed_time();
                    break;
                case RN52_NO_EVENT: //no event occured, check connection status
                    if(res.connection == RN52_AUDIO_STREAMING) {
                        cdc.display("BT SPELAR");
                        cdc.start_elapsed_time();
                    }
                    else {
                        cdc.stop_elapsed_time();
                        cdc.reset_elapsed_time();
                    }
                    
            }
            
        }
    }
}