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 @@
-
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