The program used Demo only recv and send function

Dependencies:   C12832 FXOS8700Q

Revision:
0:8b4dd5d1f1fd
diff -r 000000000000 -r 8b4dd5d1f1fd communication.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/communication.h	Mon Jun 13 13:38:33 2022 +0000
@@ -0,0 +1,473 @@
+#include "mbed.h"
+int test;
+using namespace std;
+Thread thread1;
+Thread thread2;
+Thread thread3;
+Mutex mutex;
+#define ligthmultiple 7
+int interval = 0;
+bool ack=false;
+struct ByteData{
+    uint8_t* data;
+    int length;
+    ByteData(uint8_t* Data,int Length):data(Data),length(Length){};
+    ByteData(){};
+};
+struct Datatype{    
+    char* typename4;
+    char* type2name4;
+    Datatype(char* type1,char* type2):typename4(type1),type2name4(type2){};
+    Datatype(){};
+};
+struct Datastorage{
+    uint8_t* data = new uint8_t[3];
+    bool check;
+    Datastorage(uint8_t* Data,bool Check):data(Data),check(Check){};
+    Datastorage(){};
+};
+ByteData DatatoByte(void* data, int length, int typesize, char* typename4, const char* type2name4) {
+    int a = 0;
+    int Extensionlength2 = sizeof(type2name4); // img pdf
+    uint8_t* byte = new uint8_t[length*typesize + 1 + 8 + 2];
+    switch (typesize) {
+    case 1:
+        for (; a < length; a++) {
+            byte[a] = *((uint8_t*)data + sizeof(uint8_t) * a);
+        }
+    case 2:
+        for (; a < length; a++) {
+            byte[a] = *((uint16_t*)data + sizeof(uint8_t) * a);
+            byte[a + 1] = *((uint16_t*)data + sizeof(uint8_t) * a) >> 4;
+            a++;
+        }
+    case 4:
+        for (; a < length; a++) {
+            byte[a] = *((uint32_t*)data + sizeof(uint8_t) * a);
+            byte[a + 1] = *((uint32_t*)data + sizeof(uint8_t) * a) >> 4;
+            byte[a + 2] = *((uint32_t*)data + sizeof(uint8_t) * a) >> 8;
+            byte[a + 3] = *((uint32_t*)data + sizeof(uint8_t) * a) >> 12;
+            a += 3;
+        }
+    case 8:
+        for (; a < length; a++) {
+            byte[a] = *((uint64_t*)data + sizeof(uint8_t) * a);
+            byte[a + 1] = *((uint64_t*)data + sizeof(uint8_t) * a) >> 4;
+            byte[a + 2] = *((uint64_t*)data + sizeof(uint8_t) * a) >> 8;
+            byte[a + 3] = *((uint64_t*)data + sizeof(uint8_t) * a) >> 12;
+            byte[a + 4] = *((uint64_t*)data + sizeof(uint8_t) * a) >> 16;
+            byte[a + 5] = *((uint64_t*)data + sizeof(uint8_t) * a) >> 20;
+            byte[a + 6] = *((uint64_t*)data + sizeof(uint8_t) * a) >> 24;
+            byte[a + 7] = *((uint64_t*)data + sizeof(uint8_t) * a) >> 32;
+            a += 7;
+        }
+    }
+    byte[a++] = uint8_t('.');
+    printf("%0x", uint8_t('.'));
+    for (int i = 0; a < length + 5; a++, i++) {
+        byte[a] = uint8_t((typename4[i]));
+    }
+    for (int i = 0; a < length + 9; a++, i++) {
+        byte[a] = uint8_t((type2name4[i]));
+    }
+    byte[a++] = uint8_t('.');
+    byte[a++] = uint8_t('.');
+    for (int i = 0; i < a; i++) {
+        printf("%02x = %c\n", byte[i],char(byte[i]));
+    }
+    return ByteData(byte, a);
+}
+Datatype ExtractionDatatype(uint8_t* reciveData,int datalength){
+    char *type1 = (char*)malloc(sizeof(char)*4);
+    char *type2 = (char*)malloc(sizeof(char)*4);
+    for(int i = datalength - 8,j=0; i < datalength-4;i++,j++){
+        type1[j] = reciveData[i];
+    }
+    for(int i = datalength - 4,j=0; i < datalength;i++,j++){
+        type2[j] = reciveData[i];
+    }
+    return Datatype(type1,type2);
+}
+void Sending(uint8_t Data1, uint8_t Data2, uint8_t Data3,DigitalOut D) {
+    bool* send = new bool[32];
+    uint8_t checksum = Data1 + Data2 + Data3;
+    printf("%c,%c ,%c\n",(char)Data1,(char)Data2,(char)Data3);
+    uint8_t Data[4] = { Data1, Data2, Data3, checksum};
+    printf("%s",Data);
+    for (int i = 0,j=0; i < 4; i++) {
+        send[j++] = (Data[i] & 1)/1;
+        send[j++] = (Data[i] & 2)/2;
+        send[j++] = (Data[i] & 4)/4;
+        send[j++] = (Data[i] & 8)/8;
+        send[j++] = (Data[i] & 16)/16;
+        send[j++] = (Data[i] & 32)/32;
+        send[j++] = (Data[i] & 64)/64;
+        send[j++] = (Data[i] & 128)/128;
+        /*send[j++] = (Data[i] & 128)/128;
+        send[j++] = (Data[i] & 64)/64;
+        send[j++] = (Data[i] & 32)/32;
+        send[j++] = (Data[i] & 16)/16;
+        send[j++] = (Data[i] & 8)/8;
+        send[j++] = (Data[i] & 4)/4;
+        send[j++] = (Data[i] & 2)/2;
+        send[j++] = (Data[i] & 1)/1;*/
+    }
+    printf("now really sendingready\r\n");
+    D = 1;
+    thread_sleep_for(interval*10);
+    printf("now really sending\r\n");
+    D = 0;
+    thread_sleep_for(interval);
+    for(int j = 31;j >=0;j--){
+        D = send[j];
+        thread_sleep_for(interval);
+    }
+    D = 0;
+        for(int j = 31;j >=0;j--){
+        printf("%d",send[j]);
+    }
+}
+void onoff(DigitalOut* D){
+    while(true){
+        thread_sleep_for(interval);
+        *D = 1;
+        thread_sleep_for(interval);
+        *D = 0;
+    }
+}
+void Recvack(AnalogIn* A){
+    float val[8];
+    bool test = true;
+    uint8_t result = 0;
+    while(true){
+        printf("start recvack\n\r");
+        val[0] = A->read() * ligthmultiple;
+        printf("wow\n\r");
+        for(int i = 0;i<8;i++){
+            val[i] = A->read() * ligthmultiple;
+            thread_sleep_for(interval);
+        }
+        for(int i = 0;i<8;i+=2){
+            test &= (val[i] > 0.5 )? true : false;
+            printf("%d",(bool)val[i]);
+        }
+        if(test)
+            printf("wow3\n\r");
+            return;
+        /*val[0] = (val[0] > 0.5 )? true : false;*/
+        thread_sleep_for(interval*2);    
+        /*if(true == val[0]){
+            printf("==============");
+            for(int i = 0;i<8;i++){
+                val[i] = A->read() * ligthmultiple;
+                val[i] = (val[i] > 0.5 )? true : false;
+                thread_sleep_for(interval);
+            }
+            result |= (int)val[0];
+            result |= (int)val[1]*2;
+            result |= (int)val[2]*4;
+            result |= (int)val[3]*8;
+            result |= (int)val[4]*16;
+            result |= (int)val[5]*32;
+            result |= (int)val[6]*64;
+            result |= (int)val[7]*128;
+            if(result == 0x55){
+                printf("scuuscusc");
+                ack = true;
+                printf("start recvack");
+            }
+        }*/
+    }
+}
+bool Synchronizesender(DigitalOut D,AnalogIn A){
+    thread1.start(callback(onoff, &D));
+    thread2.start(callback(Recvack, &A));
+    printf("nb");
+    thread2.join();
+    D = 0;
+    printf("hie");
+    thread1.terminate();
+    D = 0;
+    return true;
+    /*if(ack == true){
+        ack = false;
+        return true;
+    }else{
+        return false;
+    }    */
+}
+void Findclock(AnalogIn *A){
+    float val;
+    bool start;
+    bool result;
+    int Cycle;
+    int intervaltime;
+    Timer t;
+    t.reset();
+    printf("now find interval\n\r");
+    while(true){
+        val = A->read()  * ligthmultiple;
+        if(val < 0.5){
+            break;
+            }
+    }
+    while(true){
+    val = A->read()  * ligthmultiple;
+        if(val > 0.5){
+            t.start();
+            break;
+        }
+    }
+    while(true){
+        val = A->read()  * ligthmultiple;
+        if(val < 0.5){
+            t.stop();
+            interval = t.read_ms();
+            break;
+        }
+    }
+    t.reset();
+    while(true){
+        val = A->read()  * ligthmultiple;
+        if(val < 0.5){
+            break;
+        }
+    }
+    while(true){
+    val = A->read()  * ligthmultiple;
+    if(val > 0.5){
+            t.start();
+            break;
+        }
+    }
+    while(true){
+        val = A->read()  * ligthmultiple;
+        if(val < 0.5){
+            t.stop();
+            intervaltime = t.read_ms();
+            break;
+        }
+    }
+    printf("interval time = %d,%d\n\r",intervaltime,interval);
+    printf("now find interval suc\n\r");
+    if(intervaltime==interval){
+        interval = interval - (interval %10);
+        printf("return");
+    }
+    else{
+        printf("fail");
+    }
+}
+void Findlight(AnalogIn* A){
+    float val;
+    float val2;
+    while(true){
+        val = A->read()  * ligthmultiple;
+        printf("%2.2f\r\n",val);
+        if(val > 0.5){
+            break;
+        } 
+        thread_sleep_for(100);
+    }
+    /*ack=true*/ // 이거 오류나는데 왜지 ?
+    return;
+}
+void SendAck(DigitalOut *D){
+    printf("start sendack");
+    *D = 0;
+    for(int i = 0;i < 20; i++ ){
+        *D = !(*D);
+        thread_sleep_for(interval);
+    }
+}
+bool Synchronizereciver(DigitalOut D,AnalogIn A){
+    float val[8];
+    Findlight(&A);
+    printf("find!!");
+    printf("now find interval");
+    thread3.start(callback(Findclock, &A)); 
+    /*Findclock(A); //왜 안되징*/
+    thread3.join();
+    printf("error?");//여기가 왜 sendack부터 보내버리고 안에있는걸 출력할까
+    /*SendAck(D);*/
+    printf("now send ack\n\r");
+    thread3.start(callback(SendAck, &D)); 
+    thread3.join();
+    printf("send ack suc\n\r");
+    ack = false;
+    return true;
+}
+Datastorage Recieving(AnalogIn sensor) {
+    float val[32];
+    uint8_t* Data = new uint8_t[4];
+    printf("ready\r\n");
+    printf("now really ready\r\n");
+    while(true){
+        if((sensor.read() * ligthmultiple)> 0.5){
+                break;
+        }
+    }
+    while(true){
+        if((sensor.read() * ligthmultiple)< 0.5){
+                thread_sleep_for(interval*1.5);
+                break;
+        }
+    }
+    for(int i = 0;i < 32;i++){
+        val[i] = sensor.read() * ligthmultiple;
+        thread_sleep_for(interval);    
+    }
+    for(int i = 0;i < 32;i++){
+        val[i] = (val[i] > 0.5 )? true : false;
+    }
+    printf("now receive = ");
+    for(int i = 0;i < 32 ;i++){
+        printf("%d",(int)val[i]);
+    }
+    int j = 4;
+    for (; j >= 0; j--) {
+        Data[j] = 0;
+        Data[j] |= (int)val[j * 8 + 7];
+        Data[j] |= (int)val[j * 8 + 6] * 2;
+        Data[j] |= (int)val[j * 8 + 5] * 4;
+        Data[j] |= (int)val[j * 8 + 4] * 8;
+        Data[j] |= (int)val[j * 8 + 3] * 16;
+        Data[j] |= (int)val[j * 8 + 2] * 32;
+        Data[j] |= (int)val[j * 8 + 1] * 64;
+        Data[j] |= (int)val[j * 8] * 128;
+    }
+    printf("%c%c%c",(char)Data[3],(char)Data[2],(char)Data[1]);
+    printf("=%0x%0x%0x",Data[3],Data[2],Data[1]);
+    if (Data[0] == (Data[1] + Data[2] + Data[3])) {
+        //SendSucData();
+        Datastorage returnvalue;
+        returnvalue.data[0] = Data[3];
+        returnvalue.data[1] = Data[2];
+        returnvalue.data[2] = Data[1];
+        returnvalue.check = true;
+        return returnvalue;
+    }
+    else {
+        return Datastorage(Data,false);
+        //SendFailData();
+    }    
+    //32bit
+}
+void send(DigitalOut D,AnalogIn sensor){
+    interval = 100; //이거 임시
+    char* inputvalue = new char[50];
+    char* name = new char[4];
+    name = (char*)"char";
+    printf("hellow input here\n\r");
+    scanf("%s", inputvalue);
+    printf("input interval speed\n\r");
+    scanf("%d", &interval);
+    printf("success\n");
+    ByteData send = DatatoByte(inputvalue, strlen(inputvalue),sizeof(inputvalue[0]),name,"null");
+    if(!Synchronizesender(D,sensor)){
+        printf("fail sending");
+    }
+    else{
+        int nulldata = send.length%3;
+        printf("now sending\n");
+        thread_sleep_for(interval*5);
+        //scanf("%d",&test);
+        printf("........\n");
+        for(int j = 0; j < send.length;j++){
+           printf("{%d}{%c=%0x}", j,send.data[j],send.data[j]);
+        }
+        printf("........\n");
+        printf("sendlength =%d,cycle = %d",send.length,send.length/3);
+        printf("........\n");
+        int i = 0;
+        for(; i < send.length-nulldata;){
+            printf("==%c,%c,%c-cycle = %d-==",send.data[i],send.data[i+1],send.data[i+2],i);
+            Sending(send.data[i],send.data[i+1],send.data[i+2],D);
+            D = 0;
+            Recvack(&sensor);
+            D = 0;
+            if(ack == false){
+                thread_sleep_for(interval*30);
+                i+=3;
+                continue;
+            }
+            ack = false;
+            i+=3;
+        }
+        for(int j=0;j<1;){
+        switch(nulldata){
+            case 0:
+                Sending(0x00,0x00,0x00,D);   
+                //Sendcheckbit
+                break;
+            case 1:
+                i++;
+                Sending(send.data[i],0x00,0x00,D);   
+                //Sendcheckbit
+                break; 
+            case 2: 
+                i++;   
+                Sending(send.data[i],send.data[i+1],0x00,D);
+                //Sendcheckbit
+                break;
+        }
+        D = 0;
+        Recvack(&sensor);
+        D = 0;
+            if(ack == false){
+                continue;
+            }
+            ack = false;
+        }
+        printf("send suc\n");   
+    }    
+}
+void recv(DigitalOut D,AnalogIn sensor){
+uint8_t* reciveData = (uint8_t*)malloc(sizeof(uint8_t)*256);
+    Datastorage reciveData3;
+    int length;
+    printf("start\n");
+    if(Synchronizereciver(D,sensor)){
+        int i = 0;
+        printf("1now receiveing1\n");
+        thread_sleep_for(interval*7);
+        while(true){
+            printf("start recieve");
+            reciveData3 = Recieving(sensor);
+            if(!(reciveData3.check)){
+                printf("continue");
+                SendAck(&D);
+                continue;//연산으로 시간차이때문에 대기시간도 필요한데
+            }
+            else{
+                SendAck(&D);//sendfail
+            }
+            if(reciveData3.data[0] == 0x00)
+                length = i;
+                break;
+            if(reciveData3.data[1] == 0x00){
+                    reciveData[i++] = reciveData3.data[0];
+                    length = i;
+                    break;
+                }
+            if(reciveData3.data[2] == 0x00){
+                    reciveData[i++] = reciveData3.data[0];
+                    reciveData[i++] = reciveData3.data[1];
+                    length = i;
+                    break;
+                }
+            reciveData[i++] = reciveData3.data[0];
+            reciveData[i++] = reciveData3.data[1];
+            reciveData[i++] = reciveData3.data[2];
+        }
+        Datatype type = ExtractionDatatype(reciveData,length);
+        printf("suc here\n");
+        for(int i = 0;i < length-8;i++){
+            printf("%c",reciveData[i]);
+        }
+        printf("suc here\n");
+        scanf("%d",&test);
+    }else{
+        printf("fail\n");
+    }
+}
\ No newline at end of file