A collection of Analog Devices drivers for the mbed platform

For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all

Committer:
Adrian Suciu
Date:
Mon Nov 07 16:27:12 2016 +0200
Revision:
33:c3ec596a29c2
Added CN0391, CN0396 and CN0397 shields

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Adrian Suciu 33:c3ec596a29c2 1 def isFloat(string):
Adrian Suciu 33:c3ec596a29c2 2 try:
Adrian Suciu 33:c3ec596a29c2 3 float(string)
Adrian Suciu 33:c3ec596a29c2 4 return True
Adrian Suciu 33:c3ec596a29c2 5 except ValueError:
Adrian Suciu 33:c3ec596a29c2 6 return False
Adrian Suciu 33:c3ec596a29c2 7
Adrian Suciu 33:c3ec596a29c2 8 with open("thermocouple.cpp","w") as out:
Adrian Suciu 33:c3ec596a29c2 9 with open("Thermocouple_core_cpp.txt","r") as inp:
Adrian Suciu 33:c3ec596a29c2 10 out.write(inp.read())
Adrian Suciu 33:c3ec596a29c2 11 out.write("\n\n\n")
Adrian Suciu 33:c3ec596a29c2 12 pass
Adrian Suciu 33:c3ec596a29c2 13
Adrian Suciu 33:c3ec596a29c2 14 with open("thermocouple.h","w") as out:
Adrian Suciu 33:c3ec596a29c2 15 with open("Thermocouple_core_h.txt", "r") as inp:
Adrian Suciu 33:c3ec596a29c2 16 out.write(inp.read())
Adrian Suciu 33:c3ec596a29c2 17 out.write("\n\n\n")
Adrian Suciu 33:c3ec596a29c2 18 pass
Adrian Suciu 33:c3ec596a29c2 19
Adrian Suciu 33:c3ec596a29c2 20 with open("thermocouple_lut.cpp","w") as out:
Adrian Suciu 33:c3ec596a29c2 21 with open("Thermocouple_lut_core_cpp.txt","r") as inp:
Adrian Suciu 33:c3ec596a29c2 22 out.write(inp.read())
Adrian Suciu 33:c3ec596a29c2 23 out.write("\n\n\n")
Adrian Suciu 33:c3ec596a29c2 24 pass
Adrian Suciu 33:c3ec596a29c2 25
Adrian Suciu 33:c3ec596a29c2 26 with open('tc.txt', 'r') as myfile:
Adrian Suciu 33:c3ec596a29c2 27 initstr=myfile.read().replace('\n', ' ')
Adrian Suciu 33:c3ec596a29c2 28
Adrian Suciu 33:c3ec596a29c2 29
Adrian Suciu 33:c3ec596a29c2 30 #print(initstr.split());
Adrian Suciu 33:c3ec596a29c2 31 splitted = initstr.split();
Adrian Suciu 33:c3ec596a29c2 32
Adrian Suciu 33:c3ec596a29c2 33 while splitted:
Adrian Suciu 33:c3ec596a29c2 34 i=0
Adrian Suciu 33:c3ec596a29c2 35
Adrian Suciu 33:c3ec596a29c2 36 for word in splitted:
Adrian Suciu 33:c3ec596a29c2 37 if(word == 'type'):
Adrian Suciu 33:c3ec596a29c2 38 break
Adrian Suciu 33:c3ec596a29c2 39 i=i+1
Adrian Suciu 33:c3ec596a29c2 40 del splitted[:i+1]
Adrian Suciu 33:c3ec596a29c2 41 if not splitted:
Adrian Suciu 33:c3ec596a29c2 42 break
Adrian Suciu 33:c3ec596a29c2 43 tctype = splitted[0][0].lower()
Adrian Suciu 33:c3ec596a29c2 44
Adrian Suciu 33:c3ec596a29c2 45 class_name = "Thermocouple_Type_" + tctype.capitalize()
Adrian Suciu 33:c3ec596a29c2 46 lut_def_name = "TYPE_" + tctype.capitalize() + "_LUT"
Adrian Suciu 33:c3ec596a29c2 47 print(lut_def_name)
Adrian Suciu 33:c3ec596a29c2 48
Adrian Suciu 33:c3ec596a29c2 49 i=0
Adrian Suciu 33:c3ec596a29c2 50 state=0
Adrian Suciu 33:c3ec596a29c2 51 lut = []
Adrian Suciu 33:c3ec596a29c2 52 for word in splitted:
Adrian Suciu 33:c3ec596a29c2 53 if(word=="************************************"):
Adrian Suciu 33:c3ec596a29c2 54 break
Adrian Suciu 33:c3ec596a29c2 55 if(word=="mV"):
Adrian Suciu 33:c3ec596a29c2 56 state = 1
Adrian Suciu 33:c3ec596a29c2 57 continue
Adrian Suciu 33:c3ec596a29c2 58 if(state == 1 and isFloat(word)):
Adrian Suciu 33:c3ec596a29c2 59 lut.append(word)
Adrian Suciu 33:c3ec596a29c2 60 else:
Adrian Suciu 33:c3ec596a29c2 61 state=0
Adrian Suciu 33:c3ec596a29c2 62 i=i+1
Adrian Suciu 33:c3ec596a29c2 63 print(lut)
Adrian Suciu 33:c3ec596a29c2 64 del splitted[:i]
Adrian Suciu 33:c3ec596a29c2 65 i=0
Adrian Suciu 33:c3ec596a29c2 66
Adrian Suciu 33:c3ec596a29c2 67 globaloffset = lut[0]
Adrian Suciu 33:c3ec596a29c2 68
Adrian Suciu 33:c3ec596a29c2 69 if(float(lut[0]) == float(lut[2])-10):
Adrian Suciu 33:c3ec596a29c2 70 del lut[:3]
Adrian Suciu 33:c3ec596a29c2 71 else:
Adrian Suciu 33:c3ec596a29c2 72 del lut[0]
Adrian Suciu 33:c3ec596a29c2 73
Adrian Suciu 33:c3ec596a29c2 74 j=0
Adrian Suciu 33:c3ec596a29c2 75 print lut
Adrian Suciu 33:c3ec596a29c2 76 lutfloat=[]
Adrian Suciu 33:c3ec596a29c2 77 for val in lut:
Adrian Suciu 33:c3ec596a29c2 78 b=1
Adrian Suciu 33:c3ec596a29c2 79 if(i%11==0):
Adrian Suciu 33:c3ec596a29c2 80 #print "11 " + val
Adrian Suciu 33:c3ec596a29c2 81 b=0
Adrian Suciu 33:c3ec596a29c2 82 if(i%12==0):
Adrian Suciu 33:c3ec596a29c2 83 #print "12 "+ val
Adrian Suciu 33:c3ec596a29c2 84 i=0
Adrian Suciu 33:c3ec596a29c2 85 b=0
Adrian Suciu 33:c3ec596a29c2 86 i=i+1
Adrian Suciu 33:c3ec596a29c2 87 j=j+1
Adrian Suciu 33:c3ec596a29c2 88 if(b):
Adrian Suciu 33:c3ec596a29c2 89 lutfloat.append(float(val))
Adrian Suciu 33:c3ec596a29c2 90
Adrian Suciu 33:c3ec596a29c2 91
Adrian Suciu 33:c3ec596a29c2 92 #print "unsorted"
Adrian Suciu 33:c3ec596a29c2 93 #print lutfloat
Adrian Suciu 33:c3ec596a29c2 94 lutfloat.sort()
Adrian Suciu 33:c3ec596a29c2 95 #print "sorted"
Adrian Suciu 33:c3ec596a29c2 96 #print lutfloat
Adrian Suciu 33:c3ec596a29c2 97 i=0
Adrian Suciu 33:c3ec596a29c2 98 with open("thermocouple_lut.cpp", "a") as out:
Adrian Suciu 33:c3ec596a29c2 99 out.write("#ifdef "+lut_def_name+"\n")
Adrian Suciu 33:c3ec596a29c2 100 out.write("const int16_t " + class_name + "::lut_offset = " + str(globaloffset)+";\n")
Adrian Suciu 33:c3ec596a29c2 101 out.write("const uint16_t " + class_name + "::lut_size = " + str(len(lutfloat))+";\n")
Adrian Suciu 33:c3ec596a29c2 102 out.write("const int32_t "+class_name+"::lut["+str(len(lutfloat))+"] = {\n")
Adrian Suciu 33:c3ec596a29c2 103 for val in lutfloat:
Adrian Suciu 33:c3ec596a29c2 104 out.write(str(int(val*1000)).rjust(8)+ ", ")
Adrian Suciu 33:c3ec596a29c2 105 i=i+1
Adrian Suciu 33:c3ec596a29c2 106 if(i==10):
Adrian Suciu 33:c3ec596a29c2 107 out.write("\n")
Adrian Suciu 33:c3ec596a29c2 108 i=0
Adrian Suciu 33:c3ec596a29c2 109 out.write("};\n")
Adrian Suciu 33:c3ec596a29c2 110 out.write("#endif\n\n")
Adrian Suciu 33:c3ec596a29c2 111 i=0
Adrian Suciu 33:c3ec596a29c2 112
Adrian Suciu 33:c3ec596a29c2 113 ranger = []
Adrian Suciu 33:c3ec596a29c2 114 values = []
Adrian Suciu 33:c3ec596a29c2 115 exp=[]
Adrian Suciu 33:c3ec596a29c2 116 ranger_index = -1 #HACK HACK HACK
Adrian Suciu 33:c3ec596a29c2 117
Adrian Suciu 33:c3ec596a29c2 118 while(splitted[0] != '************************************'):
Adrian Suciu 33:c3ec596a29c2 119 for word in splitted:
Adrian Suciu 33:c3ec596a29c2 120 if(word=='range:'):
Adrian Suciu 33:c3ec596a29c2 121 ranger.append([])
Adrian Suciu 33:c3ec596a29c2 122 values.append([])
Adrian Suciu 33:c3ec596a29c2 123 ranger_index=ranger_index+1
Adrian Suciu 33:c3ec596a29c2 124 break
Adrian Suciu 33:c3ec596a29c2 125 if(word=='exponential:'):
Adrian Suciu 33:c3ec596a29c2 126 exp.append(splitted[i+3])
Adrian Suciu 33:c3ec596a29c2 127 exp.append(splitted[i+6])
Adrian Suciu 33:c3ec596a29c2 128 exp.append(splitted[i+9])
Adrian Suciu 33:c3ec596a29c2 129 i=i+10
Adrian Suciu 33:c3ec596a29c2 130 print exp
Adrian Suciu 33:c3ec596a29c2 131 break
Adrian Suciu 33:c3ec596a29c2 132 i=i+1
Adrian Suciu 33:c3ec596a29c2 133 if(word=='exponential:'):
Adrian Suciu 33:c3ec596a29c2 134 print("exponential")
Adrian Suciu 33:c3ec596a29c2 135 del splitted[:i + 1]
Adrian Suciu 33:c3ec596a29c2 136 i=0
Adrian Suciu 33:c3ec596a29c2 137 break
Adrian Suciu 33:c3ec596a29c2 138 del splitted[:i+1]
Adrian Suciu 33:c3ec596a29c2 139 print splitted
Adrian Suciu 33:c3ec596a29c2 140 i=0
Adrian Suciu 33:c3ec596a29c2 141
Adrian Suciu 33:c3ec596a29c2 142 ranger[ranger_index].append(splitted[0])
Adrian Suciu 33:c3ec596a29c2 143 ranger[ranger_index].append(splitted[1])
Adrian Suciu 33:c3ec596a29c2 144 nr_of_coef = int(splitted[2])+1
Adrian Suciu 33:c3ec596a29c2 145 del splitted[:3]
Adrian Suciu 33:c3ec596a29c2 146 for i in range(nr_of_coef):
Adrian Suciu 33:c3ec596a29c2 147 values[ranger_index].append(splitted[i])
Adrian Suciu 33:c3ec596a29c2 148 del splitted[:nr_of_coef]
Adrian Suciu 33:c3ec596a29c2 149 print ranger
Adrian Suciu 33:c3ec596a29c2 150 print values
Adrian Suciu 33:c3ec596a29c2 151 i=0
Adrian Suciu 33:c3ec596a29c2 152
Adrian Suciu 33:c3ec596a29c2 153 with open("Thermocouple.h", "a") as out:
Adrian Suciu 33:c3ec596a29c2 154 poly_size = str(len(ranger))
Adrian Suciu 33:c3ec596a29c2 155
Adrian Suciu 33:c3ec596a29c2 156 out.write("class " + class_name + " : public Thermocouple\n{")
Adrian Suciu 33:c3ec596a29c2 157 out.write("\npublic:\n\t~" + class_name +"();")
Adrian Suciu 33:c3ec596a29c2 158 out.write("\n\tstatic const thermocouple_poly_subrange inv_poly[" + poly_size + "];\n")
Adrian Suciu 33:c3ec596a29c2 159 out.write("\tstatic const int inv_poly_size;\n\tfloat convert_inv(float temp);\n\n")
Adrian Suciu 33:c3ec596a29c2 160
Adrian Suciu 33:c3ec596a29c2 161 with open("Thermocouple.cpp", "a") as out:
Adrian Suciu 33:c3ec596a29c2 162
Adrian Suciu 33:c3ec596a29c2 163 out.write("const int " + class_name + "::inv_poly_size = " + str(len(ranger)) + ";\n")
Adrian Suciu 33:c3ec596a29c2 164 out.write("const Thermocouple::thermocouple_poly_subrange " + class_name + "::inv_poly[" + poly_size + "] =\n{\n")
Adrian Suciu 33:c3ec596a29c2 165 for ran in ranger:
Adrian Suciu 33:c3ec596a29c2 166 poly = []
Adrian Suciu 33:c3ec596a29c2 167 power = []
Adrian Suciu 33:c3ec596a29c2 168 for val in values[i]:
Adrian Suciu 33:c3ec596a29c2 169 a = val.split("E")
Adrian Suciu 33:c3ec596a29c2 170 poly.append(a[0])
Adrian Suciu 33:c3ec596a29c2 171 power.append(int(a[1]))
Adrian Suciu 33:c3ec596a29c2 172 print(poly)
Adrian Suciu 33:c3ec596a29c2 173 print(power)
Adrian Suciu 33:c3ec596a29c2 174 out.write("\t{")
Adrian Suciu 33:c3ec596a29c2 175 for r in ran:
Adrian Suciu 33:c3ec596a29c2 176 out.write(r.rjust(11))
Adrian Suciu 33:c3ec596a29c2 177 out.write("// characteristic curve for temp range between " + ran[0] + " and " + ran[1] + "\n\t{")
Adrian Suciu 33:c3ec596a29c2 178 for p in poly:
Adrian Suciu 33:c3ec596a29c2 179 out.write(str(p).rjust(11) + ",")
Adrian Suciu 33:c3ec596a29c2 180 out.write("},\n")
Adrian Suciu 33:c3ec596a29c2 181 out.write("\t{")
Adrian Suciu 33:c3ec596a29c2 182 for p in power:
Adrian Suciu 33:c3ec596a29c2 183 # print(p)
Adrian Suciu 33:c3ec596a29c2 184 out.write(str(p).rjust(11) + ",")
Adrian Suciu 33:c3ec596a29c2 185 out.write("},\n\t")
Adrian Suciu 33:c3ec596a29c2 186 out.write(str(len(poly)))
Adrian Suciu 33:c3ec596a29c2 187 out.write(" }")
Adrian Suciu 33:c3ec596a29c2 188
Adrian Suciu 33:c3ec596a29c2 189 poly = []
Adrian Suciu 33:c3ec596a29c2 190 power = []
Adrian Suciu 33:c3ec596a29c2 191 i = i + 1
Adrian Suciu 33:c3ec596a29c2 192 if i != len(ranger):
Adrian Suciu 33:c3ec596a29c2 193 out.write(",")
Adrian Suciu 33:c3ec596a29c2 194 out.write("\n")
Adrian Suciu 33:c3ec596a29c2 195 out.write("};\n")
Adrian Suciu 33:c3ec596a29c2 196
Adrian Suciu 33:c3ec596a29c2 197 out.write(
Adrian Suciu 33:c3ec596a29c2 198 "\nfloat " + class_name + "::convert_inv(float temp)\n{\n\treturn Thermocouple::convert(temp, inv_poly, inv_poly_size);\n}\n")
Adrian Suciu 33:c3ec596a29c2 199 out.write(
Adrian Suciu 33:c3ec596a29c2 200 "\nfloat " + class_name + "::lookup_inv(float temp)\n{""\n#ifdef " + lut_def_name + "\n\tif((temp+lut_offset)>lut_size)\n\t\treturn lut[lut_size-1];\n\telse\n\t\treturn lut[(uint16_t)temp+lut_offset];\n#else\n\t/* NOT IMPLEMENTED */\n\treturn 0;\n#endif\n}\n")
Adrian Suciu 33:c3ec596a29c2 201
Adrian Suciu 33:c3ec596a29c2 202 i=0
Adrian Suciu 33:c3ec596a29c2 203
Adrian Suciu 33:c3ec596a29c2 204 for word in splitted:
Adrian Suciu 33:c3ec596a29c2 205 if(word == 'Voltage' and splitted[i-1] != "Temperature"):
Adrian Suciu 33:c3ec596a29c2 206 break
Adrian Suciu 33:c3ec596a29c2 207 i=i+1
Adrian Suciu 33:c3ec596a29c2 208
Adrian Suciu 33:c3ec596a29c2 209 del splitted[:i+1]
Adrian Suciu 33:c3ec596a29c2 210 i=0
Adrian Suciu 33:c3ec596a29c2 211 #print(splitted)
Adrian Suciu 33:c3ec596a29c2 212 ranger = []
Adrian Suciu 33:c3ec596a29c2 213 values = []
Adrian Suciu 33:c3ec596a29c2 214 for word in splitted:
Adrian Suciu 33:c3ec596a29c2 215
Adrian Suciu 33:c3ec596a29c2 216 if(word == 'Range:'):
Adrian Suciu 33:c3ec596a29c2 217 break
Adrian Suciu 33:c3ec596a29c2 218 ranger.append([word])
Adrian Suciu 33:c3ec596a29c2 219 #print(i)
Adrian Suciu 33:c3ec596a29c2 220 i = i + 1
Adrian Suciu 33:c3ec596a29c2 221
Adrian Suciu 33:c3ec596a29c2 222 del splitted[:i+1]
Adrian Suciu 33:c3ec596a29c2 223 for j in range(i):
Adrian Suciu 33:c3ec596a29c2 224 ranger[j].append(splitted[j])
Adrian Suciu 33:c3ec596a29c2 225 values.append([])
Adrian Suciu 33:c3ec596a29c2 226 del splitted[:i]
Adrian Suciu 33:c3ec596a29c2 227 #print(values)
Adrian Suciu 33:c3ec596a29c2 228
Adrian Suciu 33:c3ec596a29c2 229 i=0
Adrian Suciu 33:c3ec596a29c2 230 for word in splitted:
Adrian Suciu 33:c3ec596a29c2 231 if(word == "Error"):
Adrian Suciu 33:c3ec596a29c2 232 break
Adrian Suciu 33:c3ec596a29c2 233 values[i%len(ranger)].append(word)
Adrian Suciu 33:c3ec596a29c2 234 i=i+1
Adrian Suciu 33:c3ec596a29c2 235
Adrian Suciu 33:c3ec596a29c2 236
Adrian Suciu 33:c3ec596a29c2 237 poly=[]
Adrian Suciu 33:c3ec596a29c2 238 power = []
Adrian Suciu 33:c3ec596a29c2 239 i=0
Adrian Suciu 33:c3ec596a29c2 240
Adrian Suciu 33:c3ec596a29c2 241 with open("Thermocouple.h","a") as out:
Adrian Suciu 33:c3ec596a29c2 242 poly_size = str(len(ranger))
Adrian Suciu 33:c3ec596a29c2 243
Adrian Suciu 33:c3ec596a29c2 244 out.write("\tstatic const thermocouple_poly_subrange poly["+poly_size+"];\n")
Adrian Suciu 33:c3ec596a29c2 245 out.write("\tstatic const int poly_size;\n\tfloat convert(float voltage);\n")
Adrian Suciu 33:c3ec596a29c2 246 out.write("#ifdef "+lut_def_name+"\n")
Adrian Suciu 33:c3ec596a29c2 247 out.write("\tstatic const int32_t lut[];\n\tstatic const int16_t lut_offset;\n\tstatic const uint16_t lut_size;\n\tfloat lookup(float voltage);\n\tfloat lookup_inv(float temp);\n#endif\n};\n\n\n")
Adrian Suciu 33:c3ec596a29c2 248
Adrian Suciu 33:c3ec596a29c2 249
Adrian Suciu 33:c3ec596a29c2 250 with open("Thermocouple.cpp","a") as out:
Adrian Suciu 33:c3ec596a29c2 251
Adrian Suciu 33:c3ec596a29c2 252 out.write("const int "+ class_name + "::poly_size = "+str(len(ranger))+";\n")
Adrian Suciu 33:c3ec596a29c2 253 out.write("const Thermocouple::thermocouple_poly_subrange "+ class_name+ "::poly["+poly_size+"] =\n{\n")
Adrian Suciu 33:c3ec596a29c2 254 for ran in ranger:
Adrian Suciu 33:c3ec596a29c2 255 for val in values[i]:
Adrian Suciu 33:c3ec596a29c2 256 a=val.split("E")
Adrian Suciu 33:c3ec596a29c2 257 poly.append(a[0])
Adrian Suciu 33:c3ec596a29c2 258 power.append(int(a[1]))
Adrian Suciu 33:c3ec596a29c2 259 print(poly)
Adrian Suciu 33:c3ec596a29c2 260 print(power)
Adrian Suciu 33:c3ec596a29c2 261 out.write("\t{")
Adrian Suciu 33:c3ec596a29c2 262 for r in ran:
Adrian Suciu 33:c3ec596a29c2 263 out.write(r.rjust(11) +", ")
Adrian Suciu 33:c3ec596a29c2 264 out.write("// characteristic curve for mV range between " + ran[0] +" and "+ ran[1]+ "\n\t{")
Adrian Suciu 33:c3ec596a29c2 265 for p in poly:
Adrian Suciu 33:c3ec596a29c2 266 out.write(str(p).rjust(11) + ",")
Adrian Suciu 33:c3ec596a29c2 267 out.write("},\n")
Adrian Suciu 33:c3ec596a29c2 268 out.write("\t{")
Adrian Suciu 33:c3ec596a29c2 269 for p in power:
Adrian Suciu 33:c3ec596a29c2 270 # print(p)
Adrian Suciu 33:c3ec596a29c2 271 out.write(str(p).rjust(11) + ",")
Adrian Suciu 33:c3ec596a29c2 272 out.write("},\n\t")
Adrian Suciu 33:c3ec596a29c2 273 out.write(str(len(poly)))
Adrian Suciu 33:c3ec596a29c2 274 out.write(" }")
Adrian Suciu 33:c3ec596a29c2 275
Adrian Suciu 33:c3ec596a29c2 276 poly = []
Adrian Suciu 33:c3ec596a29c2 277 power = []
Adrian Suciu 33:c3ec596a29c2 278 i=i+1
Adrian Suciu 33:c3ec596a29c2 279 if i!=len(ranger):
Adrian Suciu 33:c3ec596a29c2 280 out.write(",")
Adrian Suciu 33:c3ec596a29c2 281 out.write("\n")
Adrian Suciu 33:c3ec596a29c2 282 out.write("};\n")
Adrian Suciu 33:c3ec596a29c2 283 out.write("\n" + class_name + "::~"+class_name+"()\n{\n\n}\n")
Adrian Suciu 33:c3ec596a29c2 284 out.write("\nfloat "+ class_name +"::convert(float voltage)\n{\n\treturn Thermocouple::convert(voltage, poly, poly_size);\n}\n")
Adrian Suciu 33:c3ec596a29c2 285 out.write("\nfloat "+class_name+"::lookup(float voltage)\n{""\n#ifdef "+lut_def_name+"\n\treturn Thermocouple::lookup(lut, voltage, lut_size, lut_offset);\n#else\n\t/* NOT IMPLEMENTED */\n\treturn 0;\n#endif\n}\n")
Adrian Suciu 33:c3ec596a29c2 286
Adrian Suciu 33:c3ec596a29c2 287 with open("Thermocouple.h", "a") as out:
Adrian Suciu 33:c3ec596a29c2 288 out.write("\n#endif\n")
Adrian Suciu 33:c3ec596a29c2 289
Adrian Suciu 33:c3ec596a29c2 290
Adrian Suciu 33:c3ec596a29c2 291
Adrian Suciu 33:c3ec596a29c2 292
Adrian Suciu 33:c3ec596a29c2 293
Adrian Suciu 33:c3ec596a29c2 294 #print(ranger)
Adrian Suciu 33:c3ec596a29c2 295 #print(values)
Adrian Suciu 33:c3ec596a29c2 296
Adrian Suciu 33:c3ec596a29c2 297
Adrian Suciu 33:c3ec596a29c2 298
Adrian Suciu 33:c3ec596a29c2 299
Adrian Suciu 33:c3ec596a29c2 300