Changeset 15 in flair-src for trunk/lib/FlairSensorActuator/src/Bldc_impl.cpp
- Timestamp:
- 04/08/16 15:40:57 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/FlairSensorActuator/src/Bldc_impl.cpp
r3 r15 35 35 using namespace flair::actuator; 36 36 37 Bldc_impl::Bldc_impl(Bldc* self,Layout* layout,string name,uint8_t motors_count) { 38 this->self=self; 39 this->motors_count=motors_count; 40 this->layout=layout; 41 are_enabled=false; 42 is_running=false; 43 tested_motor=-1; 44 45 values=(float*)malloc(motors_count*sizeof(float)); 46 power=(float*)malloc(motors_count*sizeof(float)); 47 for(int i=0;i<motors_count;i++) power[i]=1; 48 49 //station sol 50 GroupBox* groupbox=new GroupBox(layout->NewRow(),"bldc"); 51 flight_time=new Label(groupbox->NewRow(),"flight time"); 52 min_value=new DoubleSpinBox(groupbox->NewRow(),"min value:",0,1,.1,2); 53 max_value=new DoubleSpinBox(groupbox->LastRowLastCol(),"max value:",0,1,.1,2); 54 test_value=new DoubleSpinBox(groupbox->LastRowLastCol(),"test value:",0,1,0.1); 55 56 int index=0; 57 button_test=(PushButton**)malloc(motors_count*sizeof(PushButton*)); 58 for(int i=0;i<motors_count/2;i++) { 59 for(int j=0;j<2;j++) { 60 ostringstream test_name; 61 test_name << "test motor " << index; 62 button_test[index]=new PushButton(groupbox->At(2+i,j),test_name.str()); 63 index++; 64 } 65 } 66 67 //flight time 68 FILE *file; 69 file=fopen("/etc/flight_time","r"); 37 Bldc_impl::Bldc_impl(Bldc *self, Layout *layout, string name, 38 uint8_t motors_count) { 39 this->self = self; 40 this->motors_count = motors_count; 41 this->layout = layout; 42 are_enabled = false; 43 is_running = false; 44 tested_motor = -1; 45 46 values = (float *)malloc(motors_count * sizeof(float)); 47 power = (float *)malloc(motors_count * sizeof(float)); 48 for (int i = 0; i < motors_count; i++) 49 power[i] = 1; 50 51 // station sol 52 GroupBox *groupbox = new GroupBox(layout->NewRow(), "bldc"); 53 flight_time = new Label(groupbox->NewRow(), "flight time"); 54 min_value = new DoubleSpinBox(groupbox->NewRow(), "min value:", 0, 1, .1, 2); 55 max_value = 56 new DoubleSpinBox(groupbox->LastRowLastCol(), "max value:", 0, 1, .1, 2); 57 test_value = 58 new DoubleSpinBox(groupbox->LastRowLastCol(), "test value:", 0, 1, 0.1); 59 60 int index = 0; 61 button_test = (PushButton **)malloc(motors_count * sizeof(PushButton *)); 62 for (int i = 0; i < motors_count / 2; i++) { 63 for (int j = 0; j < 2; j++) { 64 ostringstream test_name; 65 test_name << "test motor " << index; 66 button_test[index] = 67 new PushButton(groupbox->At(2 + i, j), test_name.str()); 68 index++; 69 } 70 } 71 72 // flight time 73 FILE *file; 74 file = fopen("/etc/flight_time", "r"); 75 if (file == NULL) { 76 time_sec = 0; 77 } else { 78 char ligne[32]; 79 fgets(ligne, 32, file); 80 time_sec = atoi(ligne); 81 fclose(file); 82 } 83 flight_time->SetText("total flight time: %is = %imin = %ih\n", time_sec, 84 time_sec / 60, time_sec / 3600); 85 } 86 87 Bldc_impl::Bldc_impl(Bldc *self, uint8_t motors_count) { 88 this->self = self; 89 this->motors_count = motors_count; 90 values = NULL; 91 button_test = NULL; 92 power = NULL; 93 } 94 95 Bldc_impl::~Bldc_impl() { 96 if (values != NULL) 97 free(values); 98 if (button_test != NULL) 99 free(button_test); 100 if (power != NULL) 101 free(power); 102 } 103 104 void Bldc_impl::UseDefaultPlot(TabWidget *tab) { 105 Tab *plot_tab = new Tab(tab, "speeds"); 106 plots = new DataPlot1D(plot_tab->NewRow(), "values", 0, 1); 107 for (int i = 0; i < motors_count; i++) { 108 plots->AddCurve(self->output->Element(i)); 109 } 110 } 111 112 void Bldc_impl::UpdateFrom(const io_data *data) { 113 cvmatrix *input = (cvmatrix *)data; 114 bool is_motor_running = false; 115 116 if (values == NULL) 117 return; // nothing to do in simulator 118 119 if (input->Rows() != motors_count) { 120 self->Err("nb motors mismatch\n"); 121 return; 122 } 123 124 input->GetMutex(); 125 for (int i = 0; i < motors_count; i++) { 126 if (input->ValueNoMutex(i, 0) != 0) 127 is_motor_running = true; 128 if (are_enabled) { 129 // Printf("%i %f %f\n",i,input->ValueNoMutex(i,0),power[i]); 130 values[i] = power[i] * Sat(input->ValueNoMutex(i, 0)); 131 // Printf("%i %f\n",i,values[i]); 132 } else { 133 values[i] = 0; 134 } 135 } 136 input->ReleaseMutex(); 137 138 if (are_enabled && is_motor_running && !is_running) { 139 flight_start_time = GetTime(); 140 is_running = true; 141 } 142 if ((!are_enabled || !is_motor_running) && is_running) { 143 Time now = GetTime(); 144 int t_sec; 145 FILE *file; 146 char ligne[32]; 147 148 t_sec = (now - flight_start_time) / 1000000000; 149 time_sec += t_sec; 150 151 Printf("temps de vol: %is = %imin\n", t_sec, t_sec / 60); 152 // Printf("temps de vol total: %is = %imin = 153 // %ih\n",time_sec,time_sec/60,time_sec/3600); 154 flight_time->SetText("total flight time: %is = %imin = %ih\n", time_sec, 155 time_sec / 60, time_sec / 3600); 156 157 file = fopen("/etc/flight_time", "w"); 70 158 if (file == NULL) { 71 time_sec=0;159 Printf("Erreur a l'ouverture du fichier d'info vol\n"); 72 160 } else { 73 char ligne[32]; 74 fgets(ligne, 32, file); 75 time_sec=atoi(ligne); 76 fclose(file); 77 } 78 flight_time->SetText("total flight time: %is = %imin = %ih\n",time_sec,time_sec/60,time_sec/3600); 79 } 80 81 Bldc_impl::Bldc_impl(Bldc* self,uint8_t motors_count) { 82 this->self=self; 83 this->motors_count=motors_count; 84 values=NULL; 85 button_test=NULL; 86 power=NULL; 87 } 88 89 Bldc_impl::~Bldc_impl() { 90 if(values!=NULL) free(values); 91 if(button_test!=NULL) free(button_test); 92 if(power!=NULL) free(power); 93 } 94 95 void Bldc_impl::UseDefaultPlot(TabWidget* tab) { 96 Tab* plot_tab=new Tab(tab,"speeds"); 97 plots=new DataPlot1D(plot_tab->NewRow(),"values",0,1); 98 for(int i=0;i<motors_count;i++) { 99 plots->AddCurve(self->output->Element(i)); 100 } 101 } 102 103 void Bldc_impl::UpdateFrom(const io_data *data) { 104 cvmatrix* input=(cvmatrix*)data; 105 bool is_motor_running=false; 106 107 if(values==NULL) return;//nothing to do in simulator 108 109 if(input->Rows()!=motors_count) { 110 self->Err("nb motors mismatch\n"); 111 return; 112 } 113 114 input->GetMutex(); 115 for(int i=0;i<motors_count;i++) { 116 if(input->ValueNoMutex(i,0)!=0) is_motor_running=true; 117 if(are_enabled) { 118 //Printf("%i %f %f\n",i,input->ValueNoMutex(i,0),power[i]); 119 values[i]=power[i]*Sat(input->ValueNoMutex(i,0)); 120 //Printf("%i %f\n",i,values[i]); 121 } else { 122 values[i]=0; 123 } 124 } 125 input->ReleaseMutex(); 126 127 if(are_enabled && is_motor_running && !is_running) { 128 flight_start_time = GetTime(); 129 is_running=true; 130 } 131 if((!are_enabled || !is_motor_running) && is_running) { 132 Time now= GetTime(); 133 int t_sec; 134 FILE *file; 135 char ligne[32]; 136 137 t_sec=(now - flight_start_time)/1000000000; 138 time_sec+=t_sec; 139 140 Printf("temps de vol: %is = %imin\n",t_sec,t_sec/60); 141 //Printf("temps de vol total: %is = %imin = %ih\n",time_sec,time_sec/60,time_sec/3600); 142 flight_time->SetText("total flight time: %is = %imin = %ih\n",time_sec,time_sec/60,time_sec/3600); 143 144 file=fopen("/etc/flight_time","w"); 145 if (file == NULL) { 146 Printf("Erreur a l'ouverture du fichier d'info vol\n"); 147 } else { 148 sprintf(ligne,"%i",time_sec); 149 fputs(ligne,file); 150 fclose(file); 151 } 152 is_running=false; 153 } 154 155 for(int i=0;i<motors_count;i++) { 156 if(button_test[i]->Clicked()==true) { 157 if(!are_enabled) { 158 tested_motor=i; 159 test_start_time=GetTime(); 160 LockUserInterface(); 161 } else { 162 self->Warn("testing motor is not possible when enabled\n"); 163 } 164 } 165 } 166 if(tested_motor!=-1) { 167 for(int i=0;i<motors_count;i++) { 168 values[i]=0; 169 } 170 values[tested_motor]=test_value->Value(); 171 172 if(GetTime()>(test_start_time+2*1000000000)) { 173 tested_motor=-1; 174 UnlockUserInterface(); 175 } 176 } 177 178 self->SetMotors(values); 179 self->output->SetDataTime(data->DataTime()); 180 self->ProcessUpdate(self->output); 161 sprintf(ligne, "%i", time_sec); 162 fputs(ligne, file); 163 fclose(file); 164 } 165 is_running = false; 166 } 167 168 for (int i = 0; i < motors_count; i++) { 169 if (button_test[i]->Clicked() == true) { 170 if (!are_enabled) { 171 tested_motor = i; 172 test_start_time = GetTime(); 173 LockUserInterface(); 174 } else { 175 self->Warn("testing motor is not possible when enabled\n"); 176 } 177 } 178 } 179 if (tested_motor != -1) { 180 for (int i = 0; i < motors_count; i++) { 181 values[i] = 0; 182 } 183 values[tested_motor] = test_value->Value(); 184 185 if (GetTime() > (test_start_time + 2 * 1000000000)) { 186 tested_motor = -1; 187 UnlockUserInterface(); 188 } 189 } 190 191 self->SetMotors(values); 192 self->output->SetDataTime(data->DataTime()); 193 self->ProcessUpdate(self->output); 181 194 } 182 195 183 196 float Bldc_impl::Sat(float value) { 184 float result=value; 185 186 if(result<min_value->Value()) { 187 result=min_value->Value(); 188 } 189 if(result>max_value->Value()) { 190 result=max_value->Value(); 191 } 192 193 return result; 194 } 195 196 void Bldc_impl::LockUserInterface(void) const { 197 layout->setEnabled(false); 198 } 199 200 void Bldc_impl::UnlockUserInterface(void) const { 201 layout->setEnabled(true); 202 } 197 float result = value; 198 199 if (result < min_value->Value()) { 200 result = min_value->Value(); 201 } 202 if (result > max_value->Value()) { 203 result = max_value->Value(); 204 } 205 206 return result; 207 } 208 209 void Bldc_impl::LockUserInterface(void) const { layout->setEnabled(false); } 210 211 void Bldc_impl::UnlockUserInterface(void) const { layout->setEnabled(true); }
Note:
See TracChangeset
for help on using the changeset viewer.