diff --git a/order_site/server.py b/order_site/server.py index f532c51..bd6a385 100644 --- a/order_site/server.py +++ b/order_site/server.py @@ -19,8 +19,26 @@ def order(): candy3 = int(request.form['candy3']) candy4 = int(request.form['candy4']) print ("test {} {} {} {} ".format(candy1, candy2, candy3, candy4)) + params = [] + s = {} + s['img_idx'] = 0 + s['loaded'] = 0 + s['required'] = candy1 + test_candy_stat.append(s) + s['img_idx'] = 1 + s['loaded'] = 0 + s['required'] = candy2 + test_candy_stat.append(s) + s['img_idx'] = 2 + s['loaded'] = 0 + s['required'] = candy3 + test_candy_stat.append(s) + s['img_idx'] = 3 + s['loaded'] = 0 + s['required'] = candy4 + test_candy_stat.append(s) + s.new_order(params) return '{"status":"ok"}' - #s.new_order(params) if __name__ == '__main__': diff --git a/order_site/static/picker.js b/order_site/static/picker.js index 337e9ef..c17de50 100644 --- a/order_site/static/picker.js +++ b/order_site/static/picker.js @@ -1,36 +1,39 @@ + $(document).ready(function(){ var quantitiy=0; - $('.quantity-right-plus').click(function(e){ - - // Stop acting like a button - e.preventDefault(); - // Get the field name - var quantity = parseInt($('#quantity').val()); - - // If is not undefined - - $('#quantity').val(quantity + 1); - + $('.quantity-right-plus').click(function(e){ + + // Stop acting like a button + e.preventDefault(); + // Get the field name + var quantity = parseInt( $(this).parent().siblings('input').val() ) ; + + // If is not undefined - // Increment - - }); + // $('#quantity').val(quantity + 1); + + $(this).parent().siblings('input').val(quantity + 1) - $('.quantity-left-minus').click(function(e){ - // Stop acting like a button - e.preventDefault(); - // Get the field name - var quantity = parseInt($('#quantity').val()); - // If is not undefined + // Increment + + }); + + $('.quantity-left-minus').click(function(e){ + // Stop acting like a button + e.preventDefault(); + // Get the field name + var quantity = parseInt( $(this).parent().siblings('input').val() ) ; - // Increment - if(quantity>0){ - $('#quantity').val(quantity - 1); - } - }); + // If is not undefined + // Increment + if(quantity>0){ + $(this).parent().siblings('input').val(quantity - 1); + } + }); + }); function submitOrder(){ diff --git a/order_site/templates/index.html b/order_site/templates/index.html index 09395e5..f161699 100644 --- a/order_site/templates/index.html +++ b/order_site/templates/index.html @@ -2,6 +2,7 @@ + Alepa Twitch Grabs Candy @@ -13,7 +14,7 @@
-

Simple Quantity increment buttons with Javascript

+

Choose your sweets with a wicked system made out of an awesome humanless deployment process

Tasty treats
@@ -84,10 +85,10 @@
-
-
- -
+
+
+ +
diff --git a/scale/bag-holder.stl b/scale/bag-holder.stl new file mode 100644 index 0000000..218fccc Binary files /dev/null and b/scale/bag-holder.stl differ diff --git a/scale/scale-holder.stl b/scale/scale-holder.stl new file mode 100644 index 0000000..158d52b Binary files /dev/null and b/scale/scale-holder.stl differ diff --git a/scale/scale.ino b/scale/scale.ino index 8d90c47..0eeb557 100644 --- a/scale/scale.ino +++ b/scale/scale.ino @@ -4,48 +4,48 @@ HX711 scale; void setup() { - Serial.begin(38400); - Serial.println("HX711 Demo"); + Serial.begin(115200); + //Serial.println("HX711 Demo"); - Serial.println("Initializing the scale"); + //Serial.println("Initializing the scale"); // parameter "gain" is ommited; the default value 128 is used by the library // HX711.DOUT - pin #A1 // HX711.PD_SCK - pin #A0 scale.begin(2, 3); - Serial.println("Before setting up the scale:"); - Serial.print("read: \t\t"); - Serial.println(scale.read()); // print a raw reading from the ADC + //Serial.println("Before setting up the scale:"); + //Serial.print("read: \t\t"); + //Serial.println(scale.read()); // print a raw reading from the ADC - Serial.print("read average: \t\t"); - Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC + //Serial.print("read average: \t\t"); + //Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC - Serial.print("get value: \t\t"); - Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet) + //Serial.print("get value: \t\t"); + //Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet) - Serial.print("get units: \t\t"); - Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided + //Serial.print("get units: \t\t"); + //Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided // by the SCALE parameter (not set yet) scale.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details scale.tare(); // reset the scale to 0 - Serial.println("After setting up the scale:"); + //Serial.println("After setting up the scale:"); - Serial.print("read: \t\t"); - Serial.println(scale.read()); // print a raw reading from the ADC + //Serial.print("read: \t\t"); + //Serial.println(scale.read()); // print a raw reading from the ADC - Serial.print("read average: \t\t"); - Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC + //Serial.print("read average: \t\t"); + //Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC - Serial.print("get value: \t\t"); - Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare() + //Serial.print("get value: \t\t"); + //Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare() - Serial.print("get units: \t\t"); - Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided + //Serial.print("get units: \t\t"); + //Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided // by the SCALE parameter set with set_scale - Serial.println("Readings:"); + //Serial.println("Readings:"); } void loop() { @@ -53,10 +53,11 @@ void loop() { //Serial.print(scale.get_units(), 1); //Serial.print("\t| average:\t"); if (Serial.available() > 0) { - Serial.println(scale.get_units(10), 1); + Serial.read(); + Serial.println(scale.get_units(), 1); - scale.power_down(); // put the ADC in sleep mode - delay(100); - scale.power_up(); + //scale.power_down(); // put the ADC in sleep mode + //delay(100); + //scale.power_up(); } } diff --git a/stream/stest.py b/stream/stest.py index 7fcd7d3..bea115a 100644 --- a/stream/stest.py +++ b/stream/stest.py @@ -1,10 +1,12 @@ import cv2 import time +import serial from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler from threading import Thread +import numpy as np -cap = cv2.VideoCapture(0) +cap = cv2.VideoCapture(-1) font = cv2.FONT_HERSHEY_SIMPLEX list_img = cv2.imread('list.jpg') list_img = cv2.resize(list_img,None,fx=0.8, fy=0.8, interpolation = cv2.INTER_CUBIC) @@ -28,30 +30,41 @@ IMG_H = 720 rect_w = 220 rect_h = 52 -test_candy_stat = [] -s = {} -s['img_idx'] = 0 -s['loaded'] = 0 -s['required'] = 4 -test_candy_stat.append(s) -s = {} -s['img_idx'] = 1 -s['loaded'] = 2 -s['required'] = 2 -test_candy_stat.append(s) -s = {} -s['img_idx'] = 2 -s['loaded'] = 1 -s['required'] = 6 -test_candy_stat.append(s) -s = {} -s['img_idx'] = 3 -s['loaded'] = 6 -s['required'] = 9 -test_candy_stat.append(s) +weights_list = [37.0, 4.8, 8.8, 2.5] + +ARDUPORT = 'COM12' +serial = serial.Serial(ARDUPORT, 115200, timeout=1) + +candy_stat = [] +# s = {} +# s['img_idx'] = 0 +# s['loaded'] = 0 +# s['required'] = 4 +# candy_stat.append(s) +# s = {} +# s['img_idx'] = 1 +# s['loaded'] = 0 +# s['required'] = 2 +# candy_stat.append(s) +# s = {} +# s['img_idx'] = 2 +# s['loaded'] = 0 +# s['required'] = 6 +# candy_stat.append(s) +# s = {} +# s['img_idx'] = 3 +# s['loaded'] = 0 +# s['required'] = 9 +# candy_stat.append(s) + +previous_weight = 0 def new_order(params): - pass + global candy_stat + print ('Got order ') + print(params) + candy_stat = params + return True def async_server_megahack(server): server.serve_forever() @@ -60,6 +73,33 @@ def async_server_megahack(server): class RequestHandler(SimpleXMLRPCRequestHandler): rpc_paths = ('/RPC2',) +def check_endgame(params): + for s in candy_stat: + if s['required'] != s['loaded']: + return False + return True +def is_equal_with_tolerance(v1, v2, t): + return (v2 * (1-t) < v1) and (v2 * (1+t) > v1) + +did_change = False +def check_weights(params, new_weight): + global previous_weight, did_change + weight_diff = new_weight - previous_weight + if weight_diff < 0.3: + return + elif not did_change: + did_change = True + else: + for i in range(4): + if is_equal_with_tolerance(weight_diff, weights_list[i], 0.1): + params[i]['loaded'] += 1 + previous_weight = new_weight + did_change = False + break + if did_change: + did_change = False + previous_weight = new_weight + def draw_rectangles(img, n): for i in range(n): cv2.rectangle(img, (IMG_W - 5 - rect_w,5 + (rect_h + 5)*i), (IMG_W - 5, 5 + (rect_h + 5)*i + rect_h), (255, 255, 255), -1) @@ -68,9 +108,9 @@ def print_stats(img, stats): # draw_rectangles(img, len(stats)) img[0:list_img.shape[0], IMG_W-list_img.shape[1]:IMG_W, :] = list_img[:] for i in range(len(stats)): - cv2.putText(frame,str(stats[i]['loaded']),(IMG_W - 130,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) - cv2.putText(frame,"/",(IMG_W - 90,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) - cv2.putText(frame,str(stats[i]['required']),(IMG_W - 50,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) + cv2.putText(img,str(stats[i]['loaded']),(IMG_W - 130,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) + cv2.putText(img,"/",(IMG_W - 90,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) + cv2.putText(img,str(stats[i]['required']),(IMG_W - 50,188 + i * (rect_h + 5)), font, 1.3,(0, 0, 0),2,cv2.LINE_AA) img[150+(rect_h + 5)*i:150+(rect_h + 5)*i + target_w, IMG_W-130-target_w-20:IMG_W-130-20, :] = img_list[stats[i]['img_idx']][:] cv2.namedWindow("window", cv2.WND_PROP_FULLSCREEN) @@ -79,19 +119,36 @@ with SimpleXMLRPCServer(('localhost', 8000), requestHandler=RequestHandler) as server: server.register_introspection_functions() - # Register pow() function; this will use the value of - # pow.__name__ as the name, which is just 'pow'. server.register_function(new_order) - # Run the server's main loop t = Thread(target=async_server_megahack, args=(server,)) t.start() + # serial.write(b'e') + # line = serial.readline()[:-2] + # print (line) + # weight = -float(line) + # previous_weight = weight + frame_counter = 0 + weight = 0 + canvas = np.zeros((720, 1280, 3)).astype(np.uint8) while True: + + frame_counter += 1 + if frame_counter == 75: + serial.write(b'e') + weight = -float(serial.readline()[:-2]) + frame_counter = 0 + print(weight) + check_weights(candy_stat, weight) + if check_endgame(candy_stat): + candy_stat = [] + # TODO: do funny gif ret, frame = cap.read() - frame = cv2.resize(frame,None,fx=2, fy=1.5, interpolation = cv2.INTER_CUBIC) - print_stats(frame, test_candy_stat) - print(frame.shape) - cv2.imshow("window", frame) + frame = cv2.resize(frame,None,fx=1.5, fy=1.5, interpolation = cv2.INTER_CUBIC) + canvas[0:720, 0:960, :] = frame[:] + if (len(candy_stat) > 0): + print_stats(canvas, candy_stat) + cv2.imshow("window", canvas) if cv2.waitKey(1) & 0xFF == ord('q'): break