Aufbau von Kommunikationsstruktur



  • Hallo zusammen,

    hat jemand einen Tipp fuer mich wie ich meinen Code besser strukturieren kann?

    Ich schreibe Firmware fuer einen Microcontroller. Der Microcontroller haengt an einen RS485-Bus und reagiert auf verschiedene Nachrichten. Mein Programm ist derzeit so aufgebaut, dass in einem Interrupt ein Buffer mit den ankommenden Nachrichtbytes gefuellt wird. Wenn die Nachrichtterminierung erkannt wird, wird eine flag gesetzt, die den erhalt einer Nachricht signalisiert. Die flag wird in der main ausgewertet und ruft eine Funktion auf (und hier faengt das gemurxe an), die dann den ankommenden Buffer auswertet und darauf reagiert. Ein Beispiel koennt ihr in folgendem Codeausschnitt sehen:

    void VIRoutine(UART_driver_t* uart, bending_t** valves) {
    	uint8_t joystickDeflected = 0;
    	switch(uart->msg.msgIdentifier) {
    		case INQUIRY:
    			if(uart->msg.device == VI) {
    				respondeToInquiry(uart, valves);
    			} else if (uart->msg.device == SE) {
    				checkPowerOffCondition(uart->msg.data[USERKEYS] >> POWEROFF);
    				setVIModus(uart, valves);	
    				if((uart->msg.data[USERKEYS] >> 6) != getUnlockFreezeByMovementStatus(valves)) {
    					setUnlockFreezeByMovementStatus(valves, uart->msg.data[USERKEYS]);
    				}
    			}
    		break;
    		
    		case RESTART_PROGRAM:
    			if(uart->msg.device == VI) {
    				restartMicrocontroller(uart, valves); 
    			}
    		break;
    		
    		case READ_EEPROM:
    			if(uart->msg.device == VI) {
    				readValuesFromEEPROMAndSendToMain(uart);
    			}
    		break;
    		
    		case WRITE_EEPROM:
    			if(uart->msg.device == VI) {
    				writeValuesToEEPROM(uart);
    			}
    		break;
    		
    		case RESPONSE:
    			if(uart->msg.device == BP) {
    				joystickDeflected = joystickIsDeflected(
    					uart->msg.data[MSG_OFFSET_HORIZONTAL_JSVALUES],
    					uart->msg.data[MSG_OFFSET_VERTIKAL_JSVALUES]);
    				evaluateUserkeys(uart->msg.data[USERKEYS], valves, joystickDeflected);
    				setValvePressureOfBending(*(valves + 0), uart->msg.data[MSG_OFFSET_HORIZONTAL_JSVALUES]);
    				setValvePressureOfBending(*(valves + 1), uart->msg.data[MSG_OFFSET_VERTIKAL_JSVALUES]);
    			}
    		break;
    	}
    }
    

    Die Funktion wird dann automatisch lang und unuebersichtlich. Das moechte ich irgendwie vermeiden. Allerdings weiss ich nicht genau wie? Ich habe bereits gelesen, dass es ein factory pattern gibt, allerdings versteh ich das noch nicht richtig und haette auch keine Ahnung wie ich es in C implementieren soll. Ich koennte mir noch vorstellen, dass ich das Problem mit Funktionspointern loesen kann, allerdings bin ich mir nicht sicher, ob ich dann die Uebersichtlichkeit nicht nochmal verschlechtere.

    Des Weiteren habe ich das Problem, dass die Funktion mehr als eine Aufgabe hat, ich allerdings nicht weiss wie ich das loesen soll. Wenn ich eine Funktion schreibe, die die Nachricht auswertet, und dann flags setzt, dann habe ich gefuehlt die switch case Anweisung (und damit die laenge der Funktion) nur verschoben.

    Hat hier jemand einen Tipp fuer mich?

    Danke im voraus.


Anmelden zum Antworten