足上げセンサ八個版仮

Dependencies:   mbed

Fork of 4LegUpDown_8sense by Bチーム

Revision:
9:4b15d9a3e468
Parent:
8:36a85b66796f
Child:
10:87c6b540b3b3
--- a/main.cpp	Wed Sep 17 08:30:11 2014 +0000
+++ b/main.cpp	Fri Sep 19 05:01:36 2014 +0000
@@ -2,7 +2,17 @@
  *覚え書き
  *
  *mbedのピン配置に対するこのプログラムのピンの利用
- *p5~p12 
+ *p5  ~ p12 Motor ...BusOut     :Motor moved
+ *p13 ~ p20 Photo ...BusIn      :Photo Sensor
+ *p21 ~ p24 Pwm   ...PwmOut     :Motor Pwm Signal
+ *p25 ~ p28 Tempra...BusOut     :Motor Tempra Moved
+ *p29,p30   Sw[2] ...DigitalIn  :Swich Multi Use
+ *LED1 ~ LED4 Led ...DigitalOut :Led Brinked
+ *
+ *
+ *@file
+ *
+ *My program.
  *
  *
  *
@@ -11,25 +21,24 @@
 
 #include "mbed.h"
 
-#define MOTOR_NUM 8
-#define MOVE_TIME 0.080
-#define MOVE_DOWN_TIME 0.090
+
+#define MOTOR_NUM 8//モーター,センサーの数
+#define MOVE_TIME 0.090//足を上げる時間
+#define MOVE_DOWN_TIME 0.10//足を下げる時間
 #define TEMPRA_TIME 4.0 //ワンショットタイマー用時間設定
-#define CHECK_TIME 5.0 //時間経過でストップするタイマー用時間設定
-#define WAIT_TIME 0.010
-#define PWM_LEVEL 1.0
+#define WAIT_TIME 0.010//上げ下げの待ち時間
+#define PWM_LEVEL 1.0//モーターの回転速度のPWM
+
 
 Serial pc(USBTX,USBRX);
 
-
 BusIn Photo(p5,p6,p7,p8,p9,p10,p11,p12);
 DigitalIn Sw[2] = {p29,p30};
-DigitalIn PhotoCk[8] = {p5,p6,p7,p8,p9,p10,p11,p12};
 
 DigitalOut Led[4] = {LED1, LED2, LED3, LED4 };
 BusOut Motor(p13, p14, p15, p16, p17, p18, p19, p20 );//{left front, right front, left back ,right back }
 BusOut Tempra(p25,p26,p27,p28);
-PwmOut Pwm[4] = {p21, p22, p23, p24 }; 
+PwmOut Pwm[4] = {p21, p22, p23, p24 };
 
 Timeout StopTimer[8];
 Timeout StopTempra;
@@ -39,122 +48,103 @@
 
 
 volatile bool MotorState[4] = {0},Flag[4] = {0},FlagAdd[4] = {0},And[4] = {0},Wait[4] = {0};;
-volatile uint8_t Way = 0,UpCt = 0;
+volatile uint8_t Way = 0, DownCount = 0;
 volatile bool TempraFlag = 1;
-/*motorstate 上がっているか下がっているか
-
-+
-*/
 
 /*
 Motor = {
-          LeftFrontUp, LeftFrontDown,  
+          LeftFrontUp, LeftFrontDown,
           RightFrontUp, RightFrontDown,
-          LeftBackUp, LeftBackDown,   
-          RightBackUp, RightBackDown 
+          LeftBackUp, LeftBackDown,
+          RightBackUp, RightBackDown
           };
 */
 
 
-void WaitStop0(){//atatch Time Stop0
-//make delay time
+void WaitStop0()
+{
     Wait[0] =  0;
-    
 }
-
-void WaitStop1(){//atatch Time Stop0
-//make delay time
+void WaitStop1()
+{
     Wait[1] =  0;
-    
 }
-
-void WaitStop2(){//atatch Time Stop0
-//make delay time
+void WaitStop2()
+{
     Wait[2] =  0;
-    
 }
-
-void WaitStop3(){//atatch Time Stop0
-//make delay time
+void WaitStop3()
+{
     Wait[3] =  0;
-    
+}
+void MotorStop0()
+{
+    Motor = Motor & 0x7F;
 }
 
 
-void MotorStop0(){
-    
-    Motor = Motor & 0x7F;
-    
-}
-void MotorStop1(){
 
+void MotorStop1()
+{
     Motor = Motor & 0xBF;
-    
+    StopWait[0].attach(&WaitStop0,WAIT_TIME);
 }
-
-void MotorStop2(){
-    
+void MotorStop2()
+{
     Motor = Motor & 0xF7;
-    
 }
-void MotorStop3(){
-    
+void MotorStop3()
+{
     Motor = Motor & 0xFB;
     StopWait[1].attach(&WaitStop1,WAIT_TIME);
-
 }
-void MotorStop4(){
-    
+void MotorStop4()
+{
     Motor = Motor & 0xDF;
-
 }
-void MotorStop5(){
-
-    Motor = Motor & 0xEF; 
+void MotorStop5()
+{
+    Motor = Motor & 0xEF;
     StopWait[2].attach(&WaitStop2,WAIT_TIME);
-
 }
-void MotorStop6(){
-    
+void MotorStop6()
+{
     Motor = Motor & 0xFD;
-
 }
-void MotorStop7(){
-    
+void MotorStop7()
+{
     Motor = Motor & 0xFE;
     StopWait[3].attach(&WaitStop3,WAIT_TIME);
-    
 }
-void TempraStop(){
-    Tempra = 0x00;   
-    
+
+
+void TempraStop()
+{
+    Tempra = 0x00;
 }
-void Photo0(){//zero
-    //Wayの決定
-    if(Way == 0){
+
+void Photo0() //zero Up
+{
+    if(Way == 0) {
         Way = 1;
     }
-    
-    if((Way == 1)&&!Wait[0]){
-
-        if(!MotorState[0]){            
+    if((Way == 1)&&!Wait[0]) {
+        if(!MotorState[0]) {
             StopTimer[0].attach(&MotorStop0,MOVE_TIME);
-            Motor = Motor | 0x80;//10000000       
-            MotorState[0] = 1;     
+            Motor = Motor | 0x80;//10000000
+            MotorState[0] = 1;
             Led[0]= 1;
-        }else{
+        } else {
             Flag[0] = 1;
         }
     }
 }
-
-void Photo1(){//one
-
-    if(Way == 1){
-        
-        if(Flag[0]&&!FlagAdd[0]){
+void Photo1() //one Down
+{
+    if(Way == 1) {
+        if(Flag[0]&&!FlagAdd[0]) {
             FlagAdd[0] = 1;
-        }else if(MotorState[0]) {
+        } else if(MotorState[0]) {
             StopTimer[1].attach(&MotorStop1,MOVE_DOWN_TIME);
             Motor = Motor | 0x40;//0x40 = 01000000
             MotorState[0] = 0;
@@ -163,33 +153,28 @@
             Led[0] = 0;
             And[0] = 1;
             Wait[0] = 1;
-            
         }
     }
-
 }
-void Photo2(){//two
-    
-    if((Way == 1)&&!Wait[1]){
-        if(!MotorState[1]){
-            
+void Photo2() //two Up
+{
+    if((Way == 1)&&!Wait[1]) {
+        if(!MotorState[1]) {
             StopTimer[2].attach(&MotorStop2,MOVE_TIME);
-            Motor = Motor | 0x08;       
-            MotorState[1] = 1;     
+            Motor = Motor | 0x08;
+            MotorState[1] = 1;
             Led[1] = 1;
-        }else{
+        } else {
             Flag[1] = 1;
         }
     }
-
 }
-void Photo3(){ //three
-
-    if(Way == 1){
-        
-        if(Flag[1]&&!FlagAdd[1]){
+void Photo3()  //three Down
+{
+    if(Way == 1) {
+        if(Flag[1]&&!FlagAdd[1]) {
             FlagAdd[1] = 1;
-        }else if(MotorState[1]){
+        } else if(MotorState[1]) {
             StopTimer[3].attach(&MotorStop3,MOVE_DOWN_TIME);
             Motor = Motor | 0x04;
             MotorState[1] = 0;
@@ -199,32 +184,30 @@
             And[1] = 1;
             Wait[1] = 1;
         }
-   } 
+    }
 }
-void Photo4(){//four
-    if(Way == 0){
+void Photo4() //four Up
+{
+    if(Way == 0) {
         Way = 1;
-    }    
-
-    if((Way == 1)&&!Wait[2]){
-        if(!MotorState[2]){
+    }
+    if((Way == 1)&&!Wait[2]) {
+        if(!MotorState[2]) {
             StopTimer[4].attach(&MotorStop4,MOVE_TIME);
-            Motor = Motor | 0x20;//00100000  
-            MotorState[2] = 1;     
+            Motor = Motor | 0x20;//00100000
+            MotorState[2] = 1;
             Led[2] = 1;
-        }else{
+        } else {
             Flag[2] = 1;
         }
     }
-
 }
-void Photo5(){//five
-
-    if(Way == 1){
-        
-        if(Flag[2]&&!FlagAdd[2]){
+void Photo5() //five Down
+{
+    if(Way == 1) {
+        if(Flag[2]&&!FlagAdd[2]) {
             FlagAdd[2] = 1;
-        }else if(MotorState[2]){
+        } else if(MotorState[2]) {
             StopTimer[5].attach(&MotorStop5,MOVE_DOWN_TIME);
             Motor = Motor | 0x10;
             MotorState[2] = 0;
@@ -234,32 +217,27 @@
             And[2] = 1;
             Wait[2] = 1;
         }
-   } 
+    }
 }
-void Photo6(){//six
-    
-    
-    if((Way == 1)&&!Wait[3]){
-        if(!MotorState[3]){
+void Photo6() //six Up
+{
+    if((Way == 1)&&!Wait[3]) {
+        if(!MotorState[3]) {
             StopTimer[6].attach(&MotorStop6,MOVE_TIME);
-            Motor = Motor | 0x02;  
+            Motor = Motor | 0x02;
             MotorState[3] = 1;
-            Led[3] = 1;     
-        }else{
+            Led[3] = 1;
+        } else {
             Flag[3] = 1;
         }
     }
-
 }
-void Photo7(){//seven
-    
-    
-
-    if(Way == 1){
-        
-        if(Flag[3]&&!FlagAdd[3]){
+void Photo7() //seven Down
+{
+    if(Way == 1) {
+        if(Flag[3]&&!FlagAdd[3]) {
             FlagAdd[3] = 1;
-        }else if(MotorState[3]){
+        } else if(MotorState[3]) {
             StopTimer[7].attach(&MotorStop7,MOVE_DOWN_TIME);
             Motor = Motor | 0x01;
             MotorState[3] = 0;
@@ -269,170 +247,169 @@
             And[3] = 1;
             Wait[3] = 1;
         }
-   }             
+    }
 }
 
-void Reset(){
-    
+
+void Reset()
+{
     int i;
 
-    if(MotorState[0]){
+    if(MotorState[0]) {
         StopTimer[1].attach(&MotorStop1,MOVE_DOWN_TIME);
         Motor = Motor | 0x40;//
     }
-    if(MotorState[1]){
+    if(MotorState[1]) {
         StopTimer[3].attach(&MotorStop3,MOVE_DOWN_TIME);
         Motor = Motor | 0x04;//00000100
     }
-    if(MotorState[2]){
+    if(MotorState[2]) {
         StopTimer[5].attach(&MotorStop5,MOVE_DOWN_TIME);
         Motor = Motor | 0x10;//00010000
     }
-    if(MotorState[3]){
+    if(MotorState[3]) {
         StopTimer[7].attach(&MotorStop7,MOVE_DOWN_TIME);
-        Motor = Motor | 0x01;//00000001   
+        Motor = Motor | 0x01;//00000001
     }
-    for(i = 0; i < 4; i++){
+    for(i = 0; i < 4; i++) {
         Led[i] = 0;
-        Flag[i] = 0; 
+        Flag[i] = 0;
         FlagAdd[i] = 0;
         MotorState[i] = 0;
         And[i] = 0;
     }
-    
+
     Way = 0;
-    UpCt = 0;
+    DownCount = 0;
     TempraFlag = 1;
-    
+
+}
+
+void GainSetting ()
+{
+
+    bool CkFlag[8] = {1,1,1,1,1,1,1,1},PhotoCk[8] = {0};
+
+    Reset();
+    Tempra = 0;
+    TempraFlag = 0;
+    Led[0] = Led[1] = Led[2] = Led[3] = 1;
+
+    while(1) {
+        if(!Sw[0]) {
+            while(1) {
+                PhotoCk[0] = ((~Photo)&0x01);
+                PhotoCk[1] = ((~Photo)&0x02) >> 1;
+                PhotoCk[2] = ((~Photo)&0x04) >> 2;
+                PhotoCk[3] = ((~Photo)&0x08) >> 3;
+                if(PhotoCk[0]&&CkFlag[0]) {
+                    Led[0] = 0;
+                    CkFlag[0] = 0;
+                } else if(!PhotoCk[0]) {
+                    CkFlag[0] = 1;
+                    Led[0] = 1;
+                }
+
+                if(PhotoCk[1]&&CkFlag[1]) {
+                    Led[1] = 0;
+                    CkFlag[1] = 0;
+                } else if(!PhotoCk[1]) {
+                    CkFlag[1] = 1;
+                    Led[1] = 1;
+                }
+                if(PhotoCk[2]&&CkFlag[2]) {
+                    Led[2] = 0;
+                    CkFlag[2] = 0;
+                } else if(!PhotoCk[2]) {
+                    CkFlag[2] = 1;
+                    Led[2] = 1;
+                }
+                if(PhotoCk[3]&&CkFlag[3]) {
+                    Led[3] = 0;
+                    CkFlag[3] = 0;
+                } else if(!PhotoCk[3]) {
+                    CkFlag[3] = 1;
+                    Led[3] = 1;
+                }
+                if(!Sw[1]) break;
+            }
+        }
+
+        PhotoCk[4] = ((~Photo)&0x10) >> 4;
+        PhotoCk[5] = ((~Photo)&0x20) >> 5;
+        PhotoCk[6] = ((~Photo)&0x40) >> 6;
+        PhotoCk[7] = ((~Photo)&0x80) >> 7;
+
+        if(PhotoCk[4]&&CkFlag[4]) {
+            Led[0] = 0;
+            CkFlag[4] = 0;
+        } else if(!PhotoCk[4]) {
+            CkFlag[4] = 1;
+            Led[0] = 1;
+        }
+        if(PhotoCk[5]&&CkFlag[5]) {
+            Led[1] = 0;
+            CkFlag[5] = 0;
+        } else if(!PhotoCk[5]) {
+            CkFlag[5] = 1;
+            Led[1] = 1;
+        }
+        if(PhotoCk[6]&&CkFlag[6]) {
+            Led[2] = 0;
+            CkFlag[6] = 0;
+        } else if(!PhotoCk[6]) {
+            CkFlag[6] = 1;
+            Led[2] = 1;
+        }
+        if(PhotoCk[7]&&CkFlag[7]) {
+            Led[3] = 0;
+            CkFlag[7] = 0;
+        } else if(!PhotoCk[7]) {
+            CkFlag[7] = 1;
+            Led[3] = 1;
+        }
+
+    }
+
 }
 
 
-void CheckPhoto(){
-    
-    int i;
-    bool CkFlag[8] = {1};
-    
-    Reset();
-    Tempra = 0;
-    TempraFlag = 0;  
+void AndCount() //"Legs" Up and Down counting
+{
 
-    for (i = 0; i < 8;i++)
-        PhotoCk[i].mode(PullUp);
-    while(1){
-        if(!Sw[0]){
-            while(1){
-         
-                if(!PhotoCk[0]&&CkFlag[0]){
-                    Led[0] = 1;
-                    CkFlag[0] = 0;
-                }else if(PhotoCk[0]){
-                    CkFlag[0] = 1;
-                    Led[0] = 0;
-                }
-        
-                if(!PhotoCk[1]&&CkFlag[1]){
-                    Led[1] = 1;
-                    CkFlag[1] = 0;
-                }else if(PhotoCk[1]){
-                    CkFlag[1] = 1;
-                    Led[1] = 0;
-                }    
-                if(!PhotoCk[2]&&CkFlag[2]){
-                    Led[2] = 1;
-                    CkFlag[2] = 0;
-                }else if(PhotoCk[2]){
-                    CkFlag[2] = 1;
-                    Led[2] = 0;
-                }        
-                if(!PhotoCk[3]&&CkFlag[3]){
-                    Led[3] = 1;
-                    CkFlag[3] = 0;
-                }else if(PhotoCk[3]){
-                    CkFlag[3] = 1;
-                    Led[3] = 0;
-                }
-                if(!Sw[1]){
-                    break;    
-                }
-            }
-        }
-        if(!PhotoCk[4]&&CkFlag[4]){
-            Led[0] = 1;
-            CkFlag[4] = 0;
-        }else if(PhotoCk[4]){
-            CkFlag[4] = 1;
-            Led[0] = 0;
-        }
-        
-        if(!PhotoCk[5]&&CkFlag[5]){
-            Led[1] = 1;
-            CkFlag[5] = 0;
-        }else if(PhotoCk[5]){
-            CkFlag[5] = 1;
-            Led[1] = 0;
-        }
-        if(!PhotoCk[6]&&CkFlag[6]){
-            Led[2] = 1;
-            CkFlag[6] = 0;
-        }else if(PhotoCk[6]){
-            CkFlag[6] = 1;
-            Led[2] = 0;
-        }
-        if(!PhotoCk[7]&&CkFlag[7]){
-            Led[3] = 1;
-            CkFlag[7] = 0;
-        }else if(PhotoCk[7]){
-            CkFlag[7] = 1;
-            Led[3] = 0;
-        }
-     
-        
-        
-    }
-    
-
-
-
-}
-
-void NumCount(){//足を上げた回数を記録
-    UpCt ++;
+    DownCount ++;
     And[0] = 0 ;
     And[1] = 0 ;
     And[2] = 0 ;
     And[3] = 0 ;
-    if(UpCt > 3){
-        UpCt = 0;
+    if(DownCount > 3) {
+        DownCount = 0;
         Way = 0;
     }
 }
 
-void SetUp(){
-    //int i;   
-    
+void SetUp()
+{
+
     Pwm[0] = PWM_LEVEL ;
     Pwm[1] = PWM_LEVEL ;
     Pwm[2] = PWM_LEVEL ;
     Pwm[3] = PWM_LEVEL ;
-    //for(i = 0 ; i < MOTOR_NUM ; i++ ){
-    
     Photo.mode(PullUp);
-    
-    Sw[0].mode(PullUp);                                   
+    Sw[0].mode(PullUp);
     Sw[1].mode(PullUp);
-    //Sw.fall(Reset);
+
     TempraTimer.reset();
- 
-
 }
 
-int main() {
-    
-    SetUp();    
-    wait(0.5);  
-    uint8_t Ct = 0,nanika = 0,CkPhoto[4] = {0};
+int main()
+{
+    SetUp();
+
+    uint8_t Ct = 0,PhotoState = 0,CkPhoto[4] = {0};
     bool CkFlag[8] = {1,1,1,1,1,1,1,1};
     void (*MotorMove[8])();
+
     MotorMove[0] = Photo0;
     MotorMove[1] = Photo1;
     MotorMove[2] = Photo2;
@@ -441,104 +418,99 @@
     MotorMove[5] = Photo5;
     MotorMove[6] = Photo6;
     MotorMove[7] = Photo7;
-    
-    while(1){
-        
-        //sensorの位置と足の位置は一致するとする.
-        //順番 右足前,後ろ 左足前,後ろ の順
-        nanika = ~Photo;
-        CkPhoto[0] = nanika & 0x03;
-        CkPhoto[1] = (nanika & 0x0C) >> 2;
-        CkPhoto[2] = (nanika & 0x30) >> 4;
-        CkPhoto[3] = (nanika & 0xC0) >> 6 ;
-        
-        if(!CkPhoto[0]){
+
+    wait(0.5);
+
+
+    while(1) {
+
+        PhotoState = ~Photo;
+        CkPhoto[0] = PhotoState & 0x03;
+        CkPhoto[1] = (PhotoState & 0x0C) >> 2;
+        CkPhoto[2] = (PhotoState & 0x30) >> 4;
+        CkPhoto[3] = (PhotoState & 0xC0) >> 6 ;
+
+        if(CkPhoto[0]==0) { //@remarks 右前足
             CkFlag[0] = 1;
             CkFlag[1] = 1;
-            
-        }else{
+        } else if(CkPhoto[0]<3) {
             CkPhoto[0] -= 1;
-            if(CkFlag[CkPhoto[0]]){
-                    (*MotorMove[CkPhoto[0]])();//要確認
-                    CkFlag[CkPhoto[0]] = 0;
+            if(CkFlag[CkPhoto[0]]) {
+                (*MotorMove[CkPhoto[0]])();
+                CkFlag[CkPhoto[0]] = 0;
             }
-                
         }
-        if(!CkPhoto[1]){
+
+        if(CkPhoto[1]==0) { //@remarks 右後足
             CkFlag[2] = 1;
             CkFlag[3] = 1;
-            
-        }else{
+        } else if(CkPhoto[1]<3) {
             CkPhoto[1] += 1;
-            if(CkFlag[CkPhoto[1]]){
-                    (*MotorMove[CkPhoto[1]])();//要確認
-                    CkFlag[CkPhoto[1]] = 0;
+            if(CkFlag[CkPhoto[1]]) {
+                (*MotorMove[CkPhoto[1]])();
+                CkFlag[CkPhoto[1]] = 0;
             }
-                
         }
-        if(!CkPhoto[2]){
+
+        if(CkPhoto[2]==0) { //@remarks 左前足
             CkFlag[4] = 1;
             CkFlag[5] = 1;
-            
-        }else{
+        } else if(CkPhoto[2]<3) {
             CkPhoto[2] += 3;
-            if(CkFlag[CkPhoto[2]]){
-                    (*MotorMove[CkPhoto[2]])();//要確認
-                    CkFlag[CkPhoto[2]] = 0;
+            if(CkFlag[CkPhoto[2]]) {
+                (*MotorMove[CkPhoto[2]])();
+                CkFlag[CkPhoto[2]] = 0;
             }
-                
         }
-        if(!CkPhoto[3]){
+
+        if(CkPhoto[3]==0) { //@remarks 左後足
             CkFlag[6] = 1;
             CkFlag[7] = 1;
-            
-        }else{
+        } else if(CkPhoto[3]<3) {
             CkPhoto[3] += 5;
-            if(CkFlag[CkPhoto[3]]){
-                    (*MotorMove[CkPhoto[3]])();//要確認
-                    CkFlag[CkPhoto[3]] = 0;
-                    
+            if(CkFlag[CkPhoto[3]]) {
+                (*MotorMove[CkPhoto[3]])();
+                CkFlag[CkPhoto[3]] = 0;
             }
-                
         }
-        //Ct = Photo;
-        //pc.printf("%d\n",Ct);
-        
-        if((MotorState[0]||MotorState[1]||MotorState[2]||MotorState[3])&&TempraFlag){
+        if(And[0]&&And[1]&&And[2]&&And[3]) {
+            AndCount();
+        }
+
+        if((MotorState[0]||MotorState[1]||MotorState[2]||MotorState[3])&&TempraFlag) {
             Tempra = 0x0A;
             StopTempra.attach(&TempraStop,TEMPRA_TIME);
         }
-        
-        if(!Sw[0]&&!Sw[1]){
+
+        if(!Sw[0]&&!Sw[1]) {
             Ct = 0;
-            while(!Sw[0]&&!Sw[1]&&(Ct <= 100)){
+            while(!Sw[0]&&!Sw[1]&&(Ct <= 100)) {
                 Ct++;
             }
-            if(Ct >= 100){
-                CheckPhoto();   
+            if(Ct >= 100) {
+                GainSetting();
             }
-        }else if(!Sw[0]){
+
+        } else if(!Sw[0]) {
             Ct = 0;
-            while(!Sw[0]&&(Ct <= 100)){
+            while(!Sw[0]&&(Ct <= 100)) {
                 Ct ++;
                 //printf("%d\n",Ct);
             }
-            if(Ct >= 100){
-                Reset();   
+            if(Ct >= 100) {
+                Reset();
             }
-        }else if(!Sw[1]){
+
+        } else if(!Sw[1]) {
             Ct = 0;
-            while(!Sw[1]&&(Ct <= 100)){
+            while(!Sw[1]&&(Ct <= 100)) {
                 Ct ++;
                 //printf("%d\n",Ct);
             }
-            if(Ct >= 100){
+            if(Ct >= 100) {
                 Tempra = 0;
-                TempraFlag = 0;  
+                TempraFlag = 0;
             }
         }
-        if(And[0]&&And[1]&&And[2]&&And[3]){
-            NumCount();
-        }
     }
 }
\ No newline at end of file