Working, Clean

Dependents:   ShowItv2 ShowIt_robot_control

Fork of SignalNumber by Dustin Berendsen

Committer:
peterknoben
Date:
Wed Nov 01 22:23:10 2017 +0000
Revision:
4:a79f9f3a9e40
Parent:
3:f8d57796d69b
Child:
5:f3ddc3a7b292
working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
peterknoben 0:5f8dee4d4b09 1 #include "signalnumber.h"
peterknoben 0:5f8dee4d4b09 2 #include "mbed.h"
peterknoben 0:5f8dee4d4b09 3
peterknoben 0:5f8dee4d4b09 4
peterknoben 0:5f8dee4d4b09 5 //Constants for mean value
peterknoben 4:a79f9f3a9e40 6 const int n = 1500; //Window size for the mean value
peterknoben 4:a79f9f3a9e40 7 float emg0_filtered[n] = {}, emg2_filtered[n] = {}, emg4_filtered[n]={};
peterknoben 4:a79f9f3a9e40 8 int count1 = 0, count2 = 0, count3 = 0;
peterknoben 4:a79f9f3a9e40 9 int countx = 0, county = 0.0, countz = 0.0;
peterknoben 4:a79f9f3a9e40 10 float meanL = 0.0, meanR = 0.0, meanM = 0.0;
peterknoben 0:5f8dee4d4b09 11 float sum = 0.0;
peterknoben 0:5f8dee4d4b09 12
peterknoben 0:5f8dee4d4b09 13
peterknoben 0:5f8dee4d4b09 14 //Constants EMG switch
peterknoben 4:a79f9f3a9e40 15 const float LeftMin = 0.20;
peterknoben 4:a79f9f3a9e40 16 const float LeftMax = 0.50;
peterknoben 4:a79f9f3a9e40 17 /*
peterknoben 4:a79f9f3a9e40 18
peterknoben 4:a79f9f3a9e40 19
peterknoben 0:5f8dee4d4b09 20 const float LeftFastmin=0.075;
peterknoben 0:5f8dee4d4b09 21 const float LeftFastmax=0.15;
peterknoben 0:5f8dee4d4b09 22 const float LeftSlowmin=0.2;
peterknoben 0:5f8dee4d4b09 23 const float LeftSlowmax=0.35;
peterknoben 0:5f8dee4d4b09 24 const float RightSlowmin=0.4;
peterknoben 0:5f8dee4d4b09 25 const float RightSlowmax=0.65;
peterknoben 0:5f8dee4d4b09 26 const float RightFastmin=0.7;
peterknoben 4:a79f9f3a9e40 27 const float RightFastmax=10.5;*/
peterknoben 4:a79f9f3a9e40 28 int NumberL = 0, NumberR =0;
peterknoben 0:5f8dee4d4b09 29 //const int action =50;
peterknoben 0:5f8dee4d4b09 30
peterknoben 0:5f8dee4d4b09 31
peterknoben 0:5f8dee4d4b09 32 SignalNumber::SignalNumber(void)
peterknoben 0:5f8dee4d4b09 33 {
peterknoben 0:5f8dee4d4b09 34
peterknoben 0:5f8dee4d4b09 35 }
peterknoben 0:5f8dee4d4b09 36
peterknoben 0:5f8dee4d4b09 37
peterknoben 4:a79f9f3a9e40 38 /*
peterknoben 0:5f8dee4d4b09 39 // Determine the mean value of the last "n" amount of numbers.
peterknoben 0:5f8dee4d4b09 40 float SignalNumber::getmean(const int n, float input){
peterknoben 2:1a677b57ce81 41 emg_filtered[count] = input;
peterknoben 0:5f8dee4d4b09 42 count++;
peterknoben 0:5f8dee4d4b09 43 if (count == n){
peterknoben 0:5f8dee4d4b09 44 count = 0;
peterknoben 0:5f8dee4d4b09 45 }
peterknoben 4:a79f9f3a9e40 46 float sum_math = 0.0;
peterknoben 4:a79f9f3a9e40 47 for (int m=0 ; m<n ; m++ ){
peterknoben 4:a79f9f3a9e40 48 sum_math = sum_math + emg_filtered[m];
peterknoben 4:a79f9f3a9e40 49 }
peterknoben 4:a79f9f3a9e40 50 float mean_math = sum_math/n;
peterknoben 4:a79f9f3a9e40 51 return mean_math;
peterknoben 4:a79f9f3a9e40 52 }*/
peterknoben 4:a79f9f3a9e40 53
peterknoben 4:a79f9f3a9e40 54
peterknoben 4:a79f9f3a9e40 55 float SignalNumber::getmeanLeft(const int n, float input){
peterknoben 4:a79f9f3a9e40 56 emg0_filtered[count1] = input;
peterknoben 4:a79f9f3a9e40 57 count1++;
peterknoben 4:a79f9f3a9e40 58 if (count1 == n){
peterknoben 4:a79f9f3a9e40 59 count1 = 0;
peterknoben 4:a79f9f3a9e40 60 }
peterknoben 4:a79f9f3a9e40 61 float sum_math = 0.0;
peterknoben 4:a79f9f3a9e40 62 for (int m=0 ; m<n ; m++ ){
peterknoben 4:a79f9f3a9e40 63 sum_math = sum_math + emg0_filtered[m];
peterknoben 4:a79f9f3a9e40 64 }
peterknoben 4:a79f9f3a9e40 65 float mean_math = sum_math/n;
peterknoben 4:a79f9f3a9e40 66 return mean_math;
peterknoben 4:a79f9f3a9e40 67 }
peterknoben 4:a79f9f3a9e40 68 float SignalNumber::getmeanRight(const int n, float input){
peterknoben 4:a79f9f3a9e40 69 emg2_filtered[count2] = input;
peterknoben 4:a79f9f3a9e40 70 count2++;
peterknoben 4:a79f9f3a9e40 71 if (count2 == n){
peterknoben 4:a79f9f3a9e40 72 count2 = 0;
peterknoben 4:a79f9f3a9e40 73 }
peterknoben 4:a79f9f3a9e40 74 float sum_math = 0.0;
peterknoben 4:a79f9f3a9e40 75 for (int m=0 ; m<n ; m++ ){
peterknoben 4:a79f9f3a9e40 76 sum_math = sum_math + emg2_filtered[m];
peterknoben 4:a79f9f3a9e40 77 }
peterknoben 4:a79f9f3a9e40 78 float mean_math = sum_math/n;
peterknoben 4:a79f9f3a9e40 79 return mean_math;
peterknoben 4:a79f9f3a9e40 80 }
peterknoben 4:a79f9f3a9e40 81 float SignalNumber::getmeanMode(const int n, float input){
peterknoben 4:a79f9f3a9e40 82 emg4_filtered[count3] = input;
peterknoben 4:a79f9f3a9e40 83 count3++;
peterknoben 4:a79f9f3a9e40 84 if (count3 == n){
peterknoben 4:a79f9f3a9e40 85 count3 = 0;
peterknoben 4:a79f9f3a9e40 86 }
peterknoben 4:a79f9f3a9e40 87 float sum_math = 0.0;
peterknoben 4:a79f9f3a9e40 88 for (int m=0 ; m<n ; m++ ){
peterknoben 4:a79f9f3a9e40 89 sum_math = sum_math + emg4_filtered[m];
peterknoben 4:a79f9f3a9e40 90 }
peterknoben 4:a79f9f3a9e40 91 float mean_math = sum_math/n;
peterknoben 0:5f8dee4d4b09 92 return mean_math;
peterknoben 0:5f8dee4d4b09 93 }
peterknoben 0:5f8dee4d4b09 94 float SignalNumber::calibrate(const int n, float input){
peterknoben 4:a79f9f3a9e40 95 float offset = getmeanLeft(n, input);
peterknoben 0:5f8dee4d4b09 96 return offset;
peterknoben 0:5f8dee4d4b09 97 }
peterknoben 0:5f8dee4d4b09 98
peterknoben 4:a79f9f3a9e40 99
peterknoben 4:a79f9f3a9e40 100
peterknoben 4:a79f9f3a9e40 101
peterknoben 4:a79f9f3a9e40 102
peterknoben 4:a79f9f3a9e40 103 int SignalNumber::getnumberLeft(const int n, const int action, float input){
peterknoben 4:a79f9f3a9e40 104 meanL= getmeanLeft(n, input);
peterknoben 4:a79f9f3a9e40 105 //Check first case
peterknoben 4:a79f9f3a9e40 106 if( meanL< LeftMin ) {
peterknoben 4:a79f9f3a9e40 107 if (county <action){
peterknoben 4:a79f9f3a9e40 108 meanL= getmeanLeft(n, input);
peterknoben 4:a79f9f3a9e40 109 if(meanL< LeftMin){
peterknoben 4:a79f9f3a9e40 110 county++;
peterknoben 4:a79f9f3a9e40 111 }
peterknoben 4:a79f9f3a9e40 112 else{
peterknoben 4:a79f9f3a9e40 113 county=0;
peterknoben 4:a79f9f3a9e40 114 NumberL=0;
peterknoben 4:a79f9f3a9e40 115 }
peterknoben 4:a79f9f3a9e40 116 }
peterknoben 4:a79f9f3a9e40 117 else{
peterknoben 4:a79f9f3a9e40 118 NumberL = 0;
peterknoben 4:a79f9f3a9e40 119 county=0;
peterknoben 4:a79f9f3a9e40 120 }
peterknoben 4:a79f9f3a9e40 121 }
peterknoben 4:a79f9f3a9e40 122 //Check second case
peterknoben 4:a79f9f3a9e40 123 else if(meanL >= LeftMin and meanL < LeftMax){
peterknoben 4:a79f9f3a9e40 124 if (county <action){
peterknoben 4:a79f9f3a9e40 125 meanL= getmeanLeft(n, input);
peterknoben 4:a79f9f3a9e40 126 if(meanL >= LeftMin and meanL < LeftMax){
peterknoben 4:a79f9f3a9e40 127 county++;
peterknoben 4:a79f9f3a9e40 128 }
peterknoben 4:a79f9f3a9e40 129 else{
peterknoben 4:a79f9f3a9e40 130 county=0;
peterknoben 4:a79f9f3a9e40 131 NumberL=0;
peterknoben 4:a79f9f3a9e40 132 }
peterknoben 4:a79f9f3a9e40 133 }
peterknoben 4:a79f9f3a9e40 134 else{
peterknoben 4:a79f9f3a9e40 135 NumberL = 1;
peterknoben 4:a79f9f3a9e40 136 county=0;
peterknoben 4:a79f9f3a9e40 137 }
peterknoben 4:a79f9f3a9e40 138 }
peterknoben 4:a79f9f3a9e40 139 else if( meanL>=LeftMax) {
peterknoben 4:a79f9f3a9e40 140 if (county <action){
peterknoben 4:a79f9f3a9e40 141 meanL= getmeanLeft(n, input);
peterknoben 4:a79f9f3a9e40 142 if(meanL>=LeftMax){
peterknoben 4:a79f9f3a9e40 143 county++;
peterknoben 4:a79f9f3a9e40 144 }
peterknoben 4:a79f9f3a9e40 145 else{
peterknoben 4:a79f9f3a9e40 146 county=0;
peterknoben 4:a79f9f3a9e40 147 NumberL=0;
peterknoben 4:a79f9f3a9e40 148 }
peterknoben 4:a79f9f3a9e40 149 }
peterknoben 4:a79f9f3a9e40 150 else{
peterknoben 4:a79f9f3a9e40 151 NumberL = 2;
peterknoben 4:a79f9f3a9e40 152 county=0;
peterknoben 4:a79f9f3a9e40 153 }
peterknoben 4:a79f9f3a9e40 154 }
peterknoben 4:a79f9f3a9e40 155 else{
peterknoben 4:a79f9f3a9e40 156 county=0;
peterknoben 4:a79f9f3a9e40 157 NumberL =0;
peterknoben 4:a79f9f3a9e40 158 }
peterknoben 4:a79f9f3a9e40 159 return NumberL;
peterknoben 4:a79f9f3a9e40 160 }
peterknoben 4:a79f9f3a9e40 161
peterknoben 4:a79f9f3a9e40 162 int SignalNumber::getnumberRight(const int n, const int action, float input){
peterknoben 4:a79f9f3a9e40 163 meanR= getmeanRight(n, input);
peterknoben 4:a79f9f3a9e40 164 //Check first case
peterknoben 4:a79f9f3a9e40 165 if( meanR< LeftMin ) {
peterknoben 4:a79f9f3a9e40 166 if (countx <action){
peterknoben 4:a79f9f3a9e40 167 meanR= getmeanRight(n, input);
peterknoben 4:a79f9f3a9e40 168 if(meanR< LeftMin){
peterknoben 4:a79f9f3a9e40 169 countx++;
peterknoben 4:a79f9f3a9e40 170 }
peterknoben 4:a79f9f3a9e40 171 else{
peterknoben 4:a79f9f3a9e40 172 countx=0;
peterknoben 4:a79f9f3a9e40 173 NumberR=0;
peterknoben 4:a79f9f3a9e40 174 }
peterknoben 4:a79f9f3a9e40 175 }
peterknoben 4:a79f9f3a9e40 176 else{
peterknoben 4:a79f9f3a9e40 177 NumberR = 0;
peterknoben 4:a79f9f3a9e40 178 countx=0;
peterknoben 4:a79f9f3a9e40 179 }
peterknoben 4:a79f9f3a9e40 180 }
peterknoben 4:a79f9f3a9e40 181 //Check second case
peterknoben 4:a79f9f3a9e40 182 else if(meanR >= LeftMin and meanR < LeftMax){
peterknoben 4:a79f9f3a9e40 183 if (countx <action){
peterknoben 4:a79f9f3a9e40 184 meanR= getmeanRight(n, input);
peterknoben 4:a79f9f3a9e40 185 if(meanR >= LeftMin and meanR < LeftMax){
peterknoben 4:a79f9f3a9e40 186 countx++;
peterknoben 4:a79f9f3a9e40 187 }
peterknoben 4:a79f9f3a9e40 188 else{
peterknoben 4:a79f9f3a9e40 189 countx=0;
peterknoben 4:a79f9f3a9e40 190 NumberR=0;
peterknoben 4:a79f9f3a9e40 191 }
peterknoben 4:a79f9f3a9e40 192 }
peterknoben 4:a79f9f3a9e40 193 else{
peterknoben 4:a79f9f3a9e40 194 NumberR = 1;
peterknoben 4:a79f9f3a9e40 195 countx=0;
peterknoben 4:a79f9f3a9e40 196 }
peterknoben 4:a79f9f3a9e40 197 }
peterknoben 4:a79f9f3a9e40 198 else if( meanR >=LeftMax ) {
peterknoben 4:a79f9f3a9e40 199 if (countx <action){
peterknoben 4:a79f9f3a9e40 200 meanR= getmeanRight(n, input);
peterknoben 4:a79f9f3a9e40 201 if( meanR >=LeftMax ){
peterknoben 4:a79f9f3a9e40 202 countx++;
peterknoben 4:a79f9f3a9e40 203 }
peterknoben 4:a79f9f3a9e40 204 else{
peterknoben 4:a79f9f3a9e40 205 countx=0;
peterknoben 4:a79f9f3a9e40 206 NumberR=0;
peterknoben 4:a79f9f3a9e40 207 }
peterknoben 4:a79f9f3a9e40 208 }
peterknoben 4:a79f9f3a9e40 209 else{
peterknoben 4:a79f9f3a9e40 210 NumberR = 2;
peterknoben 4:a79f9f3a9e40 211 countx=0;
peterknoben 4:a79f9f3a9e40 212 }
peterknoben 4:a79f9f3a9e40 213 }
peterknoben 4:a79f9f3a9e40 214 else{
peterknoben 4:a79f9f3a9e40 215 countx=0;
peterknoben 4:a79f9f3a9e40 216 NumberR =0;
peterknoben 4:a79f9f3a9e40 217 }
peterknoben 4:a79f9f3a9e40 218 return NumberR;
peterknoben 4:a79f9f3a9e40 219 }
peterknoben 4:a79f9f3a9e40 220
peterknoben 4:a79f9f3a9e40 221
peterknoben 4:a79f9f3a9e40 222
peterknoben 4:a79f9f3a9e40 223
peterknoben 4:a79f9f3a9e40 224
peterknoben 4:a79f9f3a9e40 225
peterknoben 4:a79f9f3a9e40 226
peterknoben 4:a79f9f3a9e40 227
peterknoben 4:a79f9f3a9e40 228
peterknoben 4:a79f9f3a9e40 229
peterknoben 0:5f8dee4d4b09 230 //Determine the right signal number
peterknoben 0:5f8dee4d4b09 231 /*
peterknoben 0:5f8dee4d4b09 232 There will be checked in which range the mean value lies. If the value lies
peterknoben 0:5f8dee4d4b09 233 within this range for "action" samples the switch will be changed to the right
peterknoben 0:5f8dee4d4b09 234 mode. If the mean value changes outside of the region the switch will be set to
peterknoben 0:5f8dee4d4b09 235 0, this is the resting state. Also the counter will be reset.
peterknoben 2:1a677b57ce81 236 n is the amount of samples in the window
peterknoben 2:1a677b57ce81 237 action is the amount of same mean values
peterknoben 0:5f8dee4d4b09 238 */
peterknoben 4:a79f9f3a9e40 239 /*int SignalNumber::getnumber(const int n, const int action, float input){
peterknoben 3:f8d57796d69b 240 mean = getmean(n, input);
peterknoben 0:5f8dee4d4b09 241 //Check first case
peterknoben 0:5f8dee4d4b09 242 if( mean < LeftFastmin ) {
peterknoben 4:a79f9f3a9e40 243 if (countx <action){
peterknoben 3:f8d57796d69b 244 mean = getmean(n, input);
peterknoben 0:5f8dee4d4b09 245 if(mean < LeftFastmin){
peterknoben 4:a79f9f3a9e40 246 countx++;
peterknoben 0:5f8dee4d4b09 247 }
peterknoben 0:5f8dee4d4b09 248 else{
peterknoben 4:a79f9f3a9e40 249 countx=0;
peterknoben 0:5f8dee4d4b09 250 Number=0;
peterknoben 0:5f8dee4d4b09 251 }
peterknoben 0:5f8dee4d4b09 252 }
peterknoben 0:5f8dee4d4b09 253 else{
peterknoben 0:5f8dee4d4b09 254 Number = 0;
peterknoben 4:a79f9f3a9e40 255 countx=0;
peterknoben 0:5f8dee4d4b09 256 }
peterknoben 0:5f8dee4d4b09 257 }
peterknoben 0:5f8dee4d4b09 258 //Check second case
peterknoben 0:5f8dee4d4b09 259 else if(mean <= LeftFastmax and mean > LeftFastmin){
peterknoben 4:a79f9f3a9e40 260 if (countx <action){
peterknoben 3:f8d57796d69b 261 mean = getmean(n, input);
peterknoben 0:5f8dee4d4b09 262 if(mean <=LeftFastmax and mean>LeftFastmin){
peterknoben 4:a79f9f3a9e40 263 countx++;
peterknoben 0:5f8dee4d4b09 264 }
peterknoben 0:5f8dee4d4b09 265 else{
peterknoben 4:a79f9f3a9e40 266 countx=0;
peterknoben 0:5f8dee4d4b09 267 Number=0;
peterknoben 0:5f8dee4d4b09 268 }
peterknoben 0:5f8dee4d4b09 269 }
peterknoben 0:5f8dee4d4b09 270 else{
peterknoben 0:5f8dee4d4b09 271 Number = 1;
peterknoben 4:a79f9f3a9e40 272 countx=0;
peterknoben 0:5f8dee4d4b09 273 }
peterknoben 0:5f8dee4d4b09 274 }
peterknoben 0:5f8dee4d4b09 275 else if( mean <=LeftSlowmax and mean>LeftSlowmin) {
peterknoben 4:a79f9f3a9e40 276 if (countx <action){
peterknoben 3:f8d57796d69b 277 mean = getmean(n, input);
peterknoben 0:5f8dee4d4b09 278 if(mean <=LeftSlowmax and mean>LeftSlowmin){
peterknoben 4:a79f9f3a9e40 279 countx++;
peterknoben 0:5f8dee4d4b09 280 }
peterknoben 0:5f8dee4d4b09 281 else{
peterknoben 4:a79f9f3a9e40 282 countx=0;
peterknoben 0:5f8dee4d4b09 283 Number=0;
peterknoben 0:5f8dee4d4b09 284 }
peterknoben 0:5f8dee4d4b09 285 }
peterknoben 0:5f8dee4d4b09 286 else{
peterknoben 0:5f8dee4d4b09 287 Number = 2;
peterknoben 4:a79f9f3a9e40 288 countx=0;
peterknoben 0:5f8dee4d4b09 289 }
peterknoben 0:5f8dee4d4b09 290 }
peterknoben 0:5f8dee4d4b09 291 else if( mean <=RightSlowmax and mean>RightSlowmin) {
peterknoben 4:a79f9f3a9e40 292 if (countx <action){
peterknoben 3:f8d57796d69b 293 mean = getmean(n, input);
peterknoben 0:5f8dee4d4b09 294 if(mean <=RightSlowmax and mean>RightSlowmin){
peterknoben 4:a79f9f3a9e40 295 countx++;
peterknoben 0:5f8dee4d4b09 296 }
peterknoben 0:5f8dee4d4b09 297 else{
peterknoben 4:a79f9f3a9e40 298 countx=0;
peterknoben 0:5f8dee4d4b09 299 Number=0;
peterknoben 0:5f8dee4d4b09 300 }
peterknoben 0:5f8dee4d4b09 301 }
peterknoben 0:5f8dee4d4b09 302 else{
peterknoben 0:5f8dee4d4b09 303 Number = 3;
peterknoben 4:a79f9f3a9e40 304 countx=0;
peterknoben 0:5f8dee4d4b09 305 }
peterknoben 0:5f8dee4d4b09 306 }
peterknoben 0:5f8dee4d4b09 307 else if( mean <=RightFastmax and mean>RightFastmin ) {
peterknoben 4:a79f9f3a9e40 308 if (countx <action){
peterknoben 3:f8d57796d69b 309 mean = getmean(n, input);
peterknoben 0:5f8dee4d4b09 310 if(mean <=RightFastmax and mean>RightFastmin){
peterknoben 4:a79f9f3a9e40 311 countx++;
peterknoben 0:5f8dee4d4b09 312 }
peterknoben 0:5f8dee4d4b09 313 else{
peterknoben 4:a79f9f3a9e40 314 countx=0;
peterknoben 0:5f8dee4d4b09 315 Number=0;
peterknoben 0:5f8dee4d4b09 316 }
peterknoben 0:5f8dee4d4b09 317 }
peterknoben 0:5f8dee4d4b09 318 else{
peterknoben 0:5f8dee4d4b09 319 Number = 4;
peterknoben 4:a79f9f3a9e40 320 countx=0;
peterknoben 0:5f8dee4d4b09 321 }
peterknoben 0:5f8dee4d4b09 322 }
peterknoben 0:5f8dee4d4b09 323 else{
peterknoben 4:a79f9f3a9e40 324 countx=0;
peterknoben 0:5f8dee4d4b09 325 Number =0;
peterknoben 0:5f8dee4d4b09 326 }
peterknoben 0:5f8dee4d4b09 327 return Number;
peterknoben 4:a79f9f3a9e40 328 } */
peterknoben 0:5f8dee4d4b09 329
peterknoben 0:5f8dee4d4b09 330
peterknoben 1:15543c143a63 331 // In progress
peterknoben 4:a79f9f3a9e40 332 /*int SignalNumber::getmode(const int n, const int action, float input){
peterknoben 1:15543c143a63 333 int mode;
peterknoben 3:f8d57796d69b 334 mean = getmean(n, input);
peterknoben 1:15543c143a63 335 //Check first case
peterknoben 1:15543c143a63 336 if( mean < LeftFastmin ) {
peterknoben 4:a79f9f3a9e40 337 if (countx <action){
peterknoben 3:f8d57796d69b 338 mean = getmean(n, input);
peterknoben 1:15543c143a63 339 if(mean < LeftFastmin){
peterknoben 4:a79f9f3a9e40 340 countx++;
peterknoben 1:15543c143a63 341 }
peterknoben 1:15543c143a63 342 else{
peterknoben 4:a79f9f3a9e40 343 countx=0;
peterknoben 1:15543c143a63 344 Number=0;
peterknoben 1:15543c143a63 345 }
peterknoben 1:15543c143a63 346 }
peterknoben 1:15543c143a63 347 else{
peterknoben 1:15543c143a63 348 Number = 0;
peterknoben 4:a79f9f3a9e40 349 countx=0;
peterknoben 1:15543c143a63 350 }
peterknoben 1:15543c143a63 351 }
peterknoben 1:15543c143a63 352 return mode;
peterknoben 4:a79f9f3a9e40 353 }*/
peterknoben 1:15543c143a63 354
peterknoben 1:15543c143a63 355