diff dspad.c @ 0:e70ea46d6073

Initial import from http://wouhanegaine.free.fr/dev/DSPad02b_neo07.zip
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 22 Feb 2015 01:38:06 +0100
parents
children f362b20de51e
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/dspad.c
@@ -0,0 +1,138 @@
+/*
+    DSPad
+    Convert Nintendo DS keypress into joystick events
+*/
+
+#define __MAIN_FILE__
+
+#include "ds.h"
+#include "uinput.h"
+#include "service.h" 
+#include "restartOp.h"
+#include "XML.h"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+
+
+#define DEFAULT_PATH "~/DSPad_server.xml"
+
+
+/*
+    Process xml atoms
+*/
+int dspad_process_xml(void* elem, char* tag, char* content){
+
+    (void)elem;
+
+    if(tag != NULL && content != NULL){
+        if(strcmp(content, "")){
+        
+            /* process atom: */
+            if(!strcmp(tag, "base_port")){
+                base_port = atoi(content);
+                return 1;
+            }
+            
+            else if(!strcmp(tag, "uinput_dev")){
+                if(uinput_dev != NULL) free(uinput_dev);
+                uinput_dev = (char*)malloc(strlen(content)+1);
+                strcpy(uinput_dev, content);
+                return 1;
+            }
+
+            else if(!strcmp(tag, "nb_pad")){
+                nbdev = atoi(content);
+                return 1;
+            }
+    
+            return ReadXML(elem, dspad_process_xml, content);
+        }
+    }
+    
+    /* Should not happend... (compiler warning) */
+    return 0;
+}
+
+
+
+/*
+    Read config file
+    returns 1 OK
+            0 error
+*/
+int config_read(char* path){
+    int ok = 0;
+    char* text = NULL;
+    
+    text = LoadFile(path);
+    if(text){
+        ok = ReadXML(NULL, dspad_process_xml, text);
+        free(text);
+        if(ok){
+            fprintf(stderr, "Reading \"%s\" OK\n", path);
+        }
+        else{
+            fprintf(stderr, "Reading \"%s\" FAILED\n", path);
+        }
+    }
+    return ok;
+}
+
+
+
+
+int main(int argc, char** argv){
+    /* -- gcc -Werror satisfaction... -- */
+    (void)argc;
+    (void)argv;
+    /* --------------------------------- */
+    
+    curdev = 0;
+
+    fprintf(stdout, "\n--- Starting DSPad Server v0.2 ---\n");
+    
+    pid_t pid = 0;
+    
+    if(argc == 3 && !strcmp("-f", argv[1])){
+        fprintf(stderr, "Loading \"%s\"\n", argv[2]);
+        config_read(argv[2]);
+    }
+    else{
+        fprintf(stderr, "Loading \"%s\"\n", DEFAULT_PATH);
+        config_read(DEFAULT_PATH);
+    }
+    
+        
+    
+    /* fork servers */
+    while(curdev < nbdev){
+        pid = fork_rs();
+        switch(pid){
+            case 0:
+                curdev++;
+                // Wait 2 seconds before next because
+                // of kernel dev creation latency
+                sleep_rs(2);
+                break;
+            case -1:
+                fprintf(stderr, " [%d] Creation of service: failed\n", curdev);
+                exit(EXIT_FAILURE);
+                break;
+            default:
+                start_service();
+                sleep(5);
+                fprintf(stdout, " [%d] Service finished\n", curdev);
+                waitpid(-1, NULL, 0);
+                exit(EXIT_SUCCESS);
+                break;
+        } /* switch */
+    }    
+    
+    return 0;
+}
+