Wie wär's mit einem kleinen Psychiater?Jetzt fehlt nur noch Eliza *laaach
Schäääm ...Code:/* * **************************************************************************** * RP6 ROBOT SYSTEM - RP6 CONTROL M32 TESTS * **************************************************************************** * Example: Doc Z * Author(s): Dirk * **************************************************************************** * Description: * This program for RP6 Control is a simple "electronic psychiatrist". * It asks questions (German language) and gives you an advice in the end. * Years ago a similar BASIC program was "Dr.Z" (K. Menzel, 1984). * * ############################################################################ * The Robot does NOT move in this example! You can simply put it on a table * next to your PC and you should connect it to the PC via the USB Interface! * ############################################################################ * **************************************************************************** */ /*****************************************************************************/ // Includes: #include "RP6ControlLib.h" // The RP6 Control Library (1.3beta or higher). // Always needs to be included! /*****************************************************************************/ // Defines: #define MAX_TEXTNO 12 // Number of prepared questions in psyTexts() #define QUESTIONS 8 // Number of asked questions /*****************************************************************************/ // Variables: // Reception buffer for the function getInputLine(): char receiveBuffer[UART_RECEIVE_BUFFER_SIZE + 1]; char username[UART_RECEIVE_BUFFER_SIZE + 1]; uint8_t i, rnd, rnd1, rnd2; /*****************************************************************************/ // Functions: // UART receive functions: /** * Get chars of an input line from the UART. * * Returns 0 (false), if the UART receive buffer is empty * OR a character of the input line has been received. * Returns 1, if the whole input line has been received * (with a "new line" character at the end). * Returns 2, if the UART receive buffer overflows. * The input line is stored in the receiveBuffer array. * */ uint8_t getInputLine(void) {static uint8_t buffer_pos = 0; if(getBufferLength()) { receiveBuffer[buffer_pos] = readChar(); if(receiveBuffer[buffer_pos] == '\n') { receiveBuffer[buffer_pos] = '\0'; buffer_pos = 0; return 1; } else if(buffer_pos >= UART_RECEIVE_BUFFER_SIZE) { receiveBuffer[UART_RECEIVE_BUFFER_SIZE] = '\0'; buffer_pos = 0; return 2; } buffer_pos++; } return 0; } /** * Get a complete input line from the UART. * * This function waits for a whole input line from the UART. * The input line is stored in the receiveBuffer array. * The function is blocking until one of the two following * conditions occurs: * - A "new line" character has been received at the end of * the input line. * - The UART receive buffer overflows. * */ void enterString(void) { while(!getInputLine()); } /** * GET SEED * * Gets a starting value for srand(). * */ uint16_t get_seed(void) { uint16_t seed = 0; uint16_t *p = (uint16_t*) (RAMEND + 1); extern uint16_t __heap_start; while (p >= &__heap_start + 1) seed ^= * (--p); return seed; } /** * PSY TEXTS * * Shows one of MAX_TEXTNO questions that the "psychiatrist" asks. * */ void psyTexts(uint8_t textno) { switch (textno) { case 1 : writeString_P("Erzähl mir mehr!\n"); break; case 2 : writeString_P("Fühlst du das schon lange?\n"); break; case 3 : writeString_P("Denkst du, das ist vernünftig?\n"); break; case 4 : writeString_P("Würden deine Freunde das glauben?\n"); break; case 5 : writeString_P("Kannst du damit leben?\n"); break; case 6 : writeString_P("Glaubst du, das ist normal?\n"); break; case 7 : writeString_P("Was könnte der Grund sein?\n"); break; case 8 : writeString_P("Hast du schon darüber gesprochen?\n"); break; case 9 : writeString_P("Bist du manchmal ängstlich?\n"); break; case 10 : writeString_P("Bist du oft unzufrieden?\n"); break; case 11 : writeString_P("Schläfst du gut?\n"); break; case 12 : writeString_P("Bist du häufig enttäuscht?\n"); break; // case 13 : // writeString_P("...?\n"); // break; } } /*****************************************************************************/ // Main function - The program starts here: int main(void) { initRP6Control(); // Always call this first! The Processor will not work // correctly otherwise. initLCD(); // Initialize the LC-Display (LCD) // Always call this before using the LCD! // Write some text messages to the UART - just like on RP6Base: writeString_P("\n\n _______________________\n"); writeString_P(" \\| RP6 ROBOT SYSTEM |/\n"); writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n"); writeString_P("Doc Z for RP6 CONTROL!\n"); // Set the four Status LEDs: setLEDs(0b1111); mSleep(500); setLEDs(0b0000); showScreenLCD("################", "################"); mSleep(1500); showScreenLCD("<<RP6 Control>>", "<<LC - DISPLAY>>"); mSleep(2500); showScreenLCD(" Doc Z ", " ************ "); mSleep(2500); clearLCD(); // Clear the whole LCD Screen // Play four sounds with the Piezo Beeper on the RP6Control: sound(Tone_Cis2, 300, 200); sound(Tone_Fis2, 200, 100); sound(Tone_Ais2, 100, 100); sound(Tone_Dis3, 50, 100); writeString_P("\nGuten Tag, ich bin der RP6 Psychiater.\n"); writeString_P("Wie ist dein Name?\n"); clearReceptionBuffer(); // Make sure reception Buffer is empty. enterString(); for (i = 0; i <= UART_RECEIVE_BUFFER_SIZE; i++) { username[i] = receiveBuffer[i]; } writeString_P("Wie fühlst du dich, "); writeString(username); // Output the user's name as a String writeString_P("?\n"); enterString(); srand(get_seed()); for (i = 1; i <= QUESTIONS; i++) { // Ask QUESTIONS questions do {rnd = (rand() % MAX_TEXTNO + 1);} // rnd = [0..MAX_TEXTNO] while((rnd == rnd2) || (rnd == rnd1)); rnd2 = rnd1; // Don't repeat questions to fast rnd1 = rnd; psyTexts(rnd); // Ask a random question enterString(); // Get the answer } mSleep(1500); writeString_P("\nIch denke, du machst gute Fortschritte\n"); writeString_P("bei der Lösung deiner Probleme, "); writeString(username); writeString_P(".\n\n"); writeString_P("Bis zum nächsten Mal.\n"); while(true) {} return 0; } /****************************************************************************** * Additional info * **************************************************************************** * Changelog: * - v. 1.0 (initial release) 02.05.2011 by Dirk * * **************************************************************************** */ /*****************************************************************************/







Zitieren

Lesezeichen